Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> queue указателей 
V
    Опции темы
Metalex
Дата 19.11.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Доброго времени суток!

У меня есть стандартная очередь из указателей на TTreeNode (не суть важно). Я заношу указатели на узлы дерева в очередь, затем извлекаю и вывожу в файл. Во вот дела. Где-то при этих манипуляциях теряются те указатели, которые храняться в очереди, поэтому, когда я сохраню в файл - вместо имен узлов дерева вижу на форме иероглифы. Я думал, что это при операции очереди pop(), но нашел инфу, что нет - деструктор поп не вызывает.
Тогда я попробовал сделать очередь из указателей на эти указатели. Вроде бы логично - и ничего не должно потеряться. 
Но! Ничего не получается - при извлечении из очереди элемента - у него пустые поля.....
Вот участки кода, которые я описал:

Код

ofstream& operator << (ofstream & stream, TTreeView * &tree) {
    queue<TTreeNode**>Queue;
    // заполним очередь на вывод
    TPTree->TraverseTreeOnSaveTree(Queue, tree->Items->GetFirstNode());
    TTreeNode **node = NULL;
    while (!Queue.empty()) {
        node = Queue.front(); // получим первый элемент очереди
        // выведем его в поток
        stream << ((TPTreeNode*)(*node)->Data)->getTpLevel()
            << " " << (*node)->Text.c_str() << "\n";
        Queue.pop(); // вытолкнем этот элемент из очереди
    }
    if (node) {
        //delete node;
    }
    return stream;
}

// ---------------------------------------------------------------------------
/**
 * Обход дерева для сохранения всех элементов компонента
 * @return заполненную очередь, готовую для вывода в файл
 */
void __fastcall TTPTree::TraverseTreeOnSaveTree(queue<TTreeNode**> &Queue,
    const TTreeNode *node) {
    TTreeNode *savenode = new TTreeNode(*node);
    if (node) {
        // добавим узел в очередь
        Queue.push(&savenode);
        // если есть сыновья
        for (int i = 0; i < savenode->Count; i++) {
            TraverseTreeOnSaveTree(Queue, savenode->Item[i]);
        }
    }
}

// ---------------------------------------------------------------------------
/**
 * Сохранить дерево в файл
 */
void __fastcall TTPTree::TPTreeSaveFileExecute(TObject *Sender) {
    if (TPTreeSaveDialog->Execute()) {
        UnicodeString filename = TPTreeSaveDialog->FileName;
        ofstream frame(filename.c_str(), ios::out);
        frame << TPTreeView;
        frame.close();
    }
}


Что я делаю не так?


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
math64
Дата 19.11.2011, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(Metalex @  19.11.2011,  12:41 Найти цитируемый пост)

Код

TTreeNode *savenode = new TTreeNode(*node);
...
Queue.push(&savenode);


В очередь ты заносишь адрес savenode - после выхода из TraverseTreeOnSaveTree он указывет неизвестно на что.
PM   Вверх
Metalex
Дата 19.11.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



math64, да, а как с этим бороться?


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
math64
Дата 19.11.2011, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Храни в очереди простые указатели, зачем двойные ?
PM   Вверх
Metalex
Дата 19.11.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Цитата(math64 @  19.11.2011,  15:13 Найти цитируемый пост)
Храни в очереди простые указатели

Я же написал, что тогда в дереве будут иероглифы (Builder, компонент TTreeVeiw).
И если написать такую штуку 
Код

    ShowMessage(TPTreeView->Items->GetFirstNode()->Text);
        frame << TPTreeView;
    ShowMessage(TPTreeView->Items->GetFirstNode()->Text);

То второй шоу месседж выбивает, т.к. где-то этот указатель (который я хранил в очереди) затерся.
И так для всех узлов.


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
math64
Дата 19.11.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Ты добавлял/удалял узлы из дерева? Тогда да, память под узлы дерева могли выделиться заново,
но в етом случае доп. уровень указателей не поможет, и как мне помнится, в Билдере этого не происходит
Для очереди указатель - всё равно, что целое соответствующего размера, она его портить не должна.
И вообще, зачем нужна очередь?
В TraverseTreeOnSaveTree передай вместо ссылки на очередь ссылку на ostream и выводи узлы непосредственно там.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0675 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.