rekursiver Funktionsaufruf frisst Variablen
-
Hallo!
Ich hab folgende rekursive Funktion:void iterateRight(Rational r, const char *str, int depth) { printf("iterate %s %d\n", str, depth); r.print(); printf("\n"); list.add(r, str); if (--depth==0) return; char name[MAX_NAME]; strcpy(name, str); int n=strlen(name); name[n+1]='\0'; name[n]='p'; iterateRight(r<<p, name, depth); printf("strange things happen here:\n"); printf(name); name[n]='n'; iterateRight(r<<n, name, depth); }Übergeben wird also immer eine Variable vom Typ Rational, ein String und die Zahl, der Iterationen, die noch folgen sollen, welche jedesmal dekrementiert wird.
Danach soll die Funktion zweimal aufgerufen werden, wobei an den String einmal ein "p" und einmal ein "n" angehängt wird. Dafür wird für beide Aufrufe nur eine Variable "name" verwendet, die beim zweiten iterativen Aufruf manipuliert wird. Aber anscheinend ist sie nach dem ersten rekursiven Aufruf von IterateRight() nicht mehr da. Jedenfalls bleibt das Programm beim ersten return aus der tiefsten Iterationsstufe hängen mit der Ausgabe: "strange things happen here:". Das printf(name) danach wird nicht mehr ausgeführt. Das Ende der Ausgabe:iterate ppp 1 1X^8 + -5X^7 + 10X^6 + -10X^5 + 5X^4 + -1X^3 + 0X^2 + 0X + 0 ---------------------------- 1X^7 + -5X^6 + 10X^5 + -10X^4 + 5X^3 + -1X^2 + 0X + 0 strange things happen here: 1Das gleiche Ergebnis erhalte ich, wenn ich printf(str) statt printf(name) nehme oder wenn ich zwei Variablen name1 und name2 deklariere, egal ob ich die zweite vor oder hinter dem ersten Iterationsaufruf deklariere usw. Es kann einfach nicht mehr auf sie zugegriffen werden und das Programm hängt. Es bleibt immer nach dem return vom ersten Iterationsaufruf und dem "strange things happen here" hängen, also dann, wenn auf eine dieser String-Variablen zugegriffen wird - die ja eigentlich noch da sein sollten (oder?).
Ein printf("%d\n", depth) dagegen funktioniert noch einwandfrei, ebenso wie r.print().
Woran kann das liegen?
-
Welch ein Quelltext. Sowas hab ich lange nicht mehr gesehen.

Versuch doch mal statt
printf(name);printf("%s", name);Vielleicht taucht name dann wieder auf.

-
Mit name[n+1] mit n == strlen(name) schreibst du außerhalb des Arrays herum. Das sollte es erklären.
-
Solange n<MAX_NAME+1 ist nicht.
-
Ah, das fehlende "%s" bei printf hatte ich übersehen...
Da er strcpy einsetzt ist da eh eine potenzielle Fehlerquelle. strncpy sollte da besser passen.
Edit:
Du meinst solange n < (MAX_NAME - 1) ist.Denn wenn MAX_NAME zB 4 ist, ist name[4]
strlen(name) und somit n wäre also maximal (hoffentlich) 3. name[n+1] bzw. name[3+1] ist dann schon außerhalb des Limits.
-
Schau dir mal im C++-Buch deiner Wahl die Themen Input/Output (I/O-Streams) und Strings an. Sollte dein C++-Buch mit const char*s und printf() arbeiten, ändere mit Tipp-Ex den Titel in C-Buch, stells ins Regal und kauf dir ein C++-Buch. Printf und char-Arrays als strings sind C-Dinosaurier, die nur aus Kompatibilitätsgründen in C++ funktionieren, aber eigentlich nciht zur Sprache gehören.
-
Fellhuhn schrieb:
Edit:
Du meinst solange n < (MAX_NAME - 1) ist.Ja, das meinte ich eigentlich.

-
Sorry, dass ich mich hier nicht wieder gemeldet hab. Hatte ich ganz vergessen, dass ich das hier geschrieben hab. Fehler hab ich gefunden. Aber weiß nicht mehr, was das war.
Danke trotzdem für all die Antworten