Erreurs, bugs, questions - page 1542

 
comp:
Si vous supprimez la définition de l'opérateur dans cette classe, elle commence à compiler sous MT5. Cela semble être un bug dans le compilateur de 5.

Essayez de substituer

__MQL5__

à

__MQL5BUILD__.

 
coderex:

Essayez de substituer

__MQL5__

à

__MQL5BUILD__

Pour ne pas être confondu avec la compilation conditionnelle, je l'ai supprimée.

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

Cinq ne peut pas compiler, quatre est OK.

 
comp:

Pour éviter toute confusion avec la compilation conditionnelle, je l'ai supprimé

Cinq ne peut pas compiler, quatre est OK.

Quel est le journal des erreurs ?
 
coderex:
Quel est le journal des erreurs ?
ObjectSetDouble' - aucune des surcharges ne peut être appliquée à l'appel de fonction.
ObjectSetInteger' - aucune des surcharges ne peut être appliquée à l'appel de fonction.

 
comp:
ObjectSetDouble' - aucune des surcharges ne peut être appliquée à l'appel de fonction.
ObjectSetInteger' - aucune des surcharges ne peut être appliquée à l'appel de fonction.

Je crois que j'ai compris. Dans MT5, vous devez clairement spécifier les trois ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER et ENUM_OBJECT_PROPERTY_DOUBLE. Dans MT4, il suffit de spécifier int, et tout fonctionnera.

Dans ce cas, je ne sais même pas si MQL5 est une meilleure solution que MQL4.

 
comp:
ObjectSetDouble' - aucune des surcharges ne peut être appliquée à l'appel de fonction.
ObjectSetInteger' - aucune des surcharges ne peut être appliquée à l'appel de fonction.

Vous avez passé un paramètreENUM_OBJECT_PROPERTY_STRING id invalide comme paramètre d'entrée à la méthode ObjectSetDouble et ObjectSetInteger.

En général, ne faites pas une bibliothèque commune pour deux langues, il y aurait plus de confusion.

 
comp:

Je crois que j'ai compris. Dans MT5, les trois ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER et ENUM_OBJECT_PROPERTY_DOUBLE doivent être clairement spécifiés. Dans MT4, il suffit de spécifier int, et tout fonctionnera.

Exactement !

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

Maintenant, il compile sur les deux plateformes. Il y a clairement une erreur dans l'aide 5.

 
comp:

Exactement !

Il compile maintenant sur les deux plateformes. Il y a clairement une erreur dans l'aide des cinq.

Quelle erreur ?
 
Slawa:
Quelle est l'erreur ?

Par exemple, dans la description de l'ObjectSetInteger maintenant

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

Il devrait l'être.

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

Qu'en est-il dans cinq cas avec IndicatorBuffers lorsque le nombre de tampons CURRENT ne peut être fixé de manière rigide via #property ? À quatre, il n'y a aucune restriction à ce sujet.

 
comp:

Par exemple, dans la description de l'ObjectSetInteger maintenant

Il devrait être

Lisez tous les articles jusqu'à la fin.

prop_id

[in] Identifiant de la propriété de l'objet. La valeur peut être l'une des valeurs de l'énumération ENUM_OBJECT_PROPERTY_INTEGER.

Je vous l'ai déjà dit. Lisez attentivement la documentation sans avoir un sabre à la main.