Stack Overflow
-
Hallöchen,
hab ein Problem beim kompilieren. Erstelle ein Programm mit C das einen B-Baume erzeugen soll, dabei rufe ich einige Funktionen rekursiv auf. Bei einen solchen rekursiven Aufruf bricht die Komilierung plötzlich ab, mit der Begründung "stack overflow" obwohl in der Code-Zeile nicht in den Speicher geschrieben wird, sondern nur Variablen deklariert werden. Also in die Funktion geht er noch rein und noch vor den Variablen bricht er ab. Danach hab ich eine Auflistung meiner Speicheradressen und der Kompiler zeigt mir: dword ptr [ecx],eax
Kann mir einen sagen was für ein Problem ich hier habe und wie ich das beheben könnte?
Danke und Tschau Anja
-
hallo auch..
das schaut mir eher nach einer c/c++ frage aus.. bei stack overflow ist es im zweifelsfall immer eine endlosschleife.. schau einfach ob deine abbruchbedingung erfüllt wird.. (??!?! hehe.. zweifel sind geil.. erkennt ein compiler eine endlosschleife und bricht ab???).
gruss
Evil User
-
Ich denke auch, dass das mehr mit C, als mit Assembler zu tun hat.
-
Dieser Thread wurde von Moderator/in Nobuo T aus dem Forum Assembler in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Wann bricht das Programm ab?
Beim kompilieren oder beim ausführen des Programms?ist uU deine Rekursion zu tief?
-
Zeig deine rekursive Funktion.
Eine reursive Funktion wird in einem Stack abgearbeitet, aber der Stack ist nicht unendlich, falls die Funktion keine gute Abbruchbediendung hat, kann es sein, dass sie unendlich läuft. Bsp:
float pow(float a, float b) { return pow(a,b-1)*a; }
Dabei habe ich explizit das if(b==0) return 1; vergessen. Ich könnte das zwar kompilieren, die Frage ist, wie das läuft.
-
supertux schrieb:
Dabei habe ich explizit das if(b==0) return 1; vergessen.
float nicht mit == vergleichen
-
Shade Of Mine schrieb:
supertux schrieb:
Dabei habe ich explizit das if(b==0) return 1; vergessen.
float nicht mit == vergleichen
das weiß ich auch und sag das immer wieder. Aber hier habe ich float benutzt, falls jemand, das ausprobieren will. Und mit f==0 wollte ich halt den Algorithmus richtig angeben.
-
na dann machen wir halt return b?pow(a,b-1)*a:1; daraus
-
Windalf schrieb:
na dann machen wir halt return b?pow(a,b-1)*a:1; daraus
Ich hab explitiz das so weggelassen, damit es keine Abruchbbedingung gibt. Aber si ist es auch richtig.