![]() |
|
![]() ![]() ![]() |
|
metoflex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
Здравствуйте!
Второй день не могу спать спокойно, очень озадачен вопросом, как мне обойти все вершины дерева (CTreeCtrl) начиая с самой первой, причём обойти последовательно каждую ветку, т.к. мне потом нужно будет информацию упорядоченно сохранить в файл, а потом загрузить из него. Как сохранить и загрузить-придумал, а вот как обойти дерево, для сохранения данных каждого узла....ума не приложу... Дерево не бинарное. Предполагаю что необходимо выполнять рекурсивный обход , но как... Буду очень рад, если у кого есть уже готовый алгоритм обхода. Спасбо Огромное! Это сообщение отредактировал(а) metoflex - 19.9.2010, 12:58 |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Вот я когда-то делал для рекурсивного обхода каталогов. По аналогии разберёшься, я думаю.
-------------------- ![]() |
|||
|
||||
metoflex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
Спасибо Огромное! Сейчас попробую разобраться!
|
|||
|
||||
metoflex |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
Создал функцию с параметрами:
Выдаёт ошибку:
Я так полагаю, что компилятор не может скопировать в функцию переменную n, типа CTreeCtrl , необходимо вызывать конструктор копирования, я полагаю, подскажите как исправить ошибку. Спасибо! |
||||
|
|||||
Cheloveck |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Передавай объекты по ссылке. У меня в примере небольшая ошибка
надо. Соответственно тебе
CTreeCtrl тоже, наверное, const. -------------------- ![]() |
||||
|
|||||
metoflex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
Спасибо Огромное! Всё получилось!)
Кому надо, вот код:
|
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
1. Это будет работать только один раз, так как i не обнуляется.
2. Это будет работать только с довольна малым количеством элементов дерева. С большим получешь переполнение стека, ибо рекурсия - зло! Это сообщение отредактировал(а) Cheloveck - 20.9.2010, 19:43 -------------------- ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Cheloveck, не пугай ты так. Чтобы рекурсия реально сожрала стек, нужно столько элементов, что виндоус треснет.
Точнее, столько уровней вложенности, т.к. глубина рекурсии зависит именно от этого. Во всяком, случае, проблемы раньше начнутся в другом месте. Рекурсивные алгоритмы - естественны для рекурсивных структур. Если начнутся проблемы с производительностью\памятью, то рекурсивный алгоритм всегда можно развернуть через стек, но будет утрачена лаконичность кода, так что делать это стоит только при действительной необходимости, а не заранее и на всякий случай. А насчет первого пункта, там достаточно одного обнуления, и оно вроде есть. Но вообще, использование статической переменной - это глупость, конечно, к тому же совсем не нужная. Алгоритмы обхода дерева пишутся примерно по такой схеме:
-------------------- ... |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Точно, не заметил. Всё равно я против рекурсии без крайней необходимости. И то при условии, что точно известно максимальное количество итераций. Кстати, при обходе рекурсией каталога Windows у меня стек валился, кажется. -------------------- ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Это вовсе не значит, что плоха рекурсия, это ты код плохой написал. Чтобы стека не хватило на рекурсивный обход каталогов - ни в жисть не поверю. Но ошибиться в рекурсивной процедуре можно легко, это верно. Легкая лажа в условии выхода и привет стеку. Но ты ведь не перестаешь пользоваться молотком только оттого, что пару раз по пальцам попал? -------------------- ... |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Но я не пользуюсь молотком там, где можно закрутить отвёрткой. Я к тому, что стек можно организовать и в куче самому. И такой стек не лопнет в один прекрасный момент. Возможно. Ибо это было давно, а код я сразу переписал, сейчас уже ничего не осталось. -------------------- ![]() |
|||
|
||||
metoflex |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
Спасибо Огромное за ваши отзывы, очень помогли!
Взник еще один небольшой вопросик. Создал класс (который прикрепил к CTreeCtrl), вызываю метод этого класса:
Пишет ошибку такого толка: Нестатическая ссылка на член должна указывать относительно заданного объекта Если пишу так:
Съедает без ошибки. Почему так?? Спасибо! Это сообщение отредактировал(а) metoflex - 21.9.2010, 23:31 |
||||
|
|||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Потому что TreeClass - это класс. Из класса (без объекта) можно вызывать только статические функции, то есть объявленные с модификатором static. Но такие функции, соответственно, не имеют доступа к членам класса. А к обычным функциям можно обращаться только через объект, ибо только объеет хранит все переменные.
Обычно, разницу между объектом и классом объясняют так: класс - это разметка, по которой создаётся объект. Добавлено через 55 секунд Статические методы вызываются из класса через оператор двойное двоеточие
-------------------- ![]() |
|||
|
||||
metoflex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
То же самое сообщение выдаёт, если обращаюсь через ( :: )
Добавлено @ 23:51 Статические, как я понимаю, не могут внести изменения в объект, но я вызовом данной функции вызываю построение древа... она явно не static .... Это сообщение отредактировал(а) metoflex - 21.9.2010, 23:52 |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Ну так это логично oO -------------------- ![]() |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |