2017-11-18 3 views
-1

Ich übergebe eine Variable vom Typ AST in Funktion Ersatz, die dann aus unbekannten Gründen geändert wird, unten ist der Code.C++ unerwünschte Änderung in Strukturvariable auch wenn nicht durch Verweis

Diese Ersatzfunktion ändert jede nicht boolesche Variable im AST in einen booleschen Wert und irgendwie wird der ursprüngliche AST geändert, auch wenn diese Funktion in der Hauptfunktion ausgeführt wird. Ich möchte nicht, dass sich das Original ändert Hilfe!! Entschuldigung, wenn meine Codeeinrückung seltsam ist.

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

Versuchen Hinzufügen const wie diese Lücke subHelper (const AST * T, string a, string b) { – Bozemoto

+0

Ich schlage vor, Sie einige Zeit dauern, bis [lernen, wie Sie Ihre Programme debuggen] (https://ericlippert.com/2014/03/05/how-to-debug-small-programme /). Mit einem Debugger können Sie nicht nur Abstürze feststellen, sondern auch Code Zeile für Zeile durchgehen (letzteres könnte Ihnen hier helfen), aber auch * watch-points *, die die Ausführung unterbrechen, wenn eine Variable den Wert ändert. Wenn Sie das tun, werden Sie leicht feststellen, wann und wo sich Ihre Daten ändern. –

+0

Auch in Bezug auf den Kommentar "Versuch, das Original durch Kopieren zu speichern" scheint es, dass "Kinder" ein Array von * Zeigern * ist. Sie kopieren nur die * Zeiger * und nicht das, worauf sie mit den Zuweisungen zeigen. Das heißt, Sie haben nun * zwei * Zeiger, die auf denselben Speicher verweisen (z. B. zeigen "value.children [0]" und "original.children [0]" beide auf dieselben Daten). –

Antwort

0

Es scheint, dass Ihre Kinder Array Zeiger hält, so dass Ihr Wert Kopie ist eine flache Kopie anstatt eine tiefe Kopie der Original - auf tieferen Ebenen des Baumes, bleiben sie gleich, so Änderungen sowohl reflektieren.

0

ok jungs danke für den Hinweis auf meinen Fehler, hier ist mein Versuch tief zu kopieren, es scheint zu funktionieren.

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 Ich reparierte es, nannte es einfach falsch, DANKE !! Ich verbrachte so viel Zeit damit und ich konnte nicht einmal erkennen, dass mein Versuch, tief zu kopieren, hämisch war. –

Verwandte Themen