Stapelüberlauf

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Stapelüberlauf

Beitrag von u-boot »

Hallo alle, heute mal ein Thema das ich glaube schon über Einsteiger hinausgeht.

Habe einige funktionen Programmiert, die sich gegenseitig aufrufen

nun die frage wie man den stack overflow verhindern kann

Schema ungefähr:

Code: Alles auswählen

function  func1:integer;
begin
 result:=max(func2,func3)
end;
 
function func2:integer;
begin
 result:=max(func1,func3)
end;
 
function func3:integer;
begin
if not(abbruchkriterium);
 result:=max(func2,func1)
end;
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Stapelüberlauf

Beitrag von carli »

u-boot hat geschrieben:Hallo alle, heute mal ein Thema das ich glaube schon über Einsteiger hinausgeht.
hm, leider nein:

ich sehe den Sinn von denen 3 Funktionen gar nicht. Die rufen sich froh und munter gegenseitig auf, aber nehmen von keinerlei Seite eine Eingabe oder sonst eine Zahl, die die Rekursion abbrechen könnte.
In dem Sinne: Klar, dass der nen Stack overflow erzeugt.

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Stapelüberlauf

Beitrag von u-boot »

nein das ist nur ein Schema ... ich wollte niemandem zumuten sich in den richtigen code reinlesen zu müssen.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Stapelüberlauf

Beitrag von carli »

Aber der Code, der dort steht, ist schwachsinn. Der führt in 100% aller Fälle zu einem Stack overflow.
Also was willst du uns damit sagen?

Benutzeravatar
theo
Beiträge: 10895
Registriert: Mo 11. Sep 2006, 19:01

Re: Stapelüberlauf

Beitrag von theo »

Irgendwann ist immer Schluss.
Du solltest deine Frage vielleicht anders stellen.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Stapelüberlauf

Beitrag von mse »

u-boot hat geschrieben: Habe einige funktionen Programmiert, die sich gegenseitig aufrufen

nun die frage wie man den stack overflow verhindern kann
Z.B. mittels Rekursionszähler oder -Flag.

Code: Alles auswählen

procedure recursivefunc1;
begin
 if recursioncounter < maxrecursionlevel then begin
  inc(recursioncounter);
  try
   //do something which can call recursivefunc1
  finally
   dec(recursioncounter);
  end;
 end;
end;
 
procedure recursivefunc2;
begin
 if not recursionflag then begin
  recursionflag:= true;
  try
   //do something which can call recursivefunc2
  finally
   recursionflag:= false;
  end;
 end;
end;
Zuletzt geändert von mse am Mi 14. Jul 2010, 22:32, insgesamt 1-mal geändert.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Stapelüberlauf

Beitrag von carli »

Aber hier rekursiert er ja immer nur noch zwischen 1 und 2 herum und kommt nie mehr in die 3.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Stapelüberlauf

Beitrag von Socke »

u-boot hat geschrieben:nein das ist nur ein Schema ... ich wollte niemandem zumuten sich in den richtigen code reinlesen zu müssen.
Da du deinen Code besser kennst, solltest du dir mal gut überlegen, ob du die Rekursion in dieser Form auch wirklich brauchst.
carli hat geschrieben:Aber der Code, der dort steht, ist schwachsinn. Der führt in 100% aller Fälle zu einem Stack overflow.
/Sign
Zur Theorie: Auf dem Stack wird bei jedem Funktionsaufruf ein Funktionseiger abgelegt, wo der Programmfluss nach dieser Funktion weiter laufen soll. Je Nach Aufrufkonvention werden auch noch Parameter oder Rückgabewerte dort abgelegt. Wenn deine Funktionen sich immer weiter gegenseitig aufrufen, wächst dein Stack immer weiter nach oben, da keine Funktion irgendwann einmal fertig ist und zur aufrufenden Funktion zurückkehrt. Und wenn dein Stack voll ist und nicht mehr weiter wachsen kann (OS gibt keinen Speicher mehr her), dann gibts nen Stack-Overflow.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten