Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schleife läuft rückwärts trotz Verwendung der Zählvariable (https://www.delphipraxis.net/68221-schleife-laeuft-rueckwaerts-trotz-verwendung-der-zaehlvariable.html)

SubData 26. Apr 2006 14:08


Schleife läuft rückwärts trotz Verwendung der Zählvariable
 
Moin...


Eine meiner for-Schleifen läuft rückwärts, obwohl die Schleifenvariable verwendet wird.
Seit wann optimiert der Compiler sowas?
Der Switch steht übrigens auf Verwendung von SetRange...

TblMSys ist eine TTable (Paradox)
MSysInfo ist eine TKbmMemoryTable (Speichertabelle)

Es handelt sich um Delphi 7 Enterprise.

Delphi-Quellcode:
const
  LoadFields : Array[0..6] of String = ('SO', 'KO', 'ST', 'KT', 'AT', 'LA', 'FG');


      for Loop := 1 to Length(LoadFields) do
      begin
        {$IFDEF DB_MSSQL}
          TblMSys.SQL.Text := 'SELECT * FROM Z4MSYS WHERE ART=''' + LoadFields[Loop - 1] + '''';
          TblMSys.Open;
        {$ELSE}
          TblMSys.SetRange([LoadFields[Loop - 1]], [LoadFields[Loop - 1]]);
        {$ENDIF}
        while not TblMSys.Eof do
        begin
          MSysInfo.Append;
          MSysInfo.FieldByName('ART').asString := TblMSys.FieldByName('ART').asString;
          // Noch ein paar Felder...
          MSysInfo.FieldByName('F1').asString := TblMSys.FieldByName('F1').asString;
          MSysInfo.Post;
          TblMSys.Next;
        end;
      end;

Khabarakh 26. Apr 2006 14:14

Re: Schleife läuft rückwärts trotz Verwendung der Zählvariab
 
Exakt das gleiche Thema hatten wir erst vor Kurzem.
Des Rätsels Lösung: Die Schleife läuft zwar rückwärts, die Schleifenvariable wird allerdings überhaupt nicht zum Zugriff auf das Array benutzt.

Und wieder frage ich mich, wie man bloß mit Optimierungen debuggen kann...

SubData 26. Apr 2006 14:21

Re: Schleife läuft rückwärts trotz Verwendung der Zählvariab
 
Und was ist das?

TblMSys.SetRange([LoadFields[Loop - 1]], [LoadFields[Loop - 1]]);

Falls es dir aufgefallen ist, ich habe extra betont, dass die Zählvariable sehr wohl verwendet wird...

xaromz 26. Apr 2006 14:26

Re: Schleife läuft rückwärts trotz Verwendung der Zählvariab
 
Hallo,
Zitat:

Zitat von SubData
Falls es dir aufgefallen ist, ich habe extra betont, dass die Zählvariable sehr wohl verwendet wird...

Du verwendest die Variable in Deinem Quellcode, Delphi verwendet sie nicht.

Gruß
xaromz

supermuckl 26. Apr 2006 14:27

Re: Schleife läuft rückwärts trotz Verwendung der Zählvariab
 
so etwas ist mir auch schon aufgefallen mit D6 oder D7 (weis nimmer)
hatte auch die zählvar verwendet (!)

SubData 26. Apr 2006 14:28

Re: Schleife läuft rückwärts trotz Verwendung der Zählvariab
 
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von SubData
Falls es dir aufgefallen ist, ich habe extra betont, dass die Zählvariable sehr wohl verwendet wird...

Du verwendest die Variable in Deinem Quellcode, Delphi verwendet sie nicht.

Gruß
xaromz

Sicher?

Wenn ich die Schleife debugge, dann wird das Array tatsächlich von hinten nach vorne durchlaufen:
Erst FG, dann LA, dann AT ... usw .

Edit: Wie soll ich denn die Array-Werte bekommen, wenn Delphi sie nicht verwendet? -hm-

Daniel G 26. Apr 2006 14:30

Re: Schleife läuft rückwärts trotz Verwendung der Zählvariab
 
Zitat:

Zitat von xaromz
Du verwendest die Variable in Deinem Quellcode, Delphi verwendet sie nicht.

Kannst du das näher erläutern? Ich komm' grad nicht mit.... Wie "zählt" Delphi dann?

Khabarakh 26. Apr 2006 14:35

Re: Schleife läuft rückwärts trotz Verwendung der Zählvariab
 
Och Jungs :stupid: . Ich habe nicht auf einen Thread, in dem die Sache schon längst gelöst wurde, verwiesen, damit hier das gleiche Thema noch einmal diskutiert wird. Und weil bald Weihnachten ist, gibts sogar einen Direktlink:
http://www.delphipraxis.net/internal...ct.php?t=81147

Zitat:

Wenn ich die Schleife debugge, dann wird das Array tatsächlich von hinten nach vorne durchlaufen:
Erst FG, dann LA, dann AT ... usw .
Zitat:

Und wieder frage ich mich, wie man bloß mit Optimierungen debuggen kann...
Der Debugger weiß nichts von den Optimierungen des Compilers, also zeigt er die Arrayelemente an, wie es normalerweise gemacht wird.

Hawkeye219 26. Apr 2006 14:36

Re: Schleife läuft rückwärts trotz Verwendung der Zählvariab
 
na rückwärts eben :wink:

Der Zugriff auf die Daten erfolgt über einen Zeiger, der vor Beginn der Schleife initialisiert und innerhalb der Schleife inkrementiert wird. Mit der Schleifenvariablen muß dann nur noch die Anzahl der Durchläufe geprüft werden. Dabei ist es unerheblich, ob vorwärts oder rückwärts gezählt wird. Rückwärts gehts es ein wenig schneller, weil die Abbruchbedingung einfacher ist.

Gruß Hawkeye

//Edit: hmmm, ein Tick zu spät...

xaromz 26. Apr 2006 14:40

Re: Schleife läuft rückwärts trotz Verwendung der Zählvariab
 
Hallo,
Zitat:

Zitat von Daniel G
Zitat:

Zitat von xaromz
Du verwendest die Variable in Deinem Quellcode, Delphi verwendet sie nicht.

Kannst du das näher erläutern? Ich komm' grad nicht mit.... Wie "zählt" Delphi dann?

wenn möglich, läuft eine Schleife vom Maximum runter bis Null, weil ein Vergleich auf Null schneller ist.
Wenn die Schleifenvariable zur Indizierung eines Arrays genutzt wird, dann benötigt Delphi die Variable nicht.
Ich erkläre das am Besten mal an einem Beispiel:
Wir zählen von 1 bis 10 und haben ein Array [1..10] of Integer

Wenn wir das so schreiben:
Delphi-Quellcode:
var
  C: Integer;
  A: array [1..10] of Integer;
begin
  ... initialisieren
  for C := 1 to 10 do
    Result := Result + A[C];
end;
dann baut Delphi das ungefähr so um:
Delphi-Quellcode:
var
  C: Integer;
  A: array [1..10] of Integer;
  P: ^Integer;
begin
  ... initialisieren
  C := 10;
  P := @A[1];
  repeat
    Result := Result + P^;
    Inc(P);
    Dec(C);
  until C = 0;
end;
Wie man sieht, wird C für den Zugriff auf das Array nicht benötigt.

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:01 Uhr.
Seite 1 von 2  1 2      

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