Ошибки, баги, вопросы - страница 1542

 
comp:

Почему этот класс компилируется под MT4, но не компилируется под MT5?

Если в этом классе удалить определение оператора, то под MT5 начинает компилироваться. Похоже, это баг компилятора пятерки.
 
comp:
Если в этом классе удалить определение оператора, то под MT5 начинает компилироваться. Похоже, это баг компилятора пятерки.

Попробуйте заменить

__MQL5__

на

__MQL5BUILD__

 
coderex:

Попробуйте заменить

__MQL5__

на

__MQL5BUILD__

Чтобы не смущала условная компиляция, убрал ее

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

Пятерка не может скомпилировать, четверка - OK. 

 
comp:

Чтобы не смущала условная компиляция, убрал ее

Пятерка не может скомпилировать, четверка - OK. 

а лог ошибок какой выдает?
 
coderex:
а лог ошибок какой выдает?
'ObjectSetDouble' - no one of the overloads can be applied to the function call
'ObjectSetInteger' - no one of the overloads can be applied to the function call

 
comp:
'ObjectSetDouble' - no one of the overloads can be applied to the function call
'ObjectSetInteger' - no one of the overloads can be applied to the function call

Похоже, догадался. В MT5 надо четко указывать все три ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER и ENUM_OBJECT_PROPERTY_DOUBLE. А в MT4 достаточно просто указать int, и все будет работать.

В данном случае даже и не знаю, является ли MQL5 лучшим решением, чем MQL4. 

 
comp:
'ObjectSetDouble' - no one of the overloads can be applied to the function call
'ObjectSetInteger' - no one of the overloads can be applied to the function call

Все верно он ругнулся, в метод передаете в качестве входного параметра для ObjectSetDouble и ObjectSetInteger недопустимый параметр ENUM_OBJECT_PROPERTY_STRING id

Вообще не делайте вы общую библиотеку для двух языков, больше путаницы будет, сам одно время так делал, потом пришлось все переделывать. 

 
comp:

Похоже, догадался. В MT5 надо четко указывать все три ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER и ENUM_OBJECT_PROPERTY_DOUBLE. А в MT4 достаточно просто указать int, и все будет работать.

Точно!

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

 Теперь компилится в обеих платформах. В справке пятерки явно ошибка.

 
comp:

Точно!

 Теперь компилится в обеих платформах. В справке пятерки явно ошибка.

Какая ошибка?
 
Slawa:
Какая ошибка?

Например, в описании ObjectSetInteger сейчас

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

 А должно быть

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

Как в пятерке с IndicatorBuffers быть в случае, когда количество ВЫЧИСЛИТЕЛЬНЫХ буферов нельзя жестко задать через #property? В четверке с этим нет ограничений.

Причина обращения: