错误、漏洞、问题 - 页 1542

 
comp:

为什么这个类在MT4下可以编译,而在MT5下不能编译?

如果你删除这个类中的操作者定义,它就会在MT5下开始编译。这似乎是MT5编译器的一个错误。
 
comp:
如果你删除这个类中的操作者定义,它就会在MT5下开始编译。这似乎是5的编译器的一个错误。

试着替代

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

五个不能编译,四个就可以了。

 
comp:

为了避免与条件编译的混淆,我把它删除了

五个不能编译,四个就可以了。

什么是错误日志?
 
coderex:
错误记录是什么?
'ObjectSetDouble' - 没有一个重载可以应用于函数调用
'ObjectSetInteger' - 没有一个重载可以应用于函数调用

 
comp:
'ObjectSetDouble' - 没有一个重载可以应用于函数调用
'ObjectSetInteger' - 没有一个重载可以应用于函数调用

我想我已经得到了。在MT5中,你必须明确指定ENUM_OBJECT_PROPERTY_STRING、ENUM_OBJECT_PROPERTY_INTEGER和ENUM_OBJECT_PROPERTY_DOUBLE三种。在MT4中,只需指定int,一切都会正常。

在这种情况下,我甚至不知道MQL5是否是比MQL4更好的解决方案。

 
comp:
'ObjectSetDouble' - 没有一个重载可以应用于函数调用
'ObjectSetInteger' - 没有一个重载可以应用于函数调用

你把一个无效的参数ENUM_OBJECT_PROPERTY_STRING id 作为输入参数传给方法ObjectSetDouble和ObjectSetInteger

一般来说,不要为两种语言做一个共同的库,这样会有更多的混乱。

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

现在它在两个平台上都能编译。帮助5中显然有一个错误。

 
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 // значение 
   );

当CURRENT缓冲区的数量不能通过#property硬性设置时,在5个IndicatorBuffers中怎么办?在四人组中,这没有任何限制。

原因: