エラー、バグ、質問 - ページ 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;
  }
};

5はコンパイルできない、4はOK。

 
comp:

条件付きコンパイルとの混同を避けるため、削除しました。

5はコンパイルできない、4はOK。

エラーログとは何ですか?
 
coderex:
エラーログは?
'ObjectSetDouble' -関数 呼び出しに適用できるオーバーロードは1つもありません。
'ObjectSetInteger' - 関数呼び出しに適用できるオーバーロードは1つもありません。

 
comp:
'ObjectSetDouble' - 関数呼び出しに適用できるオーバーロードは1つもありません。
'ObjectSetInteger' - 関数呼び出しに適用できるオーバーロードは1つもありません。

できたと思う。MT5では、ENUM_OBJECT_PROPERTY_STRING、ENUM_OBJECT_PROPERTY_INTEGER、ENUM_OBJECT_PROPERTY_DOUBLEの3つをすべて明確に指定する必要があります。MT4では、intを指定するだけで、すべて動作します。

この場合、MQL5がMQL4よりも良い解決策なのかどうかもわかりません。

 
comp:
'ObjectSetDouble' - 関数呼び出しに適用できるオーバーロードは1つもありません。
'ObjectSetInteger' - 関数呼び出しに適用できるオーバーロードは1つもありません。

ObjectSetDouble およびObjectSetInteger メソッドの入力パラメータとして、無効なパラメータENUM_OBJECT_PROPERTY_STRING id を渡しました。

一般に、2つの言語で共通のライブラリを作ると、かえって混乱することが多いので、作らないでください。

 
comp:

わかったような気がします。MT5では、ENUM_OBJECT_PROPERTY_STRING、ENUM_OBJECT_PROPERTY_INTEGER、ENUM_OBJECT_PROPERTY_DOUBLEの3つはすべて明確に指定する必要があります。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:

そのとおりです。

両プラットフォームでコンパイルできるようになりました。5のヘルプに明らかに間違いがある。

どんな間違い?
 
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との5つで、CURRENTバッファの数を#propertyで厳密に設定できない場合はどうでしょうか。4人制の場合、これによる制限はない。