Errori, bug, domande - pagina 1542

 
comp:

Perché questa classe si compila sotto MT4 ma non sotto MT5?

Se si rimuove la definizione di operatore in questa classe, inizia a compilare sotto MT5. Questo sembra essere un bug nel compilatore MT5.
 
comp:
Se si rimuove la definizione di operatore in questa classe, inizia a compilare sotto MT5. Questo sembra essere un bug nel compilatore del 5.

Prova a sostituire

__MQL5__

a

__MQL5BUILD__.

 
coderex:

Prova a sostituire

__MQL5__

a

__MQL5BUILD__

Per non essere confuso dalla compilazione condizionale, l'ho rimosso.

class CHARTOBJECT
{
public:
  template <typename T>
// для MT4 надо заменить ENUM_OBJECT_PROPERTY_STRING на int  
  void SetProperty( const ENUM_OBJECT_PROPERTY_STRING id, const T Value, const int Modifier = 0 ) const
  {
    const string sType = typename(T);

    if (sType == "double")
      ::ObjectSetDouble(0, "", id, Modifier, (double)Value);
    else if (sType == "string")
      ::ObjectSetString(0, "", id, Modifier, (string)Value);
    else
      ::ObjectSetInteger(0, "", id, Modifier, (long)Value);

    return;
  }
  
  virtual void operator =( const string Value ) const
  {
    this.SetProperty(OBJPROP_TEXT, Value);

    return;
  }
};

Cinque non possono compilare, quattro vanno bene.

 
comp:

Per evitare confusione con la compilazione condizionale, l'ho rimosso

Cinque non possono compilare, quattro vanno bene.

Cos'è il registro degli errori?
 
coderex:
Qual è il registro degli errori?
ObjectSetDouble' - nessuno degli overload può essere applicato alla chiamata di funzione
'ObjectSetInteger' - nessuno degli overload può essere applicato alla chiamata di funzione

 
comp:
ObjectSetDouble' - nessuno degli overload può essere applicato alla chiamata di funzione
'ObjectSetInteger' - nessuno degli overload può essere applicato alla chiamata di funzione

Credo di aver capito. In MT5 dovete specificare chiaramente tutti e tre ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER e ENUM_OBJECT_PROPERTY_DOUBLE. In MT4, basta specificare int, e tutto funzionerà.

In questo caso non so nemmeno se MQL5 è una soluzione migliore di MQL4.

 
comp:
ObjectSetDouble' - nessuno degli overload può essere applicato alla chiamata di funzione
'ObjectSetInteger' - nessuno degli overload può essere applicato alla chiamata di funzione

Hai passato un parametro non validoENUM_OBJECT_PROPERTY_STRING id come parametro di input ai metodi ObjectSetDouble e ObjectSetInteger.

In generale, non fate una libreria comune per due lingue, ci sarebbe più confusione.

 
comp:

Credo di aver capito. In MT5 tutti e tre gli ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER e ENUM_OBJECT_PROPERTY_DOUBLE devono essere chiaramente specificati. In MT4, basta specificare int, e tutto funzionerà.

Esattamente!

#ifdef __MQL4__
  #define ENUM_OBJECT_PROPERTY_DOUBLE int
  #define ENUM_OBJECT_PROPERTY_STRING int
  #define ENUM_OBJECT_PROPERTY_INTEGER int
#endif

class CHARTOBJECT
{
public:
  template <typename T>
  void SetProperty( const int id, const T Value, const int Modifier = 0 ) const
  {
    const string sType = typename(T);

    if (sType == "double")
      ::ObjectSetDouble(0, "", (ENUM_OBJECT_PROPERTY_DOUBLE)id, Modifier, (double)Value);
    else if (sType == "string")
      ::ObjectSetString(0, "", (ENUM_OBJECT_PROPERTY_STRING)id, Modifier, (string)Value);
    else
      ::ObjectSetInteger(0, "", (ENUM_OBJECT_PROPERTY_INTEGER)id, Modifier, (long)Value);

    return;
  }
  
  virtual void operator =( const string Value ) const
  {
    this.SetProperty(OBJPROP_TEXT, Value);

    return;
  }
};

Ora compila su entrambe le piattaforme. C'è chiaramente un errore nella Guida 5.

 
comp:

Esattamente!

Ora compila su entrambe le piattaforme. C'è chiaramente un errore nell'aiuto dei cinque.

Quale errore?
 
Slawa:
Qual è l'errore?

Per esempio, nella descrizione di ObjectSetInteger ora

bool  ObjectSetInteger( 
   long    chart_id,          // идентификатор графика 
   string  name,              // имя 
   int     prop_id,           // свойство 
   long    prop_value         // значение 
   );

Dovrebbe essere.

bool  ObjectSetInteger( 
   long                          chart_id,  // идентификатор графика 
   string                        name,      // имя 
   ENUM_OBJECT_PROPERTY_INTEGER  prop_id,   // свойство 
   long                          prop_value // значение 
   );

E in cinque con IndicatorBuffers quando il numero di buffer CURRENT non può essere impostato rigidamente tramite #property? Nei quattro non c'è nessuna restrizione con questo.