Errori, bug, domande - pagina 2952

 
Alexey Rassvetnyy:

Per favore, correggete questo bug. MQL5 non permette di usare alcuni enum incorporati come parametri generici, per esempio: ENUM_CHART_PROPERTY_DOUBLE, ENUM_CHART_PROPERTY_STRING.

Non c'è nessun problema con gli enum personalizzati e altri incorporati.

Il problema sorge perché l'enum non ha un elemento con un valore zero. Sono riuscito a creare il mio enum che genera questo errore di compilazione.

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

Il problema si verifica perché l'enum non contiene un elemento con un valore nullo. Siamo riusciti a creare il nostro enum, che genera questo errore di compilazione.

Nel tuo caso, aggiustare il file di libreria aiuterà

//+------------------------------------------------------------------+
//| 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:

Nel tuo caso, aggiustare il file di libreria aiuterà

Grazie, funziona.

Tuttavia, se correggo a mano un file che supporta MQ, il prossimo aggiornamento annullerà le mie modifiche. Abbiamo bisogno che gli sviluppatori che supportano la libreria standard facciano castoff NULL ai tipi parametrici in tutto il codice della libreria standard o stringano il compilatore per fare in modo che NULL possa automaticamente castare a qualsiasi tipo senza istruzioni esplicite.

 
Alexey Rassvetnyy:

Gli sviluppatori che supportano la libreria standard dovrebbero lanciare NULL a tipi parametrici in tutto il codice della libreria standard o stringere il compilatore per rendere NULL automaticamente cast a qualsiasi tipo senza istruzioni esplicite.

Gli sviluppatori hanno un principio: più semplice è, meglio è. Beh, non è un assemblatore, quindi potete usarlo. Forse è così che dovrebbe essere.

 
DMITRII PECHERITSA:

Nel tuo caso, aggiustare il file di libreria aiuterà

Grazie per il suo messaggio.

Fatto queste correzioni nel SB

 
Ilyas:

Grazie per il suo messaggio.

Fatto queste correzioni nel SB

Corretto non solo per le chiavi ma anche per i valori?

 
Stanislav Korotky:

Corretto non solo per le chiavi ma anche per i valori?

Sì, anche per i valori

 
Ilyas:

È possibile che il debugger, quando mostra il contenuto di una struttura, possa rimuovere alcuni dei suoi campi da quelli osservati?


Ci sono diverse grandi strutture. Dovete confrontarli per cinque campi con i vostri occhi. Non funziona.

 

Buongiorno, per favore aiutatemi a risolvere questo problema.

Prima di inviare e controllare una richiesta di trading in MT5-advisor uso la seguente variante della definizionetype_filling:

// тип 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;
}

Ma ho affrontato il fatto che questa costruzione risulta funzionare non su tutti i conti e non per tutti i broker. Dopo aver controllato la richiesta pronta attraverso OrderCheck, appare l'errore 10030 (Viene specificato un tipo di ordine non supportato per il saldo). In questo caso SYMBOL_FILLING = 3, e il tipo ORDER_FILLING_RETURN è selezionato.

Non uso librerie esterne (come CTrade). Per favore aiutatemi o indirizzatemi dove posso trovare la risposta alla mia domanda.

Grazie in anticipo!

 
fxsaber:

È possibile che il debugger, quando mostra il contenuto di una struttura, sia in grado di rimuovere alcuni dei suoi campi da quelli osservati?


Ci sono diverse grandi strutture. Dovete confrontarli per cinque campi con i vostri occhi. Non funziona.

Il modo migliore è quello di visualizzare il valore di qualsiasi variabile al passaggio del mouse nel sorgente - così non hai bisogno di aggiungere nulla alla watch-list e il campodi qualsiasi annidamento è disponibile senza una catena di dereferenziazione (e campi vicini).