2017-11-18 1 views
-1

AST型の変数を代用関数に渡していますが、その理由は不明な理由により変更されています。参照渡しでなくても構造変数のC++の不要な変更

この代用関数は、AST内の非ブール変数をブール値に変更し、この関数がメイン関数で実行された後も何らかの形でオリジナルASTが変更されるため、ASTオリジナルを変更しないようにしてください助けて!!私のコードインデントが奇妙であれば申し訳ありません。変更は両方に反映させ、ツリーのより深いレベルで、彼らは、同じまま -

struct AST {std::string info; pNODE children[2]; }; 

    void subHelper (AST *T, string a, string b){ 
     if (T->children[0]==NULL&&T->children[1]==NULL){ 
     if (T->info.compare(a)==0) 
     { 
     T->info = b; 
     } 
     return; 
     } 
     if (T->children[0]!=NULL){ 
      subHelper((T->children[0]), a,b); 
     } 
     if (T->children[1]!=NULL) 
      subHelper((T->children[1]), a,b); 
     } 

    AST substitute(list<bool> vals, list<string> vars, AST original) 
    { 
    int a = vals.size(); 
     int b = vars.size(); 
     if (a==b) 
    { 
     //cout<<"\n"; 
     //prinTree(original); 
     //cout<<"\n"; 
    //attempt of trying to save original by copying it 
    AST value; 
     value.info=original.info; 
     value.children[0]=original.children[0]; 
     value.children[1]=original.children[1]; 
    for (it2 = vals.begin(), it=vars.begin(); it2 != vals.end(); it++, 
     it2++) 
     { 
     if(*it2 == false) 
     { 
     subHelper(&value, *it, "F"); 
     } 
     else 
     { 
     subHelper(&value, *it, "T"); 
     } 
     } 
    // prinTree(Exp);cout<<"\n"; 
    //prinTree(value);cout<<"\n"; 
    return value; 
    } 
    else 
    { 
    return original; 
     } 
    } 
+0

このボイドsubHelperのようなのconstを追加してみてください(定数AST * T、列A、列B){ – Bozemoto

+0

私はあなたにいくつかの時間がかかる示唆[あなたのプログラムをデバッグする方法を学ぶ](https://ericlippert.com/2014/03/05/how-to-debug-small-programs /)を参照してください。デバッガを使用すると、クラッシュをキャッチするだけでなく、行ごとにコードをステップ実行することもできます(最後はここで役に立ちます)。変数が値を変更すると実行を中断する*ウォッチポイント*も設定します。そうすることで、データがいつどこで変化するのかを簡単に見つけることができます。 –

+0

「オリジナルをコピーして保存しようとする」というコメントについても、「子供」は*ポインタ*の配列であるようです。あなたは*ポインター*だけをコピーしますが、ポインターはそれらが指しているものではありません。つまり、同じメモリを指しているポインタが2つあります(たとえば、 'value.children [0]'と 'original.children [0]'は両方とも同じデータを指しています)。 –

答えて

0

は、あなたの子供の配列はポインタを保持しているので、あなたの値のコピーは浅いコピーではなく、オリジナルのディープコピーであると思われます。

0

私の間違いを指摘してくれてありがとう、ここに深いコピーで私の試みです、それは動作するようです。

void deepcopy(AST *dest, AST *source){ 
    if (source->children[0]==NULL&&source->children[1]==NULL){ 
    dest->info=source->info; 
    return; 
    } 
    dest->info=source->info; 
    AST *node = new AST(); 
    if (source->children[0]!=NULL){ 
    dest->children[0]=node; 
    deepcopy((dest->children[0]), source->children[0]); 
    } 
if (source->children[1]!=NULL){ 
    dest->children[1]=node; 
    deepcopy((dest->children[1]), source->children[1]); 
} 
} 
+0

nvm私はそれを修正しました、ちょうどそれを間違って呼んでいた、ありがたいこと!!これに多くの時間を費やし、私は深いコピーでの私の試みが悲しいhaha xdであったことに気づいていません。 –

関連する問題