Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Stack Überlauf (https://www.delphipraxis.net/114852-stack-ueberlauf.html)

B1nch3N 1. Jun 2008 19:34


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:
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;
Die normale Rekursion ist diese hier:
Delphi-Quellcode:
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;
Weitere Proceduren:
Delphi-Quellcode:
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;
Könnt ihr da irgendwas erkennen?

Schöne Grüße B1nch3N

Klaus01 1. Jun 2008 20:01

Re: Stack Überlauf
 
Delphi-Quellcode:
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;
Wenn in Deinem Code bei Vergleichen(aktuell) keine 1 herauskommt
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

B1nch3N 1. Jun 2008 20:49

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