Autor |
Beitrag |
Thunderman
Beiträge: 26
|
Verfasst: Mi 12.06.02 14:29
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.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
|
|
Tino
Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: 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
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: 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
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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
Beiträge: 344
|
Verfasst: 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
_________________ Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!
|
|
overmoon
Beiträge: 16
|
Verfasst: 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
Beiträge: 26
|
Verfasst: 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?
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
|
|
Tino
Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: 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
|
|
Udontknow
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 13.06.02 09:09
|
|
Klabautermann
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Do 13.06.02 09:55
Hallo Thunderman,
hast du mal versucht über Projekt->Alle erzeugen zu compilieren? Vieleicht hilft das.
Gruß
Klabautermann
|
|
Tino
Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Do 13.06.02 10:18
Udontknow hat folgendes geschrieben: | Sag niemals nie! |
Ok, ich gebe mich geschlagen...
|
|
Thunderman
Beiträge: 26
|
Verfasst: 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
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: 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
Beiträge: 205
|
Verfasst: 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::.
|
|