Показать сообщение отдельно

  #4  
Старый 18.09.2009, 01:54
rudvil
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
С нами: 9320830

Репутация: 86
По умолчанию

Пишу на Visual С++ 2008
Конвертирую постфикс выражение в дерево.


tree.cpp
Код:
struct Tree {
    tree_type treetype;
    int treesize;
    char* value;
    Tree* tree;
    Tree () {
        this->treesize = 0;
        this->value = 0;
        this->tree = 0;
    }
};

void ParseAssigment (Tree& tree) {
    std::queue<Token> Postfix; // В нем хранится постфикс выражение например [1][2][3][*][+]
    std::stack<Tree> postfixTree;
    while (!Postfix.empty()) {
        if (Postfix.front().tokentype == token_type_numeric) {
            Tree* nodeTree = new Tree;
            nodeTree->treetype = tree_type_num_value;
            nodeTree->value = Postfix.front().value;
            Tree* childTree = new Tree[2];
            nodeTree->tree = childTree;
            postfixTree.push(*nodeTree);
        }
        else if (isOperator(Postfix.front().tokentype)){
            Tree* nodeTree = new Tree;
            nodeTree->treetype = tree_type_operator;
            nodeTree->value = strOperator(Postfix.front().tokentype);
            nodeTree->treesize = 2;
            Tree* childTree = new Tree[2];
            nodeTree->tree = childTree;
            nodeTree->tree[1] = postfixTree.top();
            postfixTree.pop();
            nodeTree->tree[0] = postfixTree.top();
            postfixTree.pop();
            postfixTree.push(*nodeTree);
        }
        Postfix.pop();
    }
    tree.treetype = tree_type_postfixexpr;
    tree.tree = &postfixTree.top();
    postfixTree.pop();
    std::cout << "[" << tree.tree->tree[1].value << "]\n"; // Тут все значения корректны... т.е. показывает * как и должно быть, с остальными тоже все ок
}

main.cpp
Код:
#include "tree.cpp"

int main () {
    Tree* tree = new Tree;
    ParseAssigment(*tree);
    std::cout << "outside func[tree->tree->treetype][" << tree->tree->tree[1].value << "]\n"; // вот тут пишет "Unhandled exception. Access violation..."
    return 0;
}
Сразу после конвертации проверяю дерево ещё внутри функции - все значения совпадают т.е. все ок.

Но после того как я возвращаю готовое дерево из функции и пытаюсь вывести содержимое мне пишет "Unhandled exception. Access violation...".
То что отмечено желтым кудато пропадает...
Цитата:
std::cout << "[" << tree->tree->tree[1].value << "]\n";
Насколько я понимаю тут
Код:
ParseAssigment(*tree);
происходит утечка(или потеря данных)...
Вопрос, как решить эту проблему, или если я где-то допускаю ошибку - поправьте плз)

Заранее огромное спасибо =]
 
Ответить с цитированием