Registriert seit: 14. Mär 2005
14 Beiträge
Delphi 2005 Personal
|
Re: Stack Überlaufen in einer Rekursion
16. Jun 2005, 21:26
Danke an alle! Das funktioniert jetzt. Hab das so gelöst:
Delphi-Quellcode:
PROCEDURE TForm1.GetArea(x,y: Integer);
BEGIN (* PROC TForm1.GetArea *)
field[x,y].hidden := false;
field[x,y].q := false;
IF field[x,y].Index = 14 THEN
BEGIN (* IF field[x,y].Index = 14 *)
IF (x>0) AND (y>0) THEN
IF field[x-1, y-1].hidden THEN
GetArea (x-1, y-1);
IF (x>0) THEN
IF field[x-1, y].hidden THEN
GetArea (x-1, y);
IF (y>0) THEN
IF field[x, y-1].hidden THEN
GetArea (x, y-1);
IF (x<9) THEN
IF field[x+1, y].hidden THEN
GetArea (x+1, y);
IF (y<9) THEN
IF field[x, y+1].hidden THEN
GetArea (x, y+1);
IF (x<9) AND (y<9) THEN
IF field[x+1, y+1].hidden THEN
GetArea (x+1, y+1);
IF (x<9) AND (y>0) THEN
IF field[x+1, y-1].hidden THEN
GetArea (x+1, y-1);
IF (x<0) AND (y<9) THEN
IF field[x-1, y+1].hidden THEN
GetArea (x-1, y+1);
END; (* IF field[x,y].Index = 14 *)
END; (* PROC TForm1.GetArea *)
Das merkwürdige ist: Mache ich diese Überprüfung nicht, dann geht die Grafikdarstellung, mache ich sie, bekomme ich Zugriffsverletzugen...
Prozedur zum "anmalen":
Delphi-Quellcode:
PROCEDURE TForm1.paintmap;
VAR y, z: Integer;
BEGIN (* PROC TForm1.paintmap *)
FOR y := 0 TO 8 DO
FOR z := 0 TO 8 DO
BEGIN (* FOR 0 TO 8 *)
IF field[y, z].hidden THEN
iGame.Canvas.Draw(y*16, z*16, symbols[15]^)
ELSE (* ELSE field[y, z].hidden *)
IF field[y,z].marked THEN
iGame.Canvas.Draw (y*16, z*16, symbols[11]^)
ELSE (* ELSE field[y,z].marked *)
IF field[y,z].q THEN
iGame.Canvas.Draw(y*16, z*16, symbols[13]^)
ELSE (* ELSE field[y,z].q *)
iGame.Canvas.Draw(y*16, z*16, symbols[field[y,z].index]^);
END; (* FOR 0 TO 8 *)
END; (* PROC TForm1.paintmap *)
"Take A Look To The Sky Just Before You Die,
It's The Last Time You Will!"
- James Hetfield
|