![]() |
Stack Überlauf
Hallo,
hoffe ihr könnt mir helfen. Bekomme in meinem Programm einen Stack Überlauf. Wenn ich das Programm jedoch nur maximal 4 Felder bearbeiten lasse dann geht es ganz normal und klappt perfekt. Hier erstmal der Code: Hier wird der Fehler angezeigt der kommt wenn ich das Programm arbeiten lasse.
Delphi-Quellcode:
Die normale Rekursion ist diese hier:
Procedure Sortieren(z:integer);
Var tauschen1: Array [1..4] of Integer; tauschen2: Array [1..4] of Integer; Begin if benutzt<>(9-aktuell) then begin for i:=1 to 4 do begin tauschen1[i]:= stellung[z,i]; tauschen2[i]:= farbe[z,i]; end; for i:=(z)to 8 do begin for ii:=1 to 4 do begin stellung[i,ii]:= stellung[i+1,ii]; farbe[i,ii]:= farbe[i+1,ii]; end; end; for i:=1 to 4 do begin stellung[9,i]:= tauschen1[i]; farbe[9,i]:= tauschen2[i]; end; benutzt:=benutzt+1; end else begin benutzt:=0; aktuell:=aktuell-1; end; End;
Delphi-Quellcode:
Weitere Proceduren:
Procedure Arbeiten;
Begin if aktuell=1 then AnfangsKarte; if (aktuell<10) AND (aktuell>1) then begin if Vergleichen(aktuell)= 1 then begin gedreht:=0;benutzt:=0; aktuell:=aktuell+1; end else Drehen(aktuell); if aktuell<10 then Arbeiten; end; End;
Delphi-Quellcode:
Könnt ihr da irgendwas erkennen?
Function Vergleichen(x:integer):Integer;
Begin case aktuell of 2: if (stellung[x,4]<>stellung[x,2]) and (farbe[x,4]=farbe[x,2]) then result:=1 else result:=0; 3: if (stellung[x,4]<>stellung[x,2]) and (farbe[x,4]=farbe[x,2]) then result:=1 else result:=0; 4: if (stellung[x,1]<>stellung[x-3,3]) and (farbe[x,1]=farbe[x-3,3]) then result:=1 else result:=0; 5: if (stellung[x,4]<>stellung[x-1,2]) and (farbe[x,4]=farbe[x-1,2]) AND (stellung[x,1]<>stellung[x-3,3]) and (farbe[x,1]=farbe[x-3,3]) then result:=1 else result:=0; 6: if (stellung[x,4]<>stellung[x-1,2]) and (farbe[x,4]=farbe[x-1,2]) AND (stellung[x,1]<>stellung[x-3,3]) and (farbe[x,1]=farbe[x-3,3]) then result:=1 else result:=0; 7: if (stellung[x,1]<>stellung[x-3,3]) and (farbe[x,1]=farbe[x-3,3]) then result:=1 else result:=0; 8: if (stellung[x,4]<>stellung[x-1,2]) and (farbe[x,4]=farbe[x-1,2]) AND (stellung[x,1]<>stellung[x-3,3]) and (farbe[x,1]=farbe[x-3,3]) then result:=1 else result:=0; 9: if (stellung[x,4]<>stellung[x-1,2]) and (farbe[x,4]=farbe[x-1,2]) AND (stellung[x,1]<>stellung[x-3,3]) and (farbe[x,1]=farbe[x-3,3]) then result:=1 else result:=0; end; End; Procedure Drehen(y:integer); VAR a,b:integer; Begin if gedreht<3 then begin a:=farbe[y,1]; b:=stellung[y,1]; for i:=1 to 3 do begin farbe[y,i]:=farbe[y,i+1]; stellung[y,i]:=stellung[y,i+1]; end; farbe[y,4]:=a; stellung[y,4]:=b; gedreht:=gedreht+1; end else begin gedreht:=0; Sortieren(y); end; Schöne Grüße B1nch3N |
Re: Stack Überlauf
Delphi-Quellcode:
Wenn in Deinem Code bei Vergleichen(aktuell) keine 1 herauskommt
Procedure Arbeiten;
Begin if aktuell=1 then AnfangsKarte; if (aktuell<10) AND (aktuell>1) then begin if Vergleichen(aktuell)= 1 then begin gedreht:=0; benutzt:=0; aktuell:=aktuell+1; end else Drehen(aktuell); if aktuell<10 then Arbeiten; end; End; dann wird aktuell nicht erhöht. Danach wird die Prozedur wieder aufgerufen. Drehen erhöht den Wert von aktuell nicht. Stacküberlauf deutet daraufhin das die Rekursion in einer Endlosschleife läuft. Grüße Klaus |
Re: Stack Überlauf
drehen soll aktuell ja auch nich erhöhen..
aktuell soll nur erhöht werden wenn bei vergleich ne 1 rauskommt.. wenn dies nicht der fall ist dann soll die karte gedreht werden und neu verglichen werden.. wenn die karte einfach nicht passt dann soll durch sortieren eine neue karte genommen werden.. solange bis iwann eine karte vorhanden ist die passt und vergleichen auf 1 bringt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 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