![]() |
Stack overflow bei Timer
Delphi-Quellcode:
Ich sags gleich: Der Code ist von nem Freund...
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; 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? |
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... |
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 |
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; |
Re: Stack overflow bei Timer
es gibt AFAIR 3 Moeglichkeiten, um mit nem Timer nen Stackoverflow zusammenzubasteln:
greetz Mike |
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 07:13 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