Я пересекаю двоичное дерево, используя эту функцию.Я почти уверен, что правильное сохранение новых значений (переход к «текущему выводу») в узлы не удается выполнить в sprintf (буфер, «var% i», счетчик): мне интересно, почему.
static int counter = 1;
void postorder(tASTPointer* Root) {
if (Root == NULL)
return;
postorder(Root->LeftPointer);
postorder(Root->RightPointer);
if((!strcmp(Root->ID,"*")) || (!strcmp(Root->ID,"+"))) {
printf("DEFVAR var%i\n",counter);
if(!strcmp(Root->ID,"*")) // multiplication
printf("MUL var%i %s %s\n", counter,
Root->LeftPointer->content->name,
Root->RightPointer->content->name);
else if(!strcmp(Root->ID,"+")) // addition
printf("ADD var%i %s %s\n", counter,
Root->LeftPointer->content->name,
Root->RightPointer->content->name);
char buffer[25];
for (int i = 0; i < 25; i++)
buffer[i] = '\0';
sprintf(buffer, "var%i", counter);
Root->content->name = buffer;
//for (int i = 0; i < 25; i++)
// buffer[i] = '\0';
counter++;
printf("Root contains: %s\n", Root->content->name);
printf("LeftPointer contains: %s\n", Root->LeftPointer->content->name);
printf("RightPointer contains: %s\n\n", Root->RightPointer->content->name);
}
}
Дополнительная информация
Я обрабатываю двоичное дерево, созданное конечными узлами - числами и операционными узлами, в данном случае * и +.Моя цель - изменить каждое имя_операции-> имя на исходный идентификатор.
Исходное дерево выглядит так:
+
| |
* *
| | | |
1 2 3 4
Что я пытаюсь:
var3
| |
var1 var2
| | | |
1 2 3 4
Желаемый выход (в виде ассемблера):
DEFVAR var1
MUL var1 1 2 // 1*2, save to var1
DEFVAR var2
MUL var2 3 4
DEFVAR var3
ADD var3 var1 var2 // var1 + var2, save to var3
Токовый выход:
DEFVAR var1
MUL var1 1 2
DEFVAR var2
MUL var2 3 4
DEFVAR var3
ADD var3 var2 var2 // something wrong with buffer?
Вопрос
Если кто-то захочет объяснить, почему это происходит (и, возможно, предложить какое-то решение), я был бы благодарен.