AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

For-Schleife Rückwärts?

Ein Thema von Hepdepaddel · begonnen am 18. Apr 2007 · letzter Beitrag vom 16. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Hepdepaddel
Hepdepaddel

Registriert seit: 12. Dez 2005
Ort: Bremen
91 Beiträge
 
Delphi 2006 Enterprise
 
#1

For-Schleife Rückwärts?

  Alt 18. Apr 2007, 11:35
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
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: For-Schleife Rückwärts?

  Alt 18. Apr 2007, 11:42
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von Hepdepaddel
Hepdepaddel

Registriert seit: 12. Dez 2005
Ort: Bremen
91 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: For-Schleife Rückwärts?

  Alt 18. Apr 2007, 11:47
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
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: For-Schleife Rückwärts?

  Alt 18. Apr 2007, 11:50
Hallo,
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von Hepdepaddel
Hepdepaddel

Registriert seit: 12. Dez 2005
Ort: Bremen
91 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: For-Schleife Rückwärts?

  Alt 18. Apr 2007, 11:54
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
  Mit Zitat antworten Zitat
kalmi01
(Gast)

n/a Beiträge
 
#6

Re: For-Schleife Rückwärts?

  Alt 18. Apr 2007, 12:00
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 ?
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#7

Re: For-Schleife Rückwärts?

  Alt 18. Apr 2007, 12:12
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: For-Schleife Rückwärts?

  Alt 18. Apr 2007, 12:32
Siehe dazu auch: http://www.michael-puff.de/Developer...ackwards.shtml
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
CCRDude
(Gast)

n/a Beiträge
 
#9

Re: For-Schleife Rückwärts?

  Alt 18. Apr 2007, 13:09
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
  Mit Zitat antworten Zitat
Benutzerbild von TeronG
TeronG

Registriert seit: 19. Jul 2004
Ort: München
960 Beiträge
 
Delphi 2007 Professional
 
#10

Re: For-Schleife Rückwärts?

  Alt 18. Apr 2007, 13:14
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.
龍 Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 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