Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Generics Fehler in TQueue? [edit: nein, Doku fehlerhaft] (https://www.delphipraxis.net/166724-generics-fehler-tqueue-%5Bedit-nein-doku-fehlerhaft%5D.html)

Bummi 27. Feb 2012 11:07


Generics Fehler in TQueue? [edit: nein, Doku fehlerhaft]
 
bekommt jemand bei folgenden Beispiel:
http://docwiki.embarcadero.com/CodeE...Queue_(Delphi))
das richtige Ergebnis?

oder habe ich ein Problem diese Ausgabe richtig zu interpretieren:
Code:
Element added: John
Element added: Mary
Element added: Bob
Element added: Anna
Element added: Erica
First enqueued element is: "John".
Element extracted: John
The queue contains 4 elements.
Element removed: Mary
First enqueued element is: "Mary".
Element removed: Bob
Element removed: Anna
Element removed: Erica

mjustin 27. Feb 2012 11:13

AW: Generics Fehler in TQueue?
 
Der Output sieht für mich korrekt aus, nur der Docwiki-Link funktioniert nicht (die rechte Klammer fehlt).
Erklärung: einmal wird Peek und einmal wird Dequeue aufgerufen um das erste Element anzuzeigen, die Lognachricht ist in beiden Fällen "First enqueued element is:", aber der Effekt auf die Queue ist unterschiedlich (Peek entfernt nichts).

Bummi 27. Feb 2012 11:36

AW: Generics Fehler in TQueue?
 
ich hatte die Breakpoints falsch gesetzt, sorry, in Zusammenhang mit den Fehlerhaften Quellcodekomnentaren bin ich ins eigene Messer gelaufen.
Delphi-Quellcode:
  { Show the last enqueued element without modifying the Queue. }
  MessageDlg('First enqueued element is: "' + Queue.Peek() + '".', mtInformation, [mbOK], 0);
 
  { Extract the top element: "Erica". }
  Queue.Extract();

himitsu 27. Feb 2012 11:38

AW: Generics Fehler in TQueue?
 
Wenn man sich die Meldungen durchliest, dann scheint mit "Mary" irgendwas nicht zu stimmen. :shock:
Code:
TQueue<String>.Create    -                                    -
Queue.Enqueue('John')    Element added: John                  John
Queue.Enqueue('Mary')    Element added: Mary                  John Mary
Queue.Enqueue('Bob')     Element added: Bob                   John Mary Bob
Queue.Enqueue('Anna')    Element added: Anna                  John Mary Bob Anna
Queue.Enqueue('Erica')   Element added: Erica                 John Mary Bob Anna Erica
Queue.Peek               First enqueued element is: "John".   [John] Mary Bob Anna Erica
Queue.Extract            Element extracted: John              Mary Bob Anna Erica
Queue.TrimExcess         -                                    -
Queue.Count              The queue contains 4 elements.       [Mary Bob Anna Erica]
Queue.Dequeue            Element removed: Mary                Bob Anna Erica
{Queue.Dequeue}          First enqueued element is: "Mary".   [Bob] Anna Erica
Queue.Clear              Element removed: Bob                 Anna Erica
{Queue.Clear}            Element removed: Anna                Erica
{Queue.Clear}            Element removed: Erica               -
Aber es sind einfach nur "schlechte" Meldungstexte, bzw. sie werden in einer falschen ungünstigen Reihenfolge ausgegeben.
Einfach mal diese beiden Meldungen austauschen und schon sieht es besser aus.
Code:
Queue.Dequeue            Element removed: Mary                Bob Anna Erica
{Queue.Dequeue}          First enqueued element is: "Mary".   [Bob] Anna Erica
[add]
@mjustin: Mary wird entfernt und danach ist es dennoch drin (first).
Das sieht also OK aus?

Stevie 27. Feb 2012 11:43

AW: Generics Fehler in TQueue?
 
Schau dir doch den Beispiel Code an, ist doch logisch, dass zuerst das removed Event getriggert wird (durch den Dequeue aufruf) und das Ergebnis dieses Aufrufs ausgegeben wird.

himitsu 27. Feb 2012 11:52

AW: Generics Fehler in TQueue?
 
Zitat:

Delphi-Quellcode:
  { Show the last enqueued element without modifying the Queue. }
  MessageDlg('First enqueued element is: "' + Queue.Peek() + '".', mtInformation, [mbOK], 0);
 
  ...
 
  { Show the last enqueued element by modifying the Queue. }
  MessageDlg('First enqueued element is: "' + Queue.Dequeue() + '".', mtInformation, [mbOK], 0);

Oder eine kleine Änderung und schon paßt es:
Delphi-Quellcode:
  { Show the last enqueued element without modifying the Queue. }
  MessageDlg('First element is: "' + Queue.Peek() + '".', mtInformation, [mbOK], 0);
 
  ...
 
  { Show the last enqueued element by modifying the Queue. }
  MessageDlg('Enqueued element is: "' + Queue.Dequeue() + '".', mtInformation, [mbOK], 0);

Stevie 27. Feb 2012 12:03

AW: Generics Fehler in TQueue?
 
Fazit: Kein Fehler in TQueue - nur Meldungen und Kommentare im Beispiel Code sind etwas unglücklich gewählt (und nebenbei ein Paradebeispiel, dass solche sehr zur Verwirrung des Lesers führen können)

mjustin 27. Feb 2012 12:03

AW: Generics Fehler in TQueue?
 
[QUOTE=himitsu;1153106]
Zitat:


Oder eine kleine Änderung und schon paßt es:
Delphi-Quellcode:
 
  ...
   { Show the last enqueued element by modifying the Queue. }
  MessageDlg('Enqueued element is: "' + Queue.Dequeue() + '".', mtInformation, [mbOK], 0);

"Enqueues element is" ... Queue.Dequeue ?

Enqueued ist das zuletzt hinzugefügte Element (Ende der Warteschlange).
Dequeue entfernt am Anfang.

Mein Vorschlag wäre:

Delphi-Quellcode:
  MessageDlg('Dequeued element is: "' + Queue.Dequeue() + '".', mtInformation, [mbOK], 0);


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