Проблема с ссылками c++

318
16 июля 2018, 08:30

Пишу парсер через бинарное дерево и на моменте когда парсит дерево, он верно все обрабатывает, но когда доходит до момента когда строку нужно перевести в число дабл, а он не находит в строке такого числа, прога выбрасывает ошибку. Делаю вывод, что ошибка в дереве, я задебажил дерево и нашел то, что когда программа выходит из функции окончательно, сбрасываются значения в ветвях дерева, записанные через структуру. Что делать и как исправить? (ниже функция, создающая дерево)

void parcer2(string str, Tree* tree) {
//нужно найти максимальное значение, занести его в дерево, разделить строку на 2 части и вызвать эту же функцию два раза
//первые 5 операций
for (int x = 0; x < 4; x++) {
    for (int i = 0; i < str.length(); i++) {
        if (str[i] == Operation[x][0]) {
            tree->item = Operation[x];
            size_t tmp = str.find(Operation[x]);
            string str1 = str.substr(0, tmp);
            string str2 = str.substr(tmp + 1, str.length() - tmp);
            Tree leftTree;
            Tree rightTree;
            tree->leftTree = &leftTree;
            tree->rightTree = &rightTree;
            parcer2(str1, &leftTree);
            parcer2(str2, &rightTree);
            return;
        }
    }
}
//6 операций длинной 3 символа
if (str.length() > 3) {
    for (int x = 4; x < 11; x++) {
        for (int i = 0; i < str.length() - 2; i++) {
            if (str[i] == Operation[x][0] && str[i + 1] == Operation[x][1] && str[i + 2] == Operation[x][2]) {
                tree->item = Operation[x];
                size_t tmp = str.find(Operation[x]);
                string str1 = str.substr(tmp + 3, str.length() - tmp);
                Tree leftTree;
                tree->leftTree = &leftTree;
                tree->rightTree = NULL;
                parcer2(str1, &leftTree);
                return;
            }
        }
    }
}
//2 операции: х и числа
for (int i = 0; i < str.length(); i++) {
    if (str[i] == Operation[11][0]) {
        tree->item = Operation[11];
        tree->leftTree = NULL;
        tree->rightTree = NULL;
        return;
    }
}
tree->item = str;
tree->leftTree = NULL;
tree->rightTree = NULL;
return;

}

Answer 1

-Куда девается земля, когда в ней дырка? О.Генри

Локальные переменные

        Tree leftTree;
        Tree rightTree;

живут, пока выполняется код в блоке if. После этого компилятор освобождает отведенную под них память.

        tree->leftTree = new Tree();
        tree->rightTree = new Tree();
        parcer2(str1, tree->leftTree);
        parcer2(str2, tree->rightTree);
READ ALSO
Как написать в консоли стих?

Как написать в консоли стих?

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

646
сравнение элементов двух массивов java

сравнение элементов двух массивов java

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

311
Android: как сделать неубиваемый сервис

Android: как сделать неубиваемый сервис

Господа! Прошу помощи!

623