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;
}
}
를 추가해보십시오 CONST (CONST의 AST의 *의 T, 문자열 A, 문자열 B) { – Bozemoto
나는 당신이 약간의 시간이 걸릴 제안 https://ericlippert.com ([프로그램을 디버깅하는 방법]/2014/03/05/how-to-debug-small-programs /). 디버거를 사용하면 크래시를 잡을 수있을뿐 아니라 코드를 한 줄씩 단계별로 실행할 수 있으며 마지막으로 변수가 값을 변경하면 실행을 중단시키는 * 워치 포인트 *를 설정할 수도 있습니다. 그렇게하면 데이터가 언제 어디서 변경되는지 쉽게 알 수 있습니다. –
"원본을 복사하여 저장하려고 시도하는"주석에 대해서도'children'은 * 포인터 *의 배열 인 것으로 보입니다. * pointer * 만 복사하고 할당 된 포인터는 복사하지 않습니다. 즉, 같은 메모리를 가리키는 포인터가 두 개 있습니다 (예 :'value.children [0]'과'original.children [0]'은 모두 같은 데이터를 가리키고 있습니다). –