Рекурсивный пост-порядок обхода и sprintf в C - PullRequest
0 голосов
/ 23 ноября 2018

Я пересекаю двоичное дерево, используя эту функцию.Я почти уверен, что правильное сохранение новых значений (переход к «текущему выводу») в узлы не удается выполнить в 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?

Вопрос

Если кто-то захочет объяснить, почему это происходит (и, возможно, предложить какое-то решение), я был бы благодарен.

1 Ответ

0 голосов
/ 23 ноября 2018

Это предположение, что, поскольку счетчик продолжает увеличиваться, так как стек рекурсивных функций продолжает увеличиваться, счетчик должен хранить старое значение предыдущего рекурсивного вызова.Для проверки просто счетчика при возврате из рекурсивного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...