AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stack Überlauf

Ein Thema von B1nch3N · begonnen am 1. Jun 2008 · letzter Beitrag vom 1. Jun 2008
Antwort Antwort
B1nch3N

Registriert seit: 1. Jun 2008
Ort: Herford
6 Beiträge
 
#1

Stack Überlauf

  Alt 1. Jun 2008, 19:34
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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.756 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Stack Überlauf

  Alt 1. Jun 2008, 20:01
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
Klaus
  Mit Zitat antworten Zitat
B1nch3N

Registriert seit: 1. Jun 2008
Ort: Herford
6 Beiträge
 
#3

Re: Stack Überlauf

  Alt 1. Jun 2008, 20:49
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:26 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