Habe ein Programm das die Länge eines vorhandenen Weges von einem Starpunkt zu einem Zielpunkt berechnen soll:
X0000
00000
00000
00000
0000X
Das klappt, solange in dem Weg keine "Kreise" auftreten (Abzweigungen sind kein Problem):
XXX00
X00X0
X0XXX
X0X0X
XXX0X
etwa liefert als Länge 12;
Problematisch wird es sobald ein Weg vor dem Ziel einen "Kreis bildet":
XXXXX
X000X
XXXXX
X0000
XXXXX
Hier kommt es zu einer Endlosschleife und dadurch zu einem Stackoverflow - den ich abfangen und stattdessen eine Fehlermeldung ausgeben möchte.
Mein Code:
Delphi-Quellcode:
class function TFelder.RestWeg(Sender: TObject; last: integer): integer;
var counter,a,b,c,d: integer;
begin
counter:=0;
if (TFelder(Sender).Fxpos=5) and (TFelder(Sender).Fypos=5) then counter:=0 //Ziel
else if (felder[TFelder(Sender).Fxpos, TFelder(Sender).Fypos-1].Ftyp<>'Weg') then counter:=11 //Falls keine Verbingung von Start zu Ziel vorhanden
else
begin
a:=10; b:=10; c:=10; d:=10;
if (TFelder(Sender).Fypos>1) and (last<>2) then //last gibt die "Richtung" an, von der gezählt wird
//-> somit keine Umkehr möglich, wass abermals zu einer Endlosschleife führen würde
a:=Restweg(felder[TFelder(Sender).Fxpos, TFelder(Sender).Fypos-1], 4)+1;
if (TFelder(Sender).Fypos<5) and (last<>4) then
b:=Restweg(felder[TFelder(Sender).Fxpos, TFelder(Sender).Fypos]+1, 2)+1;
if (TFelder(Sender).Fxpos>1) and (last<>1) then
c:=Restweg(felder[TFelder(Sender).Fxpos-1, TFelder(Sender).Fypos], 3)+1;
if (TFelder(Sender).Fxpos<5) and (last<>3) then
d:=Restweg(felder[TFelder(Sender).Fxpos+1, TFelder(Sender).Fypos], 1)+1;
counter:=min(a,b);
counter:=min(counter,c);
counter:=min(counter,d);
end;
result:=counter;
end;
Aufgerufen wird das ganze durch einen Buttonclick:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
CreepLife.text:=inttostr(Tfelder.RestWeg(felder[0,0],0));
Würde den Fehler gerne einfach mit Try ... Except ... End abfangen, und eine Fehlermeldung "Unerlaubter Weg" ausgeben - bin daran jedoch gescheitert.