Реализация дерева

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
lorien
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.04.2005 (Вт) 20:14

Реализация дерева

Сообщение lorien » 26.04.2005 (Вт) 20:20

Я ни разу на VB не программил, а тут вот пришлось...
Как на VB дерево можно реализовать? Я так понял, указателей в VB нету?

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 26.04.2005 (Вт) 20:36

Указатели есть. А для дерева есть специалный контрол.
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 26.04.2005 (Вт) 20:40

kirrun
ну ты и сморозил про контрол!
Ему же структура данных нужна. Двоичное дерево поиска называется :)

lorien
Указатели в VB есть, но почти что неофициально :) Получить указатель на переменную - VarPtr(что-то), получить указатель на функцию - AddressOf имя_функции. Чтобы скопировать блок памяти - используй CopyMemory (правильнее, вообще-то, называть ее RtlMoveMemory, API-функция такая.) Про это дело хорошо бы почитать Брюса МакКинни "Hardcore Visual Basic". См. раздел "Популярные вопросы".
Последний раз редактировалось hCORe 26.04.2005 (Вт) 20:46, всего редактировалось 1 раз.
Моду создают модоки, а распространяют модозвоны.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 26.04.2005 (Вт) 20:43

lorien
Ах да, для копирования блоков памяти можно еще пользоваться GetMemN/PutMemN, где N - 2, 4 или 8. См. подробнее статьи GSerg'а:
http://www.vbstreets.ru/VB/Articles/65973.aspx (об указателях)
http://www.vbstreets.ru/VB/Articles/65977.aspx (о массивах)
http://www.vbstreets.ru/VB/Articles/66035.aspx (вызов ф-ций по указателю)
Моду создают модоки, а распространяют модозвоны.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.04.2005 (Вт) 23:00

Я бы сказал - если скорость не критична, но вместо гемора с GetMem/PutMem легче объявить ноду как класс (вместо UDT). Объект - это и есть указатель; и при этом нету выхода за рамки языка.
А если скорость критична, то вместо VB лучше посмотреть в другую сторону...
Изображение

lorien
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.04.2005 (Вт) 20:14

Сообщение lorien » 27.04.2005 (Ср) 0:18

Оппа, на VB, оказываецца есть ООП. А где можно про него почитать (про ООП на VB ? )

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 27.04.2005 (Ср) 1:21

lorien Ну нельзя же так шутить, я из-под стола долго не мог выбраться. Что касается твоего вопроса:
MSDN
Статьи на VBStreets.ru
Юзфульная книжка "Hardcore VB" - лучшее пособие для начинающих! :wink:
Листинги не горят!

lorien
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.04.2005 (Вт) 20:14

Сообщение lorien » 27.04.2005 (Ср) 6:44

MSDN у меня есть щас поставлю.
Я тут пробовал класс дерева намутить и чего-то не работает. ЩАс покажу:

-------------------- код класса -----------------------
Public parent As Tree
Public label As String
Public Childs As Collection

Public Function Show()
Dim str As String
For Each child In Childs
str = str & child.Show()
Next
Show = str
End Function
---------------------------------------------------

Потом в таком коде вылазит ошибка:

-------------------- Это сам код программы ------------------
Dim head As New Tree

Sub Test3()
head.label = "1"
Dim item As New Tree
item.label = "33"
head.Childs.Add(item, "33") 'Тут вылазит ошибка Object variable or With block variable not set (Error 91)
MsgBox head.Show
End Sub
-------------------------------------------------------------

Пардон, если там полная фигня, ну не работал я раньше с VB...

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 27.04.2005 (Ср) 7:20

lorien
Эта ошибка говорит о том что у тебя не определена используемая переменная, либо обьект. В дебагере посмотри где конкретно.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

lorien
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.04.2005 (Вт) 20:14

Сообщение lorien » 27.04.2005 (Ср) 7:41

Эххх. Да я и сам это понимаю. :-) Я и строчку вам даже указал с ошибкой. Из моего кода, думаю, понятно (чего я хотел )... надеюсь, что понятно :-(... Мог бы кто-нить исправить там корявость, чтобы он заработал?

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 27.04.2005 (Ср) 8:58

lorien
Тем не менее ты не так понял.
У тебя в строке
Код: Выделить всё
head.Childs.Add(item, "33")


три обьекта и один метод.

Т.е. тебе нужно проверить какой именно обьект неопределен. Для этого в Immediate окне пишешь что нибудь нейтральное. Например ?head.Childs.Count, если вылетит ошибка значит проблема в этом куске. Если не вылетит, проверь item.

Заодно и скобки убери, они ни к чему.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 27.04.2005 (Ср) 9:40

hCORe, а ты знаешь, что деревья бывают не только двоичными? :twisted:

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 27.04.2005 (Ср) 9:51

uhm
Смотря какие деревья....Есть например клены, тополя...

А вообще под деревом подразумевают binary tre, не?
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

lorien
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.04.2005 (Вт) 20:14

Сообщение lorien » 27.04.2005 (Ср) 10:10

Код: Выделить всё
Тем не менее ты не так понял.

Ага, я сегодня это осознал, когда сделал пошаговую трассировку... короче всё исправил уже. Спасибо за помощь. Щас ещё чё-нить спрошу.
Код: Выделить всё
А вообще под деревом подразумевают binary tre, не?

Ну, дерево не обязательнод должно быть бинарным :-) Вот у меня кокретно щас не бинарные деревья будут использовацца.
А вот кстати моё дерево:
Код: Выделить всё
Public parent As Tree
Public label As String
Public Childs As New Collection

