Пишу на 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);
происходит утечка(или потеря данных)...
Вопрос, как решить эту проблему, или если я где-то допускаю ошибку - поправьте плз)
Заранее огромное спасибо =]