Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schleife von 0 bis Count-1 mit Änderung (https://www.delphipraxis.net/206235-schleife-von-0-bis-count-1-mit-aenderung.html)

t2000 2. Dez 2020 11:00

Delphi-Version: 10.4 Sydney

Schleife von 0 bis Count-1 mit Änderung
 
Mal eine grundsätzliche Frage, ob dies per Definition so ist und sich auch nicht ändert.

Eine Schleife durch eine Liste in der die Liste selbst geändert wird.

Delphi-Quellcode:
var
  sl : TStringlist;
  i : Integer;
begin
  sl := TStringlist.Create;
  sl.Add('eins');
  sl.Add('zwei');
  sl.Add('drei');
  for i := 0 to sl.Count-1 do
    sl.Add(i.ToString);
  sl.Free;
Das Ergebnis ist
eins
zwei
drei
0
1
2

und die Schleife wird auch beendet.
Ich habe die Anzahl innerhalb der Schleife geändert, also wird der Wert "Count" beim Start gesichert und benutzt.

Kann man sich darauf verlassen, dass das immer so ist? (Also ein Funktionsaufruf, der die Durchlaufanzahl liefert würde immer nur genau einmal aufgerufen.)

TiGü 2. Dez 2020 11:05

AW: Schleife von 0 bis Count-1 mit Änderung
 
Ja, ist seit Anbeginn der Zeit so und wird sich (wohl) nicht mehr ändern.*

*für die bisherigen Compiler (Win32/64)

freimatz 2. Dez 2020 12:44

AW: Schleife von 0 bis Count-1 mit Änderung
 
Rtfm :-)

scrat1979 2. Dez 2020 13:03

AW: Schleife von 0 bis Count-1 mit Änderung
 
Ja, das ist exakt schon immer das übliche Vorgehen beim Durchiterieren einer Liste. Aber Achtung! Sollte im Rahmen der Schleife ein Element gelöscht werden dann rückwärts durchlaufen. Es verändert sich ja beim Löschen die Anzahl der Elemente, und dann kracht es, weil das „Count-1“ zu Beginn unverändert bleibt und hinten raus die Elemente in der Liste nach vorne verschoben werden.

Jumpy 2. Dez 2020 14:12

AW: Schleife von 0 bis Count-1 mit Änderung
 
Zitat:

Zitat von scrat1979 (Beitrag 1478400)
Ja, das ist exakt schon immer das übliche Vorgehen beim Durchiterieren einer Liste.

Ist es nicht eher eine Eigenschaft der for-schleife? Es ist ja nocht so, dass wie bei einer while oder until Schleife die Bedingung jedes mal neu geprüft würde. Oder wird sie geprüft aber die Endbedingung nicht neu gesetzt? Wo sind die Compiler-Experten :)?

Blup 2. Dez 2020 14:47

AW: Schleife von 0 bis Count-1 mit Änderung
 
Ja, dieses Verhalten ist für for-Schleifen definiert, deshalb sind diese auch schneller.

Der Compiler optimiert Schleifen nach Möglichkeit so, dass gegen 0 gezählt wird.
Das spart noch mal einen Vergleich je Durchlauf, das sieht dann übersetzt im Prinzip so aus:
Delphi-Quellcode:
 n := sl.Count - 1;
 for i := n downto 0 do
   sl.Add((n - i).ToString);

freimatz 2. Dez 2020 14:49

AW: Schleife von 0 bis Count-1 mit Änderung
 
Nochmals RTFM. Da muss man kein Compiler experte sein sondern nur lesen können :-P

"For purposes of controlling the execution of the loop, the expressions initialValue and finalValue are evaluated only once, before the loop begins."


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 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