AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schleife von 0 bis Count-1 mit Änderung

Ein Thema von t2000 · begonnen am 2. Dez 2020 · letzter Beitrag vom 2. Dez 2020
Antwort Antwort
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#1

Schleife von 0 bis Count-1 mit Änderung

  Alt 2. Dez 2020, 11:00
Delphi-Version: 10.4 Sydney
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.)
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 2. Dez 2020, 11:05
Ja, ist seit Anbeginn der Zeit so und wird sich (wohl) nicht mehr ändern.*

*für die bisherigen Compiler (Win32/64)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 2. Dez 2020, 12:44
Rtfm
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 2. Dez 2020, 13:03
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.
Michael Kübler

Geändert von scrat1979 ( 2. Dez 2020 um 13:07 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#5

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

  Alt 2. Dez 2020, 14:12
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 ?
Ralph
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 2. Dez 2020, 14:47
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);
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 2. Dez 2020, 14:49
Nochmals RTFM. Da muss man kein Compiler experte sein sondern nur lesen können

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


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 18:17 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