2017-02-01 3 views
1

persistent sind Ich habe eine direkte c-Datei, die einen einfachen Baum mit 3 möglichen Kindern für jeden Knoten erstellt. Mein Ziel ist es, die Summe der Daten innerhalb eines gegebenen Knotens und aller seiner Kinder zu finden. Ich mache das mit Rekursion und es funktioniert einmal, aber wenn es zweimal hintereinander gelaufen ist, bleibt der Wert der alten Methode und ich bin mir nicht sicher warum. Das heißt, wenn es erneut aufgerufen wird, werden die beiden Datenwerte hinzugefügt, anstatt nur auf 0 zurückgesetzt zu werden, so wie ich es oben in der Klasse getan habe. Nicht sicher, warum das passiert. Hier ist der Code.Dateivariablen, die zwischen verschiedenen Funktionen in C

struct N *mknode(struct N *xp, struct N *yp, struct N *zp, long n) 
{ 
struct N *p = malloc(sizeof(struct N)); 
p->x = xp; 
p->y = yp; 
p->z = zp; 
p->data = n; 
return p; 
} 

int main(int argc, const char *argv[]) 
{ 
struct N *p1, *p2, *p3, *p4, *p5, *p6; 

// construct a tree for testing: 

p1 = mknode(NULL, NULL, NULL, 1); 
p2 = mknode(NULL, NULL, NULL, 10); 
p3 = mknode(NULL, NULL, NULL, 100); 
p4 = mknode(p1, p2, p3, 3000); 
p1 = mknode(NULL, NULL, NULL, 1); 
p2 = mknode(NULL, NULL, NULL, 10); 
p3 = mknode(NULL, NULL, NULL, 100); 
p5 = mknode(p1, p2, p3, 4000); 
p5 = mknode(p4, p5, NULL, 50000); 
p6 = mknode(p5, NULL, NULL, 100000); 

// to test only on trees, remove the following 
// assignments that turn the tree into a graph 
//p1->x = p5; 
//p2->y = p4; 
//p2->z = p2; 
//p6->y = p5; 
//p6->z = p6; 

long s = sum(p6); 
long x = sum(p6); 

s und x sollten den gleichen Wert haben, aber x ist aus irgendeinem Grund double s. Dies ist der Funktionscode in einer separaten Klasse.

long data = 0; 

long sum(struct N *p){ 
printf("%ld\n", data); 
if (p != NULL){ 
    sum(p->x); 
    sum(p->y); 
    sum(p->z); 
    return data += p->data; 
} 
return 0; 
} 

Hier ist die erste Struktur in einer Header-Datei.

struct N { 
struct N *x; 
struct N *y; 
struct N *z; 
long data; 
}; 
+1

'lange data = 0;' Das ist ein initializer. Es setzt den Wert nur einmal beim Programmstart. Verschieben Sie es in die Funktion, damit es bei jeder Ausführung der Funktion als lokale Variable initialisiert wird. – kaylum

+0

C hat keine Klassen. –

+0

Und beachten Sie, dass C hat weder "Klassen" noch "Methoden". Du meinst wahrscheinlich "Datei" und "Funktion". – kaylum

Antwort

1

sum fügt die globalen Variable data. Nach jedem Anruf von main wird es nie auf Null zurückgesetzt.

Zwischen jedem Anruf an sum in main, fügen Sie data = 0; hinzu. Oder noch besser, schreiben sum wie:

long 
sum(struct N *p) 
{ 
    long total = 0; 
    if (p != NULL){ 
     total += sum(p->x); 
     total += sum(p->y); 
     total += sum(p->z); 
     total += p->data; 
    } 
    return total; 
} 

Dann drucken nur den Rückgabewert von sum

+0

Vielen Dank für die Lösung und für die Klärung, warum es passiert. –

Verwandte Themen