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

를 추가해보십시오 CONST (CONST의 AST의 *의 T, 문자열 A, 문자열 B) { – Bozemoto

+0

나는 당신이 약간의 시간이 걸릴 제안 https://ericlippert.com ([프로그램을 디버깅하는 방법]/2014/03/05/how-to-debug-small-programs /). 디버거를 사용하면 크래시를 잡을 수있을뿐 아니라 코드를 한 줄씩 단계별로 실행할 수 있으며 마지막으로 변수가 값을 변경하면 실행을 중단시키는 * 워치 포인트 *를 설정할 수도 있습니다. 그렇게하면 데이터가 언제 어디서 변경되는지 쉽게 알 수 있습니다. –

+0

"원본을 복사하여 저장하려고 시도하는"주석에 대해서도'children'은 * 포인터 *의 배열 인 것으로 보입니다. * pointer * 만 복사하고 할당 된 포인터는 복사하지 않습니다. 즉, 같은 메모리를 가리키는 포인터가 두 개 있습니다 (예 :'value.children [0]'과'original.children [0]'은 모두 같은 데이터를 가리키고 있습니다). –

답변

0

당신의 아이 배열 포인터를 보유하고 있으므로 값 사본이 얕은 사본이 아닌 원본의 딥 카피 것으로 보인다.

0

내 실수를 지적 해 주셔서 감사합니다. 여기에 깊은 복사를 시도한 것 같습니다. 작동하는 것 같습니다. 이 무효 subHelper 같은

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 나는 그것을 고쳤다. 그냥 잘못 부른 것 뿐이었다. 고맙다! 이것에 너무 많은 시간을 보냈다. 그리고 나는 심지어 could not가 깊은 사본의 나의 시도가 xh 이었다는 것을 깨닫는다. –

관련 문제