0

この関数を使用して二分木をトラバースしています。ノードへの新しい値の適切な保存 (「現在の出力」にスキップ) が sprintf(buffer, "var%i", counter) で失敗し続けると確信しています: なぜだろうか.

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);

    }
    }

詳しくは

リーフ ノード (数値と操作ノード、この場合は * と +) によって作成されたバイナリ ツリーを処理しています。私の目標は、すべての operation_node->name を元の ID に変更することです。

元のツリーは次のようになります。

            +
         |     |
         *     *
       |   |  |  |
       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?

質問

誰かがなぜこれが起こり続けるのかを説明してくれれば (そしておそらく何らかの解決策を提供してくれるでしょう)、私は感謝しています.

4

1 に答える 1