Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Stacküberlauf (https://www.delphipraxis.net/89443-stackueberlauf.html)

ticcoid 31. Mär 2007 02:14


Stacküberlauf
 
Liste der Anhänge anzeigen (Anzahl: 1)
hallo,

wenn ich mein programm durchlaufen lassen will zeigt er mir nach der 4. tabelle immer folgenden Fehler an! STACKÜBERLAUF

Woran liegt es und wie kann ich es verhindern? Ich stelle mal den code zur verfügung!

Mfg
Christian

Sharky 31. Mär 2007 07:19

Re: Stacküberlauf
 
Hai Christian,

ersteinmal: "Herzlich Willkommen in der Delphi-PRAXIS" :hello:

Zitat:

Zitat von ticcoid
...Woran liegt es und wie kann ich es verhindern? Ich stelle mal den code zur verfügung!

Das liegt daran das Du in deinem Programm eine "rekursion" eingebaut hast. Jede ButtonClick Methode ruft sich selber mehrmals selber auf. Da bei dem erneuten Aufruf einer Mothode aus der Methode selbst daten Daten auf den Stack gelegt werden müssen ist dieser irgend wann voll.

Ich habe mal dein Button1Click als Beispiel genommen und auf die Entscheidenden Codezeilen reduziert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if z = 0 then
    randomize; // Randomize sollte man nur einmal beim start des Programmes aufrufen
  if z = 0 then
    blackliste1_erstellen;
  zufallszahlen;
  blackliste2_pruefen; // Diese Methode ruft Button1OnClick wieder auf
end;

procedure tform1.blackliste2_pruefen;
var
  i, m, n: Integer;
begin
  for m := 1 to 30 do
    for n := 1 to 30 do
      if ar_akt_tabelle[m] = ar_blackliste[n] then
      begin
        z := 1;
        inc(versuche2);
        label1.Caption := inttostr(versuche2);
        Button1.Click; // Hier wird Button1.Click erneut aufgerufen
                       // Wenn Du die For-Do Schleife höher setzt zum beispiel ein 90
                       // anstelle der 30 würdest Du schon hier einen Stacküberlauf bekommen.
      end;
  z := 0;
end;
Ich denke jetzt erkennst Du das Problem.

turboPASCAL 31. Mär 2007 07:35

Re: Stacküberlauf
 
Hi,

du rufst zB. in der Procedure Button3Click die Procedure blackliste4_pruefen auf.
In dieser rufst du dann Button3.Click auf was wiederum Button3Click ausführt.

Das ist eine prima Schleife aus dem das Programm nicht mehr raus kommt wenn dann nicht
irgend wann der Stacküberlauf auftreten würde.

Diesen Fehler machst du fast bei jeder Procedure mit dem Namen blacklisteX_pruefen.

Diese Aktionen:

Delphi-Quellcode:
i := 1;
  ar_akt_tabelle[i] := inttostr(a[1]) + inttostr(a[2]);
          //ListBox2.Items.Add(ar_akt_tabelle[i]);
  inc(i);
  ar_akt_tabelle[i] := inttostr(a[2]) + inttostr(a[1]);
          //ListBox2.Items.Add(ar_akt_tabelle[i]);
  inc(i);
  ar_akt_tabelle[i] := inttostr(a[2]) + inttostr(a[3]);
          //ListBox2.Items.Add(ar_akt_tabelle[i]);
  inc(i);
  ar_akt_tabelle[i] := inttostr(a[3]) + inttostr(a[2]);
          //ListBox2.Items.Add(ar_akt_tabelle[i]);
kann man auch in einer For-Schleife vereinfachen was dann zu einer wirklich besseren
Übersicht des Programmes führt.



//Roter Kasten: Man(n) Sharky, tipp langsamer... :mrgreen:

ticcoid 31. Mär 2007 09:43

Re: Stacküberlauf
 
danke für eure bemühungen. waren sehr hilfreiche für mich. bin nu an einer anderen schleife bei. mal gucken was draus wird. vielen dank

mfg
christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz