Entwickler-Ecke
Sonstiges (Delphi) - For schleife Rückwärts ohne downto???
hui1991 - Di 31.10.06 10:29
Titel: For schleife Rückwärts ohne downto???
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 - 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?
alzaimar - 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.
hui1991 - 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 - 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/F8) 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!