AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stacküberlauf

Ein Thema von ticcoid · begonnen am 31. Mär 2007 · letzter Beitrag vom 31. Mär 2007
Antwort Antwort
ticcoid

Registriert seit: 12. Dez 2006
3 Beiträge
 
#1

Stacküberlauf

  Alt 31. Mär 2007, 03:14
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
Angehängte Dateien
Dateityp: rar ads_768.rar (215,0 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Stacküberlauf

  Alt 31. Mär 2007, 08:19
Hai Christian,

ersteinmal: "Herzlich Willkommen in der Delphi-PRAXIS"

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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#3

Re: Stacküberlauf

  Alt 31. Mär 2007, 08:35
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...
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
ticcoid

Registriert seit: 12. Dez 2006
3 Beiträge
 
#4

Re: Stacküberlauf

  Alt 31. Mär 2007, 10:43
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz