Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi For-Schleife Rückwärts? (https://www.delphipraxis.net/90482-schleife-rueckwaerts.html)

Hepdepaddel 18. Apr 2007 10:35


For-Schleife Rückwärts?
 
Hi,

in D7 beobachte ich im Debugger ein eigenartiges Verhalten:

Delphi-Quellcode:
  FOR i:=1 TO AnzRep DO
    BEGIN
      Log.Lines.Add(Berichte[i]);

[...]
    END;
Die Schleife wird nicht von 1 bis 11 (Wert von Const AnzRep) durchlaufen, sondern von 11 bis 1 - also eigentlich wie "AnzRep DOWNTO 1".

Muss man das verstehen? Es ist hier nicht kritisch, aber wenn die Reihenfolge der Berichte von Bedeutung wäre, hätte ich doch ein deutliches Problem... habe ich einen Schalter übersehen ("drehe alles um")?

Gruß

Mark

xaromz 18. Apr 2007 10:42

Re: For-Schleife Rückwärts?
 
Hallo,

das ist die automatische Optimierung von Delphi. Wenn die Schleife rückwärts läuft, muss als Abbruchbedingung nur auf Null getestet werden, was schneller geht. Die Optimierung hat aber keine negativern Auswirkungen auf Deinen Code, das wird vom Compiler entsprechend angepasst.

Gruß
xaromz

Hepdepaddel 18. Apr 2007 10:47

Re: For-Schleife Rückwärts?
 
Danke - sowas hatte ich vermutet... woher weiß Delphi denn, dass das nicht kritisch ist? In der Schleife rufe ich die Load- und Save-Methoden von Fastreport auf. Es könnte doch gut sein, dass ich die Reihenfolge der Reports fix haben möchte...

Gruß

Mark

xaromz 18. Apr 2007 10:50

Re: For-Schleife Rückwärts?
 
Hallo,
Zitat:

Zitat von Hepdepaddel
woher weiß Delphi denn, dass das nicht kritisch ist? In der Schleife rufe ich die Load- und Save-Methoden von Fastreport auf. Es könnte doch gut sein, dass ich die Reihenfolge der Reports fix haben möchte...

Delphi weiß von kritisch oder nicht kritisch überhaupt nichts. Es passt einfach die entsprechenden Aufrufe an. Etwa so:
Delphi-Quellcode:
for i := 1 to 10 do
  Memo.Lines[i] := IntToStr(i);
wird zu
Delphi-Quellcode:
for i := 9 downto 0 do
  Memo.Lines[10 - i] := IntToStr(10 - i);
Alles in Butter also.

Gruß
xaromz

Hepdepaddel 18. Apr 2007 10:54

Re: For-Schleife Rückwärts?
 
Ouch - das ist eine böse Falle... habe mir gerade den Debug-Output angeschaut und bemerkt, dass die Reihenfolge tatsächlich OK ist - geht man im Debugger auf "Berichte[i]" wird aber der falsche Bericht angezeigt (der ist dann gerade gar nicht dran). Also wohl besser Optimierung aus beim debuggen.

Gruß & vielen Dank!

Mark

kalmi01 18. Apr 2007 11:00

Re: For-Schleife Rückwärts?
 
Zitat:

Zitat von xaromz
Delphi weiß von kritisch oder nicht kritisch überhaupt nichts. Es passt einfach die entsprechenden Aufrufe an. Etwa so:
Delphi-Quellcode:
for i := 1 to 10 do
  Memo.Lines[i] := IntToStr(i);
wird zu
Delphi-Quellcode:
for i := 9 downto 0 do
  Memo.Lines[10 - i] := IntToStr(10 - i);
Alles in Butter also.

Jetzt wird mir auch klar, warum eine bestimmte function bei mir Mist macht, obwohl logisch OK.
Kann man dieses "Feature" eigentlich abschalten, ohne auf die Optimierung zu verzichten ?

Nuclear-Ping 18. Apr 2007 11:12

Re: For-Schleife Rückwärts?
 
Ich glaube nicht, dass sich der logische Durchlauf einer Schleife durch diese Optimierung in irgendeiner Art ändert. Die Optimierung bezieht sich auf Geschwindigkeit und Codeeffizienz. In meiner ganzen Delphi-Zeit (vlt. 10 Jahre) konnte ich kein Problem durch "optimierte" For-Schleifen feststellen.

Luckie 18. Apr 2007 11:32

Re: For-Schleife Rückwärts?
 
Siehe dazu auch: http://www.michael-puff.de/Developer...ackwards.shtml

CCRDude 18. Apr 2007 12:09

Re: For-Schleife Rückwärts?
 
Daß der Debugger bei eingeschalteter Optimierung in manchen Schleifen spinnt, hat mir auch schon Kopfzerbrechen gekostet; inzwischen findet sich das z.B. hier in CodeGears Quality Central:

Report No: 33195 (RAID: unavailable) Status: Open
Watches not working in optimized for loop
http://qc.codegear.com/wc/qcmain.aspx?d=33195

TeronG 18. Apr 2007 12:14

Re: For-Schleife Rückwärts?
 
Zitat:

Zitat von Nuclear-Ping
In meiner ganzen Delphi-Zeit (vlt. 10 Jahre) konnte ich kein Problem durch "optimierte" For-Schleifen feststellen.

Man kann sich bestimmt eine Situation zusammenbastel bei der das n Problem ist aber in der Praxis ist das imho eher selten der Fall.

DerDan 18. Apr 2007 12:25

Re: For-Schleife Rückwärts?
 
Hallo

@TeronG
wie kommst du darauf, das es in "seltenen" Fällen was ausmacht, in der Praxis aber nicht.

ich find die aussage breiig!

Bastel doch mal was um deine Aussage zu unterstützen!

mfg

DerDan

TeronG 18. Apr 2007 12:56

Re: For-Schleife Rückwärts?
 
Zitat:

Zitat von DerDan
Bastel doch mal was um deine Aussage zu unterstützen!

Wenn ich was basteln würde hätte ich ja ne Ausnahmesituation und nicht mehr den Alltag.
In MEINEM bescheidenen Progger-alltag war das noch nie n Problem (so weit ich weis ^^) und zur unterstützung meiner Meinung hatte ich ja "Nuclear-Ping" zitiert (vlt. 10 Jahre ohne Probleme).

Hepdepaddel 19. Apr 2007 08:44

Re: For-Schleife Rückwärts?
 
Ich bin nun seit Delphi 1 dabei - mit wechselnder Intensität - und mir ist das auch noch nie unangenehm aufgefallen. Normalerweise schalte ich die Optimierung nur für die "Finale" Compilierung ein, weil mir die ständig nicht mehr vorhandenen Variablen sonst das Leben schwer machen. Nur gestern hatte ich eine "optimierte" Anwendung "mal schnell" noch an einer Stelle überarbeiten wollen. Der Aufruf von FastReport.LoadFile gab jedes 7. Mal ein "Invalid File Format" - egal, welcher Report der siebte war. Nach dem Hinweis darauf, dass in Wirklichkeit "Report[11-i]" aufgerufen wurde statt "Report[i]", war sonnenklar, welcher Report der "böse" war. Nochmals also sehr herzlichen Dank für den Tipp!

Aber wie gesagt - das ist gestern das erste mal gewesen, dass ich darüber gestolpert bin.

Gruß

Mark

Schaedel 16. Mai 2008 08:27

Re: For-Schleife Rückwärts?
 
Hallo und sorry das ich diesen alten Thread auskrame.

Ich stolper zum 2. mal über diese "Optimierung" und zum 2. mal muss ich die For-Schleife aus dem Programmcode nehmen, da sonst ein komplettes Fehlverhalten auftritt.
Ich habe folgenden Code:
Delphi-Quellcode:


for i := low(AZiffer) to high(AZiffer)-1 do begin
//Prüfungen der Ziffern...
  if AZiffer[i,0] = '5.' then begin // Hier springt er JEDESMAL in dn den IF Block wenn Aziffer[i,0] = '0.1' und das ist FALSCH
                                    // wenn er bei 5. angelangt ist springt er über die Bedingung und sagt False.
                                    // Ergo ein komplettes Fehlverhalten.
   //Hier wird ein Stringzusammen gebastelt.    
  end;
end;

edit: zu früh gepostet... verdammtes Tab ;)