Не так уж и много писать пришлось :-))

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 27.04.2005 (Ср) 10:44

Binary tree - это просто самое известное из деревьев. Но на самом деле их видов гораздо больше. Я сходу вспоминаю красно-черные деревья (попробуйте, кстати, поискать их в яндексе - половина ссылок на алгоритмы, половина - на мебельные компании :D ), которые, правда, тоже бинарные, и Б-деревья, которые совсем не бинарные (ох, намучился я с ними в школе). Помню, что еще несколько видов есть...

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 27.04.2005 (Ср) 10:51

Оцените, как это звучит!!!

Если отец нового узла красный, а дядя черный, существуют два похожих подслучая. Если вставляемый узел левый сын своего отца, тогда цвет отца меняется на черный, цвет деда меняется на красный и дерево поворачивается направо вокруг отца нового узла.


:lol:

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 27.04.2005 (Ср) 13:45

uhm писал(а):Оцените, как это звучит!!!

Если отец нового узла красный, а дядя черный, существуют два похожих подслучая. Если вставляемый узел левый сын своего отца, тогда цвет отца меняется на черный, цвет деда меняется на красный и дерево поворачивается направо вокруг отца нового узла.


:lol:


оооо... Какая большая семья! =)
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

lorien
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.04.2005 (Вт) 20:14

Сообщение lorien » 27.04.2005 (Ср) 14:17

Хочу рекурсивную процедуру написать. Передаю в процедуру объекта, а басик ругаецца:
Код: Выделить всё
Set node = New Tree
node.label = records(1).value
buffer.add records(1).value
For Each link In records(1).links
    node.Childs.add link
Next
   
test (node)

Object doesn't support this property or method

Как передавать объекты в процедуры?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 27.04.2005 (Ср) 14:19

Код: Выделить всё
Byref obj as Object

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.04.2005 (Ср) 14:23

lorien, буквосочетание "Childs" сильно режет глаза.... Уж назвал бы Kids, если буквы экономишь. Или Children, если косишь под английский.


Объекты в процедуры передаются так же, как и любые другие переменные - без скобок, либо с ключевым словом Call (см. http://bbs.vbstreets.ru/viewtopic.php?t=15372 )
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.04.2005 (Ср) 14:25

Konst_One писал(а):
Код: Выделить всё
Byref obj as Object

Можно и ByVal - это, кстати, эффективнее. Но у lorien проблема не в этом.
Изображение

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 27.04.2005 (Ср) 14:30

tyomitch
на счет эффективности - это ты пошутил, наверное :lol:

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 27.04.2005 (Ср) 15:29

2 Konst_One
tyomitch глупо не шутит. Если сказал - эффективнее, значит так оно и есть.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 27.04.2005 (Ср) 15:38

просто в случае с объектами Byref как раз эффективнее

lorien
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.04.2005 (Вт) 20:14

Сообщение lorien » 27.04.2005 (Ср) 15:51

Срочно скажите, как сделать копию коллекции, пожалуйста.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.04.2005 (Ср) 17:45

Konst_One писал(а):просто в случае с объектами Byref как раз эффективнее

С чего это ты взял? :-? :-?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.04.2005 (Ср) 17:46

Копию коллекции - только вручную:
Код: Выделить всё
For Each v In OldCollection
    NewCollection.Add v
Next
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 27.04.2005 (Ср) 19:17

Не-а, неправильно. Так ты получишь коллекцию, в которой будут содержаться ссылки на те же объекты, ссылки на которые содержатся в первой. Таким образом, при изменении свойств члена первой коллекции соотв-но все поменяется и в копии.

Код: Выделить всё
For Each v In OldCollection
  set v1 = new cls_Child
  v1.property1 = v.property1
  ...
  NewCollection.Add v1 ' !!!
Next v

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.04.2005 (Чт) 17:53

tyomitch писал(а):
Konst_One писал(а):просто в случае с объектами Byref как раз эффективнее

С чего это ты взял? :-? :-?

Дык и всё-таки, с чего? :?: :?:
Изображение

lorien
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.04.2005 (Вт) 20:14

Сообщение lorien » 01.05.2005 (Вс) 8:54

Код: Выделить всё
Не-а, неправильно. Так ты получишь коллекцию, в которой будут содержаться ссылки на те же объекты, ссылки на которые содержатся в первой. Таким образом, при изменении свойств члена первой коллекции соотв-но все поменяется и в копии.

Ну для частного случая это будет работать, когда наприме коллекция содежит числа, а не объекты.

А как удалить объект? Вот есть у меня коллекция и я хочу освободить память от неё. Чего делать?

И вот ещё вопрос. Есть ли патч, который позволяет задействовать скролл мышки в редактори Visual Basic? Отсутствие скролла меня ОЧЕНО достаёт.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 128

    TopList