Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > .NET
Перезагрузить страницу Как убить массивы указателей
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Hum Hum вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.02.2007
Angry Как убить массивы указателей - 27.04.2007, 21:38

Начал работать в .Net 2003, создаю проект .Net Windows Forms Application.
Очень понравилось, что как в билдере можно легко добавлять элементы управления на форму и код к ним, но потребовалось мне добавить TreeViev, и я понял, что не все так гладко.

для хранения элементов дерева и его структуры у меня используется список(табличка) вида:
id | Father | Text
1 | 0 | первый Вася
2 | 1 | внутри первого 1 (Коля)
3 | 0 | Второй Петя
4 | 3 | Внутри второго 1

и т.д., т.е. принцип, когда каждый потомок знает о своем отце.

Мне казалось логичным( от практики программирования С++) , что при создании дерева надо, обходить всех потомков, сохраняя индекс родителя и указательтель на родительский узел (Node) в стек.

Большим удивлением было для меня то, что std::stack<TreeNodeCollection*> MyStack; Не может сработать, от того, что неизвестен размер __gc *. (sizeof нельзя взять от типа с квалификатором __gc*)

Ну думаю фигня, буду хранить System::void *, а при помощи дерективы asm буду вытаскивать и переприсваивать значение указателя.
Код:
System::void * ppp;
TreeNodeCollection * LastNode;
std::stack<System::void *> MyStack;

...

ppp = MyStack.top();

_asm{    // mov LastNode, ppp   - нельзя надо промежуточно использовать регистр
push ebx     // сохранить значение регистра что было до нашей дерективы asm
mov ebx,ppp      //  сохранить в регистр
mov LastNode,ebx  // сохранить в переменную
pop ebx                       // вернуть регистр как было
}

// И дальше использовать как надо
Но оказывается деректива _asm делает из managed-функции unmanaded-функцию, а в них нельзя использовать любые __gc типы (Запрещено компилятором).

отказался я от _asm

Думаю создам я тогда указателей по числу строк моей таблички

Код:
TreeNodeCollection ** KK=        new TreeNodeCollection*[4];
но не работает, не может чего-то превратить __gc* __gc[]* в __gc* __gc*

Подскажите, что делать?
Задачку с деревом я как - нибудь решу, но главный вопрос меня мучаеет: неужели нельзя создавать массив указателей на обьекты которые описаны квалификатором __gc (garbage collector) и/или закидывать указатели на обьекты формы в стек?
Может есть какой- нибудь трюк? я не совсем разобрался с __pin указалелями.
Ответить с цитированием
  (#2 (permalink)) Старый
pEtr0 pEtr0 вне форума
Member
 
Сообщений: 70
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.02.2006
По умолчанию 28.04.2007, 12:07

Цитата:
... но главный вопрос меня мучаеет: неужели нельзя создавать массив указателей на обьекты которые описаны квалификатором __gc (garbage collector) и/или закидывать указатели на обьекты формы в стек?
Объект класса с квалификатором __gc, будет располагаться в управляемой куче, в которой периодически происходит автоматическая сборка мусора и дефрагментация памяти. Т.е. физически твой объект может быть в любое время перемещен в другую область памяти, поэтому указатель на него не имеет никакого смысла. Но есть ключевое слово __pin, которое позволяет закрепить объект в памяти и использовать классический указатель на него. Но им не желательно пользоваться ибо это замедлят сборку мусора.

Вообще для __gc классов лучше пользоваться контейнерами из System.Collections.
Ответить с цитированием
  (#3 (permalink)) Старый
Hum Hum вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.02.2007
По умолчанию 19.05.2007, 17:56

Спасибо!
очень помогла статья http://www.rsdn.ru/archive/vc/issues/pvc075.htm
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как не убить ноутбук... АнтиХакер Любые вопросы от новичков 4 16.06.2011 16:32
Убить подсветку матрицы haven Ноутбуки 1 28.05.2011 11:55
Как убить vista him777 Windows Vista 33 29.04.2008 01:04
Как программно убить vector! Dmitry_i C++ Builder 17 27.12.2007 12:16
хочу убить VIS-ту Артем Драйвера 21 14.08.2007 12:48
Как Трояна убить? Woodpecker monitor Компьютерная безопасность 52 07.07.2007 20:01
Как убить кролика Vladimir the Red Sunny Игры разума 12 11.08.2006 11:24
Массивы указателей как их решить Georgiy С/С++ 4 07.11.2005 08:04
ActiveX и массивы как переделать массивы Daedmen Visual C++ 1 17.04.2004 17:31
Создание указателей на массивы Yurasss C++ Builder 4 17.03.2004 10:58
Как программно убить процесс Anonymous WinAPI 1 06.11.2003 22:53
Как убить расширение файла Anonymous PHP 3 08.10.2003 20:11



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов