Autor Beitrag
hui1991
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: 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:
ausblenden 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:
ausblenden Delphi-Quelltext
 
9:
10:
11:
12:
13:
{ ... }
type
  TSnake = class(TImageSprite)
  public
    Art: Integer;
  end;


ausblenden Delphi-Quelltext
 
33:
34:
35:
{ ... }
var
  Form1: TForm1;
  snake: Array[0..10,0..10of TSnake;


Also ich weis jetzt nicht was falsch ist.. Bitte helft mir.

MfG
hui1991
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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:

ausblenden 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
2:
3:
For X := 0 T0 Do  // <-- hier mal einen Breakpoint drauf setzen und Y abfragen
  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.