Autor Beitrag
furkal
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 28.07.03 12:12 
Moin, Moin! :D

Ich habe ein Problem mit der Delphi-unterstützen Anzeige von Variablen-Inhalten beim Debuggen.

Da wird eine Funktion aufgerufen, die sich selbst aufruft und einen Zähler als normalen Parameter beinhaltet, der die Rekursionsschritte zählt.
Er wird am Anfang jedes Funktionsaufrufes inkrementiert und wurde zu Beginn mit Null initialisiert.

Wenn ich nun die Funktion schrittweise debugge und mir den Inhalt der Zählervariablen anzeigen lasse (Mauszeiger drüber halten), dann ist die Anzeige beim ersten Schritt noch korrekt (=1).
Nach dem ersten Rekursionsschritt jedoch enthält sie irgendwelche dubiosen werte (125340 oder so).

Weiß jemand, wie das zustande kommt? Und wie man da Abhilfe schaffen kann?

Ich poste auch gern den Quelltext, wenn's hilft!

Gruß Daniel
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 28.07.03 12:45 
Na dann ans muntere raten.. ;) - Quellcode wär also vielleicht ganz praktisch..! :roll:

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
furkal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 28.07.03 13:29 
Ok, zunächst eine kleine Erläuterung, dann der Quellcode:

Die Funktion soll prüfen, ob um die Zelle (Parameter: row,col) in bestimmtem Abstand (durch Parameter depth reguliert) ein Wasserfeld ist.
Zurückgeben soll sie die Position des nächste Wasserfeldes, wenn eins vorhanden ist, ansonsten die Position (-1,-1).
ausblenden Delphi-Quelltext
1:
2:
3:
4:
type   Tposition=record
                          row:integer;
                          col:integer;
                        end;

Aufruf:
ausblenden Delphi-Quelltext
1:
k:=WaterScan(SpielerPositionReihe, SpielerPositionSpalte,0,SpielerPos);					


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
function WaterScan(row,col,depth;integer;plPos:tPosition):tposition;
var PosA,Posb,PosC,PosD:tPosition;

begin
   inc(depth);

  //initialisieren der Temporären Positionen

   PosA:=MakePos(-1,-1); PosB:=MakePos(-1,-1); posc:=MakePos(-1,-1);  
   posd:=MakePos(-1,-1);

 //Absuchen der umgebenen Felder nach Wasser, wenn sie vom Spieler
 // begehbar, also 'Walkable' sind und die Rekursionstiefe 'depth=3'  
 // noch nicht überschritten wurde.

  if Walkable2(row+1,col) and (depth<4then    //unterhalb der akt. Positio
    if IsWasser(row+1,col) then   
         PosA:=MakePos(row+1,col)   //Feld ist Wasser-> Speichern
    else
       PosA:=WaterScan(row+1,col,depth,plpos); //rekursiver Aufruf

  if Walkable2(row-1,col) and (depth<4)  then //oberhalb
    if IsWasser(row-1,col) then
       posb:=MakePos(row-1,col)
     else
       posb:=WaterScan(row-1,col,depth,plpos);

  if Walkable2(row,col+1)and (depth<4then //rechts
    if IsWasser(row,col+1then
       posc:=MakePos(row,col+1)
     else
       posc:=WaterScan(row,col+1,depth,plpos);

  if Walkable2(row,col-1)and (depth<4then //links
    if IsWasser(row,col-1then
         posd:=MakePos(row,col-1);
     else
         posd:=WaterScan(row,col-1,depth,plpos,f);

// Functions-Resultat ist die Wasser-Position von PosA bis PosD, die am 
// nächsten am Spieler (hier:plpos) dran ist oder diejenige, die nicht 
// (-1,-1) ist. Sind alle Pos=(-1,-1) dann ist auch das Resultat (-1,-1).
WaterScan:=NearerPos(posa,NearerPos(posb,NearerPos(posc,posd,plpos),plpos),plpos);

end;

Wenn Dir irgendetwas unklar ist, dann erklär ich's gerne!
furkal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 28.07.03 21:24 
Hmm.. mir scheint, die Funktion ist korrekt... vielleicht kann Delphi
einfach Variableninhalte in Rekursionen nicht anzeigen...!?

.....
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Mo 28.07.03 22:14 
Hallo Daniel!

In Deinem Programm vermisse ich etwas wichtiges: VAR! Die Variable "depth" wird in der Prozedur verändert und sollte deshalb auch als VAR deklariert werden, also
ausblenden Delphi-Quelltext
1:
function WaterScan(row,col:integer; var depth:integer;plPos:tPosition):tposition;					

Sonst wird die Änderung nämlich nicht an den Aufrufer weitergegeben.

Gruß

Dietmar Brüggendiek