![]() |
Re: For-Schleife von 0 bis 7 fängt bei 8 an
Nach einer for Schleife ist die Zählvariable undefiniert. Die Speicherstelle hat wohl nur zufällig den Wert 8. Der Compiler sollte eine entsprechende Warnung ausgegeben haben.
|
Re: For-Schleife von 0 bis 7 fängt bei 8 an
Die Zählvariable hat immer einen um 1 erhöhten Wert außerhalb der Schleife. Das ist kein Zufall. Der Compiler meckert nur, wenn innerhalb der Schleife sogar noch ein Wert a la i := i + 1; zugewiesen wird. Wie gesagt, ich weiß auch nicht warum, aber es ist egal. Das müßte ein Compiler-Bauer sagen. Und dabei käme wohl eine Diskussion zustande, daß intern ein SHL oder sonstein ASM Befehl genutzt wird, aus Performancegründen und, daß der Compiler in die Knie gehen würde, falls man den Wert auf den letzten der in der Schleife tatsächlich genutzten Werte zurücksetzt und, daß das auch überflüssig ist, da die Variable ja sowieso auf die Schleife beschränkt bleiben soll. :mrgreen:
|
Re: For-Schleife von 0 bis 7 fängt bei 8 an
Zitat:
|
Re: For-Schleife von 0 bis 7 fängt bei 8 an
Zitat:
|
Re: For-Schleife von 0 bis 7 fängt bei 8 an
Zitat:
Zitat:
Und dass man innerhalb einer Schleife so nicht die Zählvariable manipulieren kann, ist allseits bekannt. |
Re: For-Schleife von 0 bis 7 fängt bei 8 an
Zitat:
Zitat:
Delphi-Quellcode:
Diese könntest du (unter Erzeugung des prinzipiell gleichen Maschinencodes) in folgende while-Schleife umwandeln:
for i := 0 to 7 do
begin end;
Delphi-Quellcode:
Ist jetzt klar, warum?
i := 0;
while i <= 7 do begin Inc(i); end; |
Re: For-Schleife von 0 bis 7 fängt bei 8 an
Zitat:
Nach dem Schleifendurchlauf wird die Zählvariable erhöht und wieder an den Anfang (die Prüfung!) gesprungen. Daher muss die Zählvariable nach dem Ende der Schleife um eins höher sein als der Abbruchwert. Die Optimierungen des Compilers können dies natürlich ändern, aber nur dann, wenn die Zählvariable entweder nicht oder in einer sog. inavarianten Weise benutzt werden: Wird ein Array mit konstanten oder nicht von der Zählvariablen abhängigen Werten gefüllt, kann der Compiler das Füllen auch umdrehen und ggf. nur ein Register benutzen, so dass der Wert nach dem Schleifendurchlauf überhaupt nicht mehr existiert. Dies jedoch beruht alles auf der Forderung von Pascal, dass die Zählvariable bzw. der Inhalt nach dem Schleifendurchlauf nicht mehr definiert ist! Viel Spaß noch Peter |
Re: For-Schleife von 0 bis 7 fängt bei 8 an
Zitat:
Dass der Code, den ich gepostet habe, läuft, will ich gar nicht bezweifeln. Nur kam eben bei mir eine AV. Die Zuweisung war bei mir noch anders (eben ein Point) und es wurden noch ein paar andere Sachen, die nichts mit i oder dem Array zu tun hatten, in der Schleife erledigt. Leider hab ich den fehlerhaften Code nicht mehr sonst würde ich auch den hier posten. Das vorhin war nur als Beispiel gedacht, damit ihr seht, wie mein Array und meine For-Schleife aufgebaut sind. So wie ich die Diskussion hier lese (hätte nie gedacht, dass das so ein großes Thema wird :cyclops: ) denke ich, dass der Fehler bei mir gar nicht in der Schleife lag, sondern irgendwo vorher. Denn auch wenn als Hint [i = 8] und [Array[i] = inaccessable Value] angezeigt wurden, müsste das intern so geregelt werden, dass trotzdem der richtige Wert benutzt wird (-> Link von jim) |
Re: For-Schleife von 0 bis 7 fängt bei 8 an
Zitat:
Unter TurboPascal konnte man noch folgende schöne, sehr lang dauernde Schleife programmieren:
Delphi-Quellcode:
for i := 0 to 2 do
Inc(i); Zitat:
|
Re: For-Schleife von 0 bis 7 fängt bei 8 an
Zitat:
Du hast mich falsch verstanden :) Ein zusätzlicher Befehl wie CMP kostet mehr Taktzyklen pro Schleife, trotzdem ist ein CMP genauso schnell wie ein SUB oder DEC. Zählt die Schleife gegen Null mit dem Befehl DEC so benötigt man nach dem DEC bei Überprüfung auf Null kein zusätzliches CMP mehr sondern kann die Flags direkt auswerten. D.h. also die Zählweise gegen Null spart einen zusätzlichen Befehl. Die Befehle selber sind meistens gleich schnell ausgeführt !! Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 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 by Thomas Breitkreuz