Autor Beitrag
Thunderman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: Mi 12.06.02 14:29 
Hallo!

Ich habe in einer Prozedur eine ganz normale For-Schleife:
ausblenden 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.

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 344



BeitragVerfasst: 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:

ausblenden 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

_________________
Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!
overmoon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 16



BeitragVerfasst: 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: 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
ausblenden 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?

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 13.06.02 09:09 
Sag niemals nie! 8)

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


Cu, :wink:
Udontknow
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 13.06.02 09:55 
Hallo Thunderman,
hast du mal versucht über Projekt->Alle erzeugen zu compilieren? Vieleicht hilft das.

Gruß
Klabautermann
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 13.06.02 10:18 
Udontknow hat folgendes geschrieben:
Sag niemals nie! 8)

Ok, ich gebe mich geschlagen... :P
Thunderman Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: 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.

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: 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

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
webmaker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 205



BeitragVerfasst: 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

_________________
.::Wissen ist Macht, nichts wissen macht nichts::.