Erros, bugs, perguntas - página 1542

 
comp:

Porque é que esta classe se compila sob MT4 mas não sob MT5?

Se retirar a definição de operador nesta classe, a compilação começa sob MT5. Isto parece ser um bug no compilador MT5.
 
comp:
Se retirar a definição de operador nesta classe, a compilação começa sob MT5. Isto parece ser um bug no compilador de 5.

Tente substituir

__MQL5__

para

__MQL5BUILD__.

 
coderex:

Tente substituir

__MQL5__

para

__MQL5BUILD__

Para não ser confundido por uma compilação condicional, removi-a.

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;
  }
};

Cinco não podem compilar, quatro está OK.

 
comp:

Para evitar confusão com a compilação condicional, removi-a

Cinco não podem compilar, quatro está OK.

O que é o registo de erros?
 
coderex:
O que é o registo de erros?
ObjectSetDouble' - nenhuma das sobrecargas pode ser aplicada à chamada de função
ObjectSetInteger' - nenhuma das sobrecargas pode ser aplicada à chamada de função

 
comp:
ObjectSetDouble' - nenhuma das sobrecargas pode ser aplicada à chamada de função
ObjectSetInteger' - nenhuma das sobrecargas pode ser aplicada à chamada de função

Acho que já o tenho. Em MT5 deve especificar claramente os três ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER e ENUM_OBJECT_PROPERTY_DOUBLE. Em MT4, basta especificar int, e tudo irá funcionar.

Neste caso, nem sequer sei se a MQL5 é uma solução melhor do que a MQL4.

 
comp:
ObjectSetDouble' - nenhuma das sobrecargas pode ser aplicada à chamada de função
ObjectSetInteger' - nenhuma das sobrecargas pode ser aplicada à chamada de função

Passou um parâmetro inválidoENUM_OBJECT_PROPERTY_STRING id como parâmetro de entrada para o método ObjectSetDouble e ObjectSetInteger.

Em geral, não fazer uma biblioteca comum para duas línguas, haveria mais confusão.

 
comp:

Acho que já descobri. Em MT5 todos os três ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER e ENUM_OBJECT_PROPERTY_DOUBLE devem ser claramente especificados. Em MT4, basta especificar int, e tudo irá funcionar.

Exactamente!

#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;
  }
};

Agora compila em ambas as plataformas. Há claramente um erro no Help 5.

 
comp:

Exactamente!

Agora compila em ambas as plataformas. Há claramente um erro na ajuda dos cinco.

Que erro?
 
Slawa:
O que é o erro?

Por exemplo, na descrição do ObjectSetInteger agora

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

Deveria ser.

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

E em cinco com o IndicatorBuffers quando o número de amortecedores CURRENT não pode ser fixado rigidamente via #property? Em quatro não há restrições com isto.