Fehler, Irrtümer, Fragen - Seite 2952

 
Alexey Rassvetnyy:

Bitte beheben Sie diesen Fehler. MQL5 erlaubt nicht die Verwendung einiger eingebauter Enums als generische Parameter, zum Beispiel: ENUM_CHART_PROPERTY_DOUBLE, ENUM_CHART_PROPERTY_STRING.

Es gibt kein Problem mit benutzerdefinierten Enum's und anderen eingebetteten Enum's.

Das Problem entsteht, weil die Aufzählung kein Element mit einem Nullwert hat. Es ist mir gelungen, mein eigenes Enum zu erstellen, das diesen Kompilierungsfehler erzeugt.

#include <Generic\HashMap.mqh>
enum TEST_ENUM {
   ENUM1, ENUM2
};
enum TEST_ENUM2 { //отсутствует элемент с номером 0
   ENUM1=-10, ENUM2
};
void OnStart()
  {
   CHashMap<ENUM_CHART_PROPERTY_INTEGER,int> mapI;    // эта срока комилируется без ошибок
   CHashMap<ENUM_CHART_PROPERTY_DOUBLE,double> mapD;  // здесь ошибки компиляции: 'NULL' - cannot convert enum  HashMap.mqh     21      39. 'NULL' - cannot convert enum        HashMap.mqh     462     30
   CHashMap<ENUM_CHART_PROPERTY_STRING,string> mapS;  // здесь ошибки компиляции: 'NULL' - cannot convert enum  HashMap.mqh     21      39. 'NULL' - cannot convert enum        HashMap.mqh     462     30
   CHashMap<TEST_ENUM,double> mapE;    // эта срока комилируется без ошибок
   CHashMap<TEST_ENUM2,double> mapE2;    // здесь ошибки компиляции: 'NULL' - cannot convert enum       HashMap.mqh     21      39. 'NULL' - cannot convert enum        HashMap.mqh     462     30
  }
 
Alexey Rassvetnyy:

Das Problem tritt auf, weil die Aufzählung kein Element mit einem Nullwert enthält. Es ist uns gelungen, eine eigene Aufzählung zu erstellen, die diesen Kompilierungsfehler erzeugt.

In Ihrem Fall hilft es, die Bibliotheksdatei zu reparieren

//+------------------------------------------------------------------+
//| fix HashMap.mqh                                                  |
//|  line 21  | was | Entry(void): key(NULL) {}                      |
//|           | now | Entry(void): key((TKey)NULL) {}                |
//|  line 462 | was | m_entries[i].key=NULL;                         |
//|           | now | m_entries[i].key=(TKey)NULL;                   |
//+------------------------------------------------------------------+
 
DMITRII PECHERITSA:

In Ihrem Fall hilft es, die Bibliotheksdatei zu reparieren

Danke, es funktioniert.

Wenn ich jedoch eine Datei, die MQ unterstützt, von Hand korrigiere, macht die nächste Aktualisierung meine Änderungen rückgängig. Wir brauchen Entwickler, die die Standardbibliothek unterstützen, um NULL in parametrische Typen im gesamten Code der Standardbibliothek umzuwandeln oder den Compiler zu verschärfen, damit NULL automatisch in jeden Typ umgewandelt werden kann, ohne dass explizite Anweisungen erforderlich sind.

 
Alexey Rassvetnyy:

Entwickler, die die Standardbibliothek unterstützen, sollten NULL im gesamten Code der Standardbibliothek in parametrische Typen casten oder den Compiler so verschärfen, dass NULL ohne explizite Anweisungen automatisch in jeden Typ gecastet wird.

Für Entwickler gilt der Grundsatz: Je einfacher, desto besser. Nun, es ist kein Assembler, also können Sie es verwenden. Vielleicht sollte es so sein.

 
DMITRII PECHERITSA:

In Ihrem Fall hilft es, die Bibliotheksdatei zu reparieren

Vielen Dank für Ihre Nachricht.

Diese Korrekturen wurden in der SB vorgenommen

 
Ilyas:

Vielen Dank für Ihre Nachricht.

Diese Korrekturen wurden in der SB vorgenommen

Nicht nur für Schlüssel, sondern auch für Werte korrigiert?

 
Stanislav Korotky:

Nicht nur für Schlüssel, sondern auch für Werte korrigiert?

Ja, auch für Werte

 
Ilyas:

Ist es möglich, dass der Debugger, wenn er den Inhalt einer Struktur anzeigt, einige seiner Felder aus den beobachteten Feldern entfernen kann?


Es gibt mehrere große Strukturen. Sie müssen sie in fünf Feldern mit den Augen vergleichen. Das funktioniert nicht.

 

Guten Tag, bitte helfen Sie mir bei der Lösung dieses Problems.

Vor dem Senden und Prüfen einer Handelsanfrage im MT5-Advisor verwende ich die folgende Variante dertype_filling-Definition:

// тип FILLING
int SYMBOL_FILLING = (int)SymbolInfoInteger(iNameSymbol, SYMBOL_FILLING_MODE);
switch(SYMBOL_FILLING)
{
   case SYMBOL_FILLING_FOK:   iЗапрос.type_filling = ORDER_FILLING_FOK;    break;
   case SYMBOL_FILLING_IOC:   iЗапрос.type_filling = ORDER_FILLING_IOC;    break;
   default:                   iЗапрос.type_filling = ORDER_FILLING_RETURN; break;
}

Aber ich bin mit der Tatsache konfrontiert, dass diese Konstruktion nicht bei allen Konten und nicht bei allen Brokern funktioniert, und nachdem ich eine fertige Anfrage durch OrderCheck überprüft habe, erscheint der Fehler 10030 (An unsupported order execution type by balance is specified). In diesem Fall ist SYMBOL_FILLING = 3, und der Typ ORDER_FILLING_RETURN ist ausgewählt.

Ich verwende keine externen Bibliotheken (wie CTrade). Bitte helfen Sie mir oder verweisen Sie mich darauf, wo ich die Antwort auf meine Frage finden kann.

Vielen Dank im Voraus!

 
fxsaber:

Ist es möglich, dass der Debugger, wenn er den Inhalt einer Struktur anzeigt, einige seiner Felder aus den beobachteten Feldern entfernen kann?


Es gibt mehrere große Strukturen. Sie müssen sie in fünf Feldern mit den Augen vergleichen. Das funktioniert nicht.

Am besten ist es, den Wert einer beliebigen Variablen beim Mouseover in der Quelle anzuzeigen - so müssen Sie nichts zur Watch-Liste hinzufügen und das Feldeiner beliebigen Verschachtelung ist ohne eine Kette von Dereferenzierungen (und benachbarter Felder) verfügbar.