![]() |
Stack-Überlauf
Hallo Alle Zusammen
ich habe hier eine Procedure aus meinem kartenspiel
Code:
Ich versuche mein Problem zu erklären:
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; 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? |
Re: Stack-Überlauf
Überprüfe deine Rekursionsabrüche.
Für eine genaue Analyse des Problemes ist mir der Code zu wurchtelig. |
Re: Stack-Überlauf
Was sind Rekursionsabbrüche? :oops: :cat:
|
Re: Stack-Überlauf
Rekursion: ist wenn sich eine Funktion in sich selbst ruft.
Rekursionsabrüche sind demnach die ausstiegspunkte aus der Endlosschleife. |
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. |
Re: Stack-Überlauf
Die Variable "wieviel" darf den wert 8 nicht überschreiten.
wenn ich ganz am anfang der procedure den folgenden code einsetze.
Code:
wäre das so ein rekursionsabbruch?
if wieviel > 8 then exit;
aber das hab ich probiert und es half nicht. |
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) |
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 22:06 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