Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Stack overflow bei Timer (https://www.delphipraxis.net/71833-stack-overflow-bei-timer.html)

netscanner 21. Jun 2006 17:12


Stack overflow bei Timer
 
Delphi-Quellcode:
procedure SStop;                                                               // Sprung (stop)
begin
  If ((InGame1.iSp1.Top + InGame1.iSp1.Height) >= InGame1.iFloor.Top)          // Stop durch Boden
   or (InGame1.iSp1.Top <= InGame1.Top) then                                   // Stop durch Decke
    begin
      tCount := 0;
      InGame1.S.Enabled := false;
      InGame1.iSp1.Top := InGame1.iFloor.Top - InGame1.iSp1.Height
    end;
end;


procedure TInGame1.STimer(Sender: TObject);                                    // Sprung
begin
  SStop;
  tCount := tCount +1;
  If tCount < 80 then iSp1.top := iSp1.top -1
  else if tCount > 80 then
    begin
      kill;
      iSp1.top := iSp1.top +1;
    end;
end;
Ich sags gleich: Der Code ist von nem Freund...
Derjenige hat das Problem, dass er einen Stack overflow bekommt sobald dies hier im code ausgeführt wird (also der Timer gestartet wird und die else abfrage im Timer ausgeführt wird...)
Das Problem ist, dass wir weder wissen was ein Stack overflow ist, noch wie wir ihn beheben :(
Könnt ihr uns helfen?

Muetze1 21. Jun 2006 17:18

Re: Stack overflow bei Timer
 
Stack Overflow tritt vor allem auf, wenn du eine Procedure oder Function hast die sich selber wieder aufruft. Soweit ist grundlegend erstmal nichts verdächtiges in der Richtung zu erkennen, aber die Procedure Kill; fehlt aber noch. Diese solltest du mal bitte posten.

Ich sehe aber an dem Quelltext grundlegende Dinge die nicht so ganz in Ordnung sind. So ist SStop nur eine Procedure und keine Methode wie der OnTimer Ereignishandler, welcher SStop aufruft. Und durch diesen Fakt fehlen in SStop die Elemente der Klasse TInGame1 und dies wurde so gelöst, dass direkt über die Instanzenvariable auf deren Elemente zugegriffen wird. Nun hat man aber bei diesem Zugriff das Problem, dass man immer nur auf eine mögliche Instanz zugreift und somit die Aktion mit dem Timer für die komplett falsche Instanz ausführt. Dieses ist kreuz-gefährlich, daher sollte dies eigentlich behoben werden, aber ich denke mal das du bzw. dein Freund das nicht so als Problem seht.

Grundlegend bitte mal die Procedure Kill hier posten...

EDatabaseError 21. Jun 2006 17:24

Re: Stack overflow bei Timer
 
:gruebel: du könntest im Linker den Stack mal größermachen und schaun obs dann geht wenn nein dann ... :angel2: ...

Mfg
tobi

netscanner 21. Jun 2006 18:09

Re: Stack overflow bei Timer
 
Delphi-Quellcode:
procedure Kill;                                                                // Gegner tot
begin
  If ((InGame1.iSp1.Top + InGame1.iSp1.Height) > (InGame1.iEnemy1.Top)) and    //kollision von oben
     ((InGame1.iSp1.Top + InGame1.iSp1.Height) < (InGame1.iEnemy1.Top + InGame1.iEnemy1.Height)) then
    begin
      InGame1.iSp1.Top := InGame1.iFloor.Top - InGame1.iSp1.Height;
      MonsterPos;
      inc(kills);
      InGame1.lKills.Caption := 'Getötete Gegner: '+IntToStr(kills);
    end;
end;

JasonDX 21. Jun 2006 18:41

Re: Stack overflow bei Timer
 
es gibt AFAIR 3 Moeglichkeiten, um mit nem Timer nen Stackoverflow zusammenzubasteln:
  1. Den Stack zu klein halten
  2. Delphi-Quellcode:
    procedure TForm1.OnTimer1(Sender: TObject);
    begin
      OnTimer1(Sender);
    end;
  3. Delphi-Quellcode:
    procedure TForm1.OnTimer1(Sender: TObject);
    begin
      sleep(...); //Irgendeine verzoegerung, die min. so lange braucht wie der Timer bis zum naechsten Tick... Sei es Berechnungen, Funktionsaufrufe ect.
      Application.ProcessMessages;
    end;
Bei deinem Problem tippe ich auf drittens. Geh mal alle Prozeduren durch, die beim Timer-Event aufgerufen werden, und schau mal, ob du dort neue Nachrichten verarbeitest, sprich ein Application.ProcessMessages im Code schlummern hast.

greetz
Mike

netscanner 22. Jun 2006 17:40

Re: Stack overflow bei Timer
 
hat sich erledigt...eine andere prozedur die mit timer in verbindung war hat sich selbst aufgerufen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 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