Generische Klassenbibliothek - Bugs, Beschreibung, Fragen, Nutzungsmöglichkeiten und Vorschläge - Seite 24

 
fxsaber:

Frage zum Abrufen eines Wertes aus einem Schlüssel. Im Bibliothekscode sieht diese Methode wie folgt aus

//+------------------------------------------------------------------+
//| Find index of entry with specified key.                          |
//+------------------------------------------------------------------+
template<typename TKey,typename TValue>
int CHashMap::FindEntry(TKey key)
  {
   if(m_capacity!=NULL)
     {
      //--- get hash code from key
      int hash_code=m_comparer.HashCode(key)&0x7FFFFFFF;
      //--- search pair with specified key
      for(int i=m_buckets[hash_code%m_capacity]; i>=0; i=m_entries[i].next)
         if(m_entries[i].hash_code==hash_code && m_comparer.Equals(m_entries[i].key,key))
            return(i);
     }
   return(-1);
  }

Ja, dieser Code kann irreführend sein, da i in for nicht standardmäßig neu zugewiesen wird.

Zunächst greifen wir auf das Unterarray über seinen Index zu, der unseren Wert enthalten kann:i=m_buckets[hash_code%m_capacity];(d. h. i Index des Unterarrays oder des Wertebins).

Dann wird im selben for der Index des Ablagefachs in den Index der Ablageposition umgewandelt:i=m_entries[i].next

In der Tat ist der Code korrekt geschrieben, da in einem typischen Fall jedes Unterarray im Durchschnitt ein Element enthält und die Schleife im Durchschnitt nur einmal ausgeführt wird.

 
Vasiliy Sokolov:

Ja, dieser Code kann irreführend sein, da i in for nicht standardmäßig neu zugewiesen wird.

Zunächst greifen wir auf ein Unterarray über seinen Index zu, der unseren Wert enthalten kann:i=m_buckets[hash_code%m_capacity];(d.h. i Index des Unterarrays oder Wertekorbs).

Dann wird im selben for der Index des Lagerplatzes in den Index des Lagerplatzes umgewandelt:i=m_entries[i].next

In der Tat ist der Code korrekt geschrieben, da in einem typischen Fall jedes Unterfeld im Durchschnitt ein Element enthält und die Schleife im Durchschnitt nur einmal ausgeführt wird.

Ich verstehe, dass die Schleife für Kollisionen gedacht ist: um die Mini-Liste zu durchlaufen.

 
fxsaber:

Ich gehe davon aus, dass die Schleife für Kollisionen gedacht ist: um eine Mini-Liste zu durchlaufen.

Ja, absolut richtig.

 

Verwendung der Vorlagenbibliothek(CArrayList) zur Speicherung benutzerdefinierter Typen. Der Eindruck ist nicht gut. Der Einfachheit halber habe ich Makros geschrieben

#define  CLEANUP   do {                                      \
   for(int i_cln = 0;  i_cln < segs.Count();  ++ i_cln) {   \
      Wave_end *cln_el;                                     \
      if(  segs.TryGetValue(i_cln, cln_el) )                \
         delete cln_el;                                     \
   }}while(false)
#define  SSEG(IND)  do {                \
if( ! segs.TryGetValue(IND, we) ) {    \
   CLEANUP;                            \
   continue;                           \
}}while(false)

Übermäßiges Foolproofing in TryGetValue und die Unmöglichkeit, Klassen nach Wert zu übergeben, machen die Verwendung schmerzhaft.

 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von MQL5 MT5 MetaTrader 5 Anfängern" verschoben.
 

Sagen Sie mir, vielleicht verstehe ich etwas nicht, aber wenn ich versuche, eine Konstruktion dieser Art zu verwenden:

#include <Generic\\ArrayList.mqh>

struct Option {
   string name;
   color  clr;
};

...

CArrayList<Option> _options;

Ich erhalte eine Fehlermeldung:

Option' - Objekte werden nur per Referenz übergeben ICollection.mqh 14 18

Und dann gibt es noch eine ganze Reihe von Fehlern...
 
Andrey Pogoreltsev:

Sagen Sie mir, vielleicht verstehe ich etwas nicht, aber wenn ich versuche, eine Konstruktion dieser Art zu verwenden:

Ich erhalte eine Fehlermeldung:

Option' - Objekte werden nur per Referenz übergeben ICollection.mqh 14 18

und dann gibt es einen ganzen Stapel von Fehlern...

Versuchen Sie es so:

#include <Generic\\ArrayList.mqh>

class Option {
   string name;
   color  clr;
};

...

CArrayList<Option*> _options;
 
Sergey Eremin:

Versuchen Sie es auf diese Weise:

Die Übergabe/Speicherung von Zeigern auf eine Sammlung ist konzeptionell falsch.

 
Andrey Pogoreltsev:

Die Übergabe/Speicherung von Zeigern auf eine Sammlung ist konzeptionell falsch.

Es gibt keine Generika für MQL, die auch nur annähernd geeignet ist. Alle haben schwerwiegende Fehler. Verwenden Sie ein eingebautes Array, es wird Ihnen weniger Kopfschmerzen bereiten.

 
TheXpert:

Es gibt keine Generika für MQL, die auch nur annähernd geeignet ist. Alle haben schwerwiegende Fehler. Verwenden Sie ein eingebettetes Array, es wird Ihnen weniger Kopfschmerzen bereiten.

Nun, ja, ich habe ein Array verwendet. Warum sollte man Sammlungen erstellen und in kodobase einpflegen, wenn sie nur für eingebaute Typen geeignet sind?)

Grund der Beschwerde: