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;
}
}
このボイドsubHelperのようなのconstを追加してみてください(定数AST * T、列A、列B){ – Bozemoto
私はあなたにいくつかの時間がかかる示唆[あなたのプログラムをデバッグする方法を学ぶ](https://ericlippert.com/2014/03/05/how-to-debug-small-programs /)を参照してください。デバッガを使用すると、クラッシュをキャッチするだけでなく、行ごとにコードをステップ実行することもできます(最後はここで役に立ちます)。変数が値を変更すると実行を中断する*ウォッチポイント*も設定します。そうすることで、データがいつどこで変化するのかを簡単に見つけることができます。 –
「オリジナルをコピーして保存しようとする」というコメントについても、「子供」は*ポインタ*の配列であるようです。あなたは*ポインター*だけをコピーしますが、ポインターはそれらが指しているものではありません。つまり、同じメモリを指しているポインタが2つあります(たとえば、 'value.children [0]'と 'original.children [0]'は両方とも同じデータを指しています)。 –