![]() |
Delphi-Version: XE
For-To-Do-Schleife beginnt nicht mit Startwert
Ich habe im Programm eine einfache For-To-Do-Schleife, und verwende als Bis-Zähler eine Byte-Variable:
Delphi-Quellcode:
Nun habe ich das Phänomen, dass bereits der erste Durchlauf für die Schleife den Wert 20 in der Zählervariable i liefert, anstatt 1. Woran kann das liegen?
var i, MaxZahl : Byte;
begin MaxZahl:=20; for i:=1 to MaxZahl do begin {} end; end; |
AW: For-To-Do-Schleife beginnt nicht mit Startwert
Zitat:
|
AW: For-To-Do-Schleife beginnt nicht mit Startwert
Na indem ich bei der ersten Zeile zwischen begin-end einen Breakpoint setzen und mir im Debugger den Wert anschaue.
|
AW: For-To-Do-Schleife beginnt nicht mit Startwert
Die Optimierung lässt die Schleife falsch herum laufen, weil das Vergleichen mit 0 (die Abbruchbedingung der Schleife) etwas schneller ist als mit 20.
Das ist so als würdest du eine For-Downto-Do Schleife bauen. siehe: ![]() |
AW: For-To-Do-Schleife beginnt nicht mit Startwert
Ich habe nun alles auf Repeat-Until geändert und die 20 als Abbruchbedingung genommen. Funktioniert.
|
AW: For-To-Do-Schleife beginnt nicht mit Startwert
War denn das Ergebnis nach Durchlauf der For-Schleife unerwartet?
Sherlock |
AW: For-To-Do-Schleife beginnt nicht mit Startwert
Zitat:
Du nutzt i nicht in der Schleife, also ist es für den weiteren Programmablauf egal wie der Wert von i ist. Und weil es egal ist, sagt sich der Compiler, dass es für ihn optimaler ist mit dem höheren Wert zu beginnen und runter zu zählen. Wie gesagt, diesen Effekt hast du nur, weil der Wert von i nicht benötigt wird. Es ist also egal ob For rauf oder runter zählt. Anders sieht es aber aus wenn du den i-Wert benötigst. Dann wird so gezählt wie es soll. Du kannst es testen:
Delphi-Quellcode:
Lass es laufen. Du wirst sehen, es beginnt bei 1.
var i, MaxZahl : Byte;
begin MaxZahl:=20; for i:=1 to MaxZahl do begin ShowMessage(IntToStr(i)); end; end; Also, dein Phänomen tritt nur dann auf wenn es egal ist. Ist es egal, macht der Compiler das was für ihn optimaler ist. Ist es nicht egal, wird es so gemacht wie du es willst. |
AW: For-To-Do-Schleife beginnt nicht mit Startwert
Weshalb ich fragte, ob das Ergebnis nach der Schlafe denn wie erwartet ist...
Sherlock |
AW: For-To-Do-Schleife beginnt nicht mit Startwert
Zitat:
"Nach" der Schleife ist i immer "ungültig". Intern kann der Compiler das i anders laufen lassen, je nach Code-Optimierung, aber bei "Verwendung" ist i immer richtig (wird intern wieder umgerechnet) Der Debugger zeigt nur manchmal was Falsches an, vorallem wenn man i innerhalb der Schleife garnicht verwendet. :stupid: Zitat:
Drum knallt es gern, wenn man Items aus Listen löscht und dabei die Schleife vorwärts durchläuft. :angel2: |
AW: For-To-Do-Schleife beginnt nicht mit Startwert
Hat jemand nach dem i gefragt? oO
Das was die Schleife bezwecken sollte, wurde erreicht, ja oder nein? Das war die Frage an den TE. Falls nein hätten wir es ja mit einem Bug zu tun. Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz