Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Stack-Überlauf (https://www.delphipraxis.net/8446-stack-ueberlauf.html)

Moyyer 4. Sep 2003 18:08


Stack-Überlauf
 
Hallo Alle Zusammen
ich habe hier eine Procedure aus meinem kartenspiel

Code:
procedure TForm1.naechsterspieler(spieler, wieviel, welchezahl: integer);
var c, d, wie: integer;
    a: array [1..8] of integer;
    kleft: integer;
begin
if spieler = 1 then spielerzug(viel, zahl) else
 begin
   wieviel := viel;
   kleft := mitte;
   for c := 0 to 7 do begin if lb[spieler].Items.Strings[c][2] = '1' then a[1] := a[1] + 1;
                            if lb[spieler].Items.Strings[c][2] = '2' then a[2] := a[2] + 1;
                            if lb[spieler].Items.Strings[c][2] = '3' then a[3] := a[3] + 1;
                            if lb[spieler].Items.Strings[c][2] = '4' then a[4] := a[4] + 1;
                            if lb[spieler].Items.Strings[c][2] = '5' then a[5] := a[5] + 1;
                            if lb[spieler].Items.Strings[c][2] = '6' then a[6] := a[6] + 1;
                            if lb[spieler].Items.Strings[c][2] = '7' then a[7] := a[7] + 1;
                            if lb[spieler].Items.Strings[c][2] = '8' then a[8] := a[8] + 1;
                      end;

   for d := 1 to 8 do
                     if (a[d] = wie) and (d >= welchezahl) then
                         begin showmessage('Der Spieler ' + inttostr(spieler) + ' wird mit ' + inttostr(d) + ' legen.');
                               label7.Caption := inttostr(d);
                               for c := 0 to 7 do
                               if lb[spieler].Items.Strings[c][2] = inttostr(d) then
                                    begin k[(spieler * 8) - (7 - c)].Left := kleft;
                                          kleft := kleft + 15;
                                          k[(spieler * 8) - (7 - c)].top := mitte1;
                                          lb[spieler].Items.Strings[c] := ' ';
                                          labels[spieler].Caption := 'Hat ' + inttostr(wie) + inttostr(d) + ' gelegt';
                                    end;
                                          spieler := spieler + 1;
                                          if spieler > 4 then
spieler := 2;
                                          naechsterspieler(spieler ,wie ,d + 1);
                                    end;



   end;
   label5.Caption := 'spieler kann nicht legen';
   spieler := spieler + 1;
   if spieler > 4 then spieler := 2;
   naechsterspieler(spieler ,wie ,d + 1);
end;
Ich versuche mein Problem zu erklären:
Die oben angezeigte procedure sind die Computer-Spieler.

Doch es kommt immer zu einem sogennanten Stack-Überlauf.
Was ist das? Wie kann ich es beheben? wo liegt der Fehler?
Wodurch wird es verurscht?

neolithos 4. Sep 2003 18:11

Re: Stack-Überlauf
 
Überprüfe deine Rekursionsabrüche.

Für eine genaue Analyse des Problemes ist mir der Code zu wurchtelig.

Moyyer 4. Sep 2003 18:22

Re: Stack-Überlauf
 
Was sind Rekursionsabbrüche? :oops: :cat:

neolithos 4. Sep 2003 18:28

Re: Stack-Überlauf
 
Rekursion: ist wenn sich eine Funktion in sich selbst ruft.

Rekursionsabrüche sind demnach die ausstiegspunkte aus der Endlosschleife.

neolithos 4. Sep 2003 18:31

Re: Stack-Überlauf
 
Stacküberlauf:
Deine lokalen Variablen werden, während eine Andere Funktion ausgeführt wird, auf dem Stack gespeichert.
Der ist irgentwann voll!
Zu viele Rekursionen oder Schachtelungen!

Das letzte kenn ich nur noch aus DOS-Zeiten. Da heute in der Windows-Welt der Stack größer als 64k ist.

Moyyer 4. Sep 2003 18:37

Re: Stack-Überlauf
 
Die Variable "wieviel" darf den wert 8 nicht überschreiten.
wenn ich ganz am anfang der procedure den folgenden code einsetze.

Code:
if wieviel > 8 then exit;
wäre das so ein rekursionsabbruch?
aber das hab ich probiert und es half nicht.

Moyyer 4. Sep 2003 18:41

Re: Stack-Überlauf
 
entschuldigung; die variable heißt "welche zahl"
(Diese Variable gibt die Karte an welche gerade liegt
1 = 7, 2 = 8, 3 = 9, 4 = Bube, ..., 8 = Ass)

neolithos 4. Sep 2003 18:45

Re: Stack-Überlauf
 
Ich mach jetzt Feierabend! Bis Morgen!

Du kannst ja mal deinen Code ordentlich Formatieren so das ein Fremder auch durchsieht.
Dann schau mal sofern der Fehler noch nicht gefunden die ganze sache noch mal an!


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