Klaus01 16. Mai 2008 08:33

Re: For-Schleife Rückwärts?
 
Delphi-Quellcode:
for i := low(AZiffer) to high(AZiffer)-1 do begin
//Prüfungen der Ziffern...
Sollte die Schleife nicht bis High(AZiffer) laufen.
Da High ja den letzen Index des Array repräsentiert.

Grüße
Klaus

Luckie 16. Mai 2008 08:39

Re: For-Schleife Rückwärts?
 
nd du solltest Fließkommawerte mie auf Göleichheit prüfen.

Schaedel 16. Mai 2008 08:46

Re: For-Schleife Rückwärts?
 
Das sind doch Strings die ich vergleiche.

Zu dem High: Das -1 ist an der Stelle schon ok.

JasonDX 16. Mai 2008 08:57

Re: For-Schleife Rückwärts?
 
Ich kann dieses Verhalten (BDS2006 Pro) nicht nachvollziehn.
Du musst aber nicht zwingend auf die For-Schleife verzichten. Per Compilerdirektiven {O+-} kannst du die Optimierung für bestimmte Codeblöcke ausschalten.

greetz
Mike

Schaedel 16. Mai 2008 09:06

Re: For-Schleife Rückwärts?
 
Ok damit geht es.
Danke...

Der Tag fängt echt super an x) :wall:

jbg 16. Mai 2008 11:44

Re: For-Schleife Rückwärts?
 
Zitat:

Zitat von JasonDX
Per Compilerdirektiven {O+-} kannst du die Optimierung für bestimmte Codeblöcke ausschalten.

Das klingt mehr nach tickender Zeitbombe als nach einem Optimierungsfehler. Durch die Optimierung geht die Bombe halt nur schon früher hoch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz