Entwickler-Ecke

Sonstiges (Delphi) - For - Schleifenvariable


Thunderman - Mi 12.06.02 14:29
Titel: For - Schleifenvariable
Hallo!

Ich habe in einer Prozedur eine ganz normale For-Schleife:

Quelltext
1:
2:
3:
4:
for I:=0 to 5 do
begin
...
end;

Das problem ist, dass er nicht von 0 nach 5 zählt, sondern von 6 nach 1. :(
Wenn ich for I:=5 downto 0 mache, beginnt er bei -6.
Vor der Schleife gibt es noch ein paar andere For-Schleifen mit der Variablen I, aber auch das verwenden einer anderen Variablen bringt nichts. Ich kann das Problem zwar durch entsprechendes subtrahieren umgehen, aber trotzdem würde ich mal gerne wissen, wie man diese Zählerei von Delphi unterbinden kann.


Tino - Mi 12.06.02 14:36

Das liegt wohl an den Optimierungen von Delphi! Wenn Delphi so eine Optimierung macht dann sollte diese Änderung an der Programmlogik nichts ändern.

Wenn Du z. B. das hier machst:

Quelltext
1:
2:
For i := 1 To 5 Do
  z := z + i;
dürfte keine Optimierung gemacht werden! Wenn Du aber z. b. das hier machst:

Quelltext
1:
2:
For i := 1 To 5 Do
  Str := Str + 'Hallo' + #32;
dann könnte Delphi diesen Code optimieren da ja völlig egal ist ob von 1 bis 5 oder von 3 bis 8 gezählt wird!

Gruß


Klabautermann - Mi 12.06.02 14:39

Hallo Thunderman,

wahrscheinlich veränderst du die zählvariable versehendlich an einer anderen Stelle im Code.

Kanst du mal einen größeren Source schnipzel schicken. Am besten mit allem in der FOR-Schleife.
Als was hast du denn I deklariert ist das vieleicht ein exotischer aufzählungstyp?

Wie gesagt, wenn du mehr Quelltext postest können wir besser suchen helfen.

Gruß
Klabautermann


Udontknow - Mi 12.06.02 14:57

Ich würde auch auf die Optimierung in Delphi tippen. Zeigt dir der Debugger diese Werte für I an? Wird denn I überhaupt in der Schleife benutzt? Wenn nein, packe mal ein "ShowMessage(IntToStr(i));" in deine Schleife. Wie ist das Verhalten dann?


Tino - Mi 12.06.02 15:03

Klabautermann hat folgendes geschrieben:
wahrscheinlich veränderst du die zählvariable versehendlich an einer anderen Stelle im Code.

Schleifen-Zählervariablen können nicht im Code geändert werden. Dann müsste es einen Compilermeldung geben.

Gruß


Klabautermann - Mi 12.06.02 15:12

Tino hat folgendes geschrieben:

Schleifen-Zählervariablen können nicht im Code geändert werden. Dann müsste es einen Compilermeldung geben.


Du hast recht, ich krige es nicht hin. Dabei war ich mit siecher, dass mit Turbo Pascal 7 eine möglichkeit eingeführt wurde, um dies möglich zu machen. Da hatte mein Infolehrer doch damals so gegen gewettert (ich muss zugeben ich hatte noch nie das bedürfnis das zu versuchen).

Gruß
Klabautermann


Arakis - Mi 12.06.02 15:24
Titel: While-Schleife
Ich weiß, dass mit der FOR-Schleife ist ein bisschen unglücklich. Nimm doch stattdessen eine while-Schleife:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  while i < 10 do
  begin
    {code...}
    inc(i); //Ganz wichtig, sonst Unendlichschleife!
  end;
end;


Bis dann
user defined image


overmoon - Mi 12.06.02 20:14
Titel: for-schleifen-mörder
Hiho!

Man KANN den Zähler in einer Schleife ändern,
aber das ist wirklich gar nicht schön,
geradezu eine Vergewaltigung an Delphi.

Da nehme man doch lieber eine while-Schleife.

Aber so ginge es mit einer For-Schleife.


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:
procedure BÖSE;
var index: integer;
label hin, zurueck;
begin
     for index := 1 to 10 do
     begin
          zurueck:

          ShowMessage(IntToStr(index));

          if index = 3 then goto hin;
     end;

     Exit;

     hin:
     
     index := 7;

     goto zurueck;
end;


// Ausgabe: 1,2,3,7,8,9,10

und das funktioniert tatsächlich .... Variable ändern mit einem kleinem Sprung

overmoon


Thunderman - Mi 12.06.02 20:40
Titel: Mein Delphi spinnt
Hallo!

Ich glaube mitlerweile mein delphi spinnt:
Erstmal darf er die Schleife so nicht optimieren, da ich mit der Variablen auf ein Array [0..5] zugreife. und wenn er da bei 6 oder -6 anfängt funktioniert das nicht so ganz.
Jetzt compiliert er aber manche Befehle gar nicht mehr in das Programm ein, wie zum Beispiel

Quelltext
1:
2:
Spieler.render;
Partikelsystem.render;
Hier lässt er einfach den 2. Befehl aus. Im Quelltext erscheint auch kein blauer Punkt, also er kompiliert es gar nicht erst. Dabei muss der Befehl unbedingt aufgerufen werden. Bei einem weiteren Versuch nach einem Neustart von Delphi jetzt kommt sogar der blaue Punkt, der Debugger bleibt bei einem Haltepunkt dort stehen, führt aber dann einen ganz anderen Befehl aus, nämlich den nächsten.
Ich denke da wird nur eine Neuinstallation helfen, oder seht ihr andere Möglichkeiten/Gründe für dieses Problem?


Tino - Mi 12.06.02 22:36
Titel: Re: for-schleifen-mörder
overmoon hat folgendes geschrieben:
Man KANN den Zähler in einer Schleife ändern
NEIN -> Innnerhalb einer Schleife nicht :D


Udontknow - Do 13.06.02 09:09

Sag niemals nie! 8)


Quelltext
1:
2:
3:
for i:=1 to 10 do begin
  Inc(Integer((@i)^));
end;


Cu, :wink:
Udontknow


Klabautermann - Do 13.06.02 09:55

Hallo Thunderman,
hast du mal versucht über Projekt->Alle erzeugen zu compilieren? Vieleicht hilft das.

Gruß
Klabautermann


Tino - Do 13.06.02 10:18

Udontknow hat folgendes geschrieben:
Sag niemals nie! 8)

Ok, ich gebe mich geschlagen... :P


Thunderman - Do 13.06.02 13:48

Hallo!

Hm, also das mit der Prozedur funktioniert schonmal. Aber mit einzelschritt komme ich da nicht hin. Ein Breakpoint in der Prozedur selbst wird aber erreicht. Also die wird ausgeführt. Trotzdem merkwürdig. Werde mich jetzt also erstmal wieder um das eigentliche Problem mit der For-Schleife kümmern.


MathiasH - Fr 14.06.02 19:15

Das Problem hatte ich auch schon mal:
Der compiler hat einfach die Hälfte meines Qts "überlesen!!!!!"
Das heisst er hat halbe Prozeduren ausgeführt und hat nicht angehalten als eigentlich eine Prozedur mit 20 Haltepunkten dran war

Keine Ahnung, wie ich's damals wieder hingekriegt hab, ich glaub ich hab Delphi(6) neuinstalliert.

Mathias


webmaker - Mi 19.06.02 16:44

Versuchs mal so, wenn der Compiler wirklich Quellcode überliest: Quellcode rauskopieren, dann compilen und wieder einfügen. Wenns nicht funzt, dann musste wohl neuinstallieren