Autor |
Beitrag |
hui1991
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Di 31.10.06 10:29
Ich hab mal wieder ein Problem.
Ich versuche ein kleinen Snake Clone zu machen, mir ist aber aufgefallen, wenn ich mit dem Debugger auf Zeile 76 hin gehe dann ist snake[4,3].Art das hier 'snake[x,y].Art: Inaccessible value' auserdem, dann ist mir auf gefallen, das es mit 11 Begin und mit 1 aufhört, diese schleife:
Delphi-Quelltext 72: 73: 74: 75: 76: 77: 78: 79: 80: 81:
| { ... } procedure TForm1.Gitterzeichnen; var x,y,art: Integer; begin For x:=0 to 10 do begin For y:=0 to 10 do begin snake[x,y].image := dximagelist1.items[snake[x,y].Art]; end; end; end; |
Kann mir einer helfen das es mit 0 beginnt und mit 10 aufhört, bei mir kommt immer ein Fehler, warscheinlich, weil ich es so gemacht habe:
Delphi-Quelltext 9: 10: 11: 12: 13:
| { ... } type TSnake = class(TImageSprite) public Art: Integer; end; |
Delphi-Quelltext 33: 34: 35:
| { ... } var Form1: TForm1; snake: Array[0..10,0..10] of TSnake; |
Also ich weis jetzt nicht was falsch ist.. Bitte helft mir.
MfG
hui1991
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 31.10.06 10:34
Das die Schleife rückwärts läuft, ist eine Optimierung, die der Compiler vornimmt. Ob man das ausschalten kann, weiß ich nicht, aber das wird wahrscheinlich dein Problem nicht lösen. Hast du denn "Art" jeweils vernünftig initialisiert? Hat die dxImageList genügend Elemente?
_________________ We are, we were and will not be.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 31.10.06 10:45
Fragst Du im Debugger in Zeile 76 'snake[x,y].art' ab? Klar geht das nicht, denn y ist in Zeile 76 nicht definiert. Die beste Möglichkeit, Debugausgaben hinzubekommen, ist immer noch 'OutputDebugString', z.B. so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Gitterzeichnen; var x,y,art: Integer; begin For x:=0 to 10 do begin For y:=0 to 10 do begin OutputDebugString (Format ('X:%d, Y:%d, Art=%d',[x,y, snake[x,y].Art])); snake[x,y].image := dximagelist1.items[snake[x,y].Art]; end; end; end; |
In Delphi öffnest du die Ereignisanzeige und stellst sie so ein, das Debugnachrichten angezeigt werden.
In deiner Schleife ist es doch absolut egal, wie rum x und y läuft.
_________________ Na denn, dann. Bis dann, denn.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 31.10.06 11:06
Wie swchon gesagt wurde, läuft sie auf Grund der Optimierung rückwärts und hier kannst du den Grund nachlesen:
www.michael-puff.de/..._for_backwards.shtml
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Di 31.10.06 11:22
Ich hab meinen Code gespeichert und gestartet, dann kam error, dann hab ich ihn geschlossen, geöffnet und geladen und etz kam kein Error... Warum kommt er diesmal nicht? Das versteh ich nicht, das ist bei mir öfters. Also wenn ich x: 7 und y:11 im Debuger stehen hab, öffnet er mir aber x: 4 y: 0. Naja egal.. jetzt scheint es zu funktionieren. Also Danke für eure Antworten. Wenn man da nichts machen kann, dann muss es halt so sein. Das eine 'For x:=0 to 10' schleife mit '11' anfängt.
MfG
hui1991
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 31.10.06 11:36
Du hast das, glaube ich, noch nicht ganz verstanden. Dort, wo Du einen Breakpoint hinsetzt (oder auch beim durchschreiten des Programms mit F7/F  ist deine Zählvariable gar nicht definiert. Selbstverständlich fängt eine Zählschleife 'For Y:=0 To 10' mit 0 (oder 10) an, je nachdem, was der Compiler draus macht. Du kannst Dir aber ganz sicher sein, das die For-Schleife korrekt zählt, sofern auch nur der leiseste Verdacht besteht, das die Reihenfolge irgendwie eine Rolle spielen könnte.
Aber was ist denn 'Y', wenn die Zählschleife fertig ist? Per definitionem ist 'Y' dann nicht mehr definiert, bzw. kann man sich nicht darauf verlassen, das in 'Y' etwas sinnvolles drinsteht. In der Tat ist es aber so, das nach dem letzten Schleifendurchlauf Y=11 sein muss (besser: müsste). Ist auch irgendwie logisch, denn es wird ja immer eins zu Y zuaddiert, bis eben Y>10 ist.
So, jetzt zu deinen beiden Schleifen.
Delphi-Quelltext 1: 2: 3:
| For X := 0 T0 Do For Y:=0 To 10 Do .... |
Beim ersten Durchlauf ist Y irgendwas, vermutlich 0 (kann aber auch 352512341351 sein). Oben schrieb ich, das Y nach Beendigung der For-Y-Schleife zwar offiziell undefiniert, aber inoffiziell (laut Debugger) =11 ist.
Nun gilt hier (frei nach Sepp Herberger): "Nach der Schleife ist vor der Schleife". Y ist also NACH der Schleife 11. Also wird Y VOR dem nächsten Ausführen der For-Y-Schleife immer noch 11 sein.
_________________ Na denn, dann. Bis dann, denn.
|
|
|