AGB  ·  Datenschutz  ·  Impressum  







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

For xx In xxx Schleife rückwärts?

Ein Thema von milos · begonnen am 24. Jan 2014 · letzter Beitrag vom 27. Jan 2014
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: For xx In xxx Schleife rückwärts?

  Alt 24. Jan 2014, 17:40
Da die Delphi Dokumentation ja nicht so ausführlich wie beispielsweise die MSDN ist, kann ich gerade nicht sagen, ob dort für TList<T>, TStrings oder sonstiges, was ein GetEnumerator (also for-in tauglich ist) implementiert, dokumentiert wurde, in welcher Reihenfolge, die Elemente zurückgeliefert werden.
Definiert ist dieses Verhalten für Arrays:
http://docwiki.embarcadero.com/RADSt...nd_Anweisungen
Zitat:
Array-Ausdrücke können sich auf ein- oder mehrdimensionale Arrays, Arrays mit fester Länge oder dynamische Arrays beziehen. Das Array wird in aufsteigender Reihenfolge durchlaufen, beginnend mit der unteren Array-Grenze bis zur Array-Größe minus eins.
Trotzdem passt die Syntax nicht dazu das vorauszusetzen. Das ist genauso unsauber wie bei AnsiStrings die Länge als Größe in Byte anzunehmen oder die Größe eines Pointers als Größe eines Integers anzunehmen oder...
Schlicht weil es absolut keinen Sinn macht, wenn man auf bestimmte Indizes zugreifen will (eine bestimmte Reihenfolge eben) diese nicht zu benutzen...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#12

AW: For xx In xxx Schleife rückwärts?

  Alt 24. Jan 2014, 18:06
Delphi-Quellcode:
type
  IEnumerable<T> = interface(IEnumerable)
    ///   <summary>
    ///    Inverts the order of the elements in a sequence.
    ///   </summary>
    function Reversed: IEnumerable<T>;
  end;
Quelle: Spring.Collections.pas:250

Delphi-Quellcode:
program Project1;

{$AppType Console}

{$R *.res}

uses
  System.SysUtils,
  Spring.Collections,
  Spring.Collections.Lists;

procedure Run;
type
  T = String;
var
  List: IList<T>;
  Item: T;
begin
  List := TList<T>.Create;
  List.AddRange(['Eins.', 'Zwei.', 'Drei.', 'Vier.']);
  for Item in List.Reversed do
    WriteLn(Item);
end;

begin
  try
    Run;
  except
    on E: Exception do
      WriteLn(E.ClassName + ': ' + E.Message);
  end;

  if DebugHook <> 0 then
    ReadLn;
end.
Ausgabe:
Code:
Vier.
Drei.
Zwei.
Eins.
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#13

AW: For xx In xxx Schleife rückwärts?

  Alt 24. Jan 2014, 23:56
Dass etwas geht heisst nicht gleich, dass es auch gut ist. Dass andere dieses etwas gemacht haben ebensowenig, da können jetzt Beispiele noch und nöcher kommen.

Man Verschleiert die Abhängigkeit von einer definierten Reihenfolge durch die Nutzung einer Operation auf einer prinzipiell unsortierten Menge. Dass sie es in der Praxis oftmals dennoch ist, ist nicht Bestandteil des Vorganges, und muss von keiner Implementierung garantiert werden, bzw. kann es in unterschiedlichen Implementierungen unterschiedlich gehandhabt werden. Und allein das würde mich immer wieder dazu motivieren in diesen Fällen for..to zu nutzen, zumal es erheblich besser dokumentiert. Mehr als warnen kann man leider nicht.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#14

AW: For xx In xxx Schleife rückwärts?

  Alt 25. Jan 2014, 00:12
Oder noch besser: Man stelle sich einen zukünftigen Compiler vor, der merkt dass innerhalb der for-in Schleife keine Seiteneffekte auftreten. Und *wuppdi* werden alle 30 Iterationen gleichzeitig ausgeführt. (Bis der Delphi-Compiler das kann habe wir bestimmt 32-Kern CPUs in Laptops) Die Reihenfolge wäre dann nicht-deterministisch und hinge vom Scheduler ab.

Genial, wa?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: For xx In xxx Schleife rückwärts?

  Alt 25. Jan 2014, 09:36
Das würde ich jetzt nicht einmal als zu futuristisch ansehen, denn mit LLVM als Backend muss das ja nicht einmal der Delphi Compiler machen, sondern könnte es dort implementiert werden und einfach genutzt werden. Insofern könnte so etwas schneller kommen als man denkt.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#16

AW: For xx In xxx Schleife rückwärts?

  Alt 25. Jan 2014, 14:48
Einträge in einer Reihenfolge anzuordnen gehört sowohl zum Wesen einer Liste als auch zum Wesen einer Aufzählung. Es ist wenigstens intuitiv, zu erwarten, dass die Aufzählung einer Liste die Einträge in eben dieser Reihenfolge liefert - und dass diese Reihenfolge umgekehrt werden kann.

Sich dieser Intuition zu verweigern ist ein Fehler. Man kann Menschen auch unnötig verunsichern, wenn man gegen ihren gesunden Verstand redet.

Es ist nicht die For-in-Anweisung, welche die Reihenfolge bestimmt, sondern der Aufzähler. Auch die Übersetzung der Schleife für parallele Ausführung wird diese Reihenfolge nicht ändern. Wenn festgestellt werden kann, dass derselbe Schleifenkörper mehrmals parallel ausgeführt werden kann, bedeutet das nur, dass die Bearbeitung unabhängig von der Aufzählungsreihenfolge ist.

---------------
Ist es möglich in eine For-in-Schleife rückwärts laufen zu lassen, ohne dass man in der Liste etwas dreht?
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#17

AW: For xx In xxx Schleife rückwärts?

  Alt 25. Jan 2014, 14:55
Einträge in einer Reihenfolge anzuordnen gehört sowohl zum Wesen einer Liste als auch zum Wesen einer Aufzählung.
Nö. Nimm Dir ein RDBMS und verwende einen serverseitigen Cursor ohne explizite Ordnung (d.h. ein 'SELECT' ohne 'ORDER BY'): Auf diese Reihenfolge kannst Du dich nicht verlassen.

Anderes Beispiel:

Delphi-Quellcode:
MyList.Add(1);
MyList.Add(3);
MyList.Add(2);
For element in MyList do
  Writeln(element);
Preisfrage: In welcher Reihenfolge werden die Elemente ausgegeben?
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#18

AW: For xx In xxx Schleife rückwärts?

  Alt 25. Jan 2014, 15:30
Nö. Nimm Dir ein RDBMS und verwende einen serverseitigen Cursor ohne explizite Ordnung (d.h. ein 'SELECT' ohne 'ORDER BY'): Auf diese Reihenfolge kannst Du dich nicht verlassen.
Was ist in diesem Beispiel die Liste? Das Ergebnis einer Select-Abfrage ist sehr wohl eine Liste, und wiederholtes Aufzählen ihrer Einträge ergäbe eine immer gleiche Reihenfolge. Eine neue Select-Abfrage erstellt eine neue Liste. Ein Cursor ist weder eine Liste, noch bedeutet "Cursor", dass er in einer navigiert.

Delphi-Quellcode:
MyList.Add(1);
MyList.Add(3);
MyList.Add(2);
For element in MyList do
  Writeln(element);
Preisfrage: In welcher Reihenfolge werden die Elemente ausgegeben?
Code:
1
3
2
Eine andere Reihenfolge ist ein Fehler.
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: For xx In xxx Schleife rückwärts?

  Alt 25. Jan 2014, 16:46
Eine andere Reihenfolge ist ein Fehler.
Delphi-Quellcode:
var
  Test: TDictionary<Integer, String>;
  Current: TPair<Integer, String>;
begin
  Test := TDictionary<Integer, String>.Create;
  try
    Test.Add(1, 'Eins');
    Test.Add(2, 'Zwei');
    Test.Add(3, 'Drei');
    for Current in Test do
      ShowMessage(Current.Value);
  finally
    Test.Free;
  end;
end;
Das heißt es ist auch ein Fehler, dass dort nicht Eins, Zwei, Drei herauskommt?

for..in heißt nur "gehe alle Elemente durch". Nicht mehr und nicht weniger.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#20

AW: For xx In xxx Schleife rückwärts?

  Alt 25. Jan 2014, 17:01
Das heißt es ist auch ein Fehler, dass dort nicht Eins, Zwei, Drei herauskommt?
Nein, kein Fehler, es ist keine Liste.

Die For-in-Schleife geht alle Elemente einer Aufzählung durch. Und das Aufzählen einer Liste geschieht von vorn nach hinten.
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."

Geändert von Panthrax (25. Jan 2014 um 17:06 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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:26 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