Получение ошибки сегментации при запуске кода дважды - PullRequest
0 голосов
/ 16 марта 2020

Я программирую назначение в C, и нам нужно перевести логические формулы.

Для одной части нам нужно преобразовать формулу следующим образом: φ <-> ψ → (φ & ψ) | (~ φ & ~ ψ)

Алгоритм данных представляет собой двоичное дерево.

Код, который переводит содержимое дерева, является следующей функцией:

int translate2(FormTree *tree) {
    //for1 <-> for2 = (for1 & for2) | (~for1 & ~for2)
    if((*tree)->tt == Symbol && (*tree)->t.symbol == 1) {
        Token neg, con, dis;
        neg.symbol = '~';
        con.symbol = '&';
        dis.symbol = '|';

        FormTree pt1 = newFormTreeNode(Symbol, con, (*tree)->left, (*tree)->right);

        FormTree negl = newFormTreeNode(Symbol, neg, (*tree)->left, NULL);
        FormTree negr = newFormTreeNode(Symbol, neg, (*tree)->right, NULL);

        FormTree pt2 = newFormTreeNode(Symbol, con, negl, negr);

        *tree = newFormTreeNode(Symbol, dis, pt1, pt2);
    }
    return 0;
}

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

Когда я запускаю программу и ввожу, например, a <-> b , программа переводит ее правильно. Однако, когда я вхожу в него во второй раз, программа падает с ошибкой сегментации. Из некоторой отладки я узнал, что эта ошибка возникает при создании pt2 FormTree.

Функция newFormTreeNode:

FormTree newFormTreeNode(TokenType tt, Token t, FormTree tL, FormTree tR) {
    FormTree new = malloc(sizeof(FormTreeNode));
    assert (new != NULL);
    new->tt = tt;
    new->t = t;
    new->left = tL;
    new->right = tR;
    return new;
}

Заголовочный файл формы дерева:

typedef struct FormTreeNode *FormTree;

typedef struct FormTreeNode {
  TokenType tt;
  Token t;
  FormTree left;
  FormTree right;
} FormTreeNode;

FormTree newFormTreeNode(TokenType tt, Token t, FormTree tL, FormTree tR);

И последнее, но не менее важное: основная функция:

int main(int argc, char *argv[]) {
	char *ar;
	List tl, tl1;
	tl1 = NULL;
	printf("enter a formula: ");
	ar = readInput();
	while (ar[0] != '!') {
		tl = tokenList(ar);
		printList(tl);
		tl1 = tl;
		FormTree t = NULL;
		if ( treeFormula(&tl1,&t)!=0 && tl1 == NULL ) {
			translate2(&t);
			
			printf("translated: ");
			printTree(t);
			printf("\n");

			freeTree(t);
		} else {
			printf("this is not a formula\n");
			if (t != NULL) {
				freeTree(t);
			}
		}
		free(ar);
		freeTokenList(tl);
		printf("\nenter a formula: ");
		ar = readInput();
	}
	free(ar);
	return 0;
}
...