Fehler, Irrtümer, Fragen - Seite 1542

 
comp:

Warum kompiliert diese Klasse unter MT4, aber nicht unter MT5?

Wenn Sie die Operator-Definition in dieser Klasse entfernen, beginnt sie unter MT5 zu kompilieren. Dies scheint ein Fehler im MT5-Compiler zu sein.
 
comp:
Wenn Sie die Operator-Definition in dieser Klasse entfernen, beginnt sie unter MT5 zu kompilieren. Dies scheint ein Fehler im Compiler von 5 zu sein.

Versuchen Sie zu ersetzen

__MQL5__

zu

__MQL5BUILD__.

 
coderex:

Versuchen Sie zu ersetzen

__MQL5__

zu

__MQL5BUILD__

Um nicht durch die bedingte Kompilierung verwirrt zu werden, habe ich sie entfernt.

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

Fünf können nicht kompiliert werden, vier sind OK.

 
comp:

Um Verwechslungen mit der bedingten Kompilierung zu vermeiden, habe ich sie entfernt

Fünf können nicht kompiliert werden, vier sind OK.

Wie lautet das Fehlerprotokoll?
 
coderex:
Wie lautet das Fehlerprotokoll?
ObjectSetDouble' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden
ObjectSetInteger' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden

 
comp:
ObjectSetDouble' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden
ObjectSetInteger' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden

Ich glaube, ich habe es herausgefunden. In MT5 müssen Sie alle drei ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER und ENUM_OBJECT_PROPERTY_DOUBLE eindeutig angeben. In MT4 geben Sie einfach int an, und alles wird funktionieren.

In diesem Fall weiß ich nicht einmal, ob MQL5 eine bessere Lösung als MQL4 ist.

 
comp:
ObjectSetDouble' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden
ObjectSetInteger' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden

Sie haben einen ungültigen ParameterENUM_OBJECT_PROPERTY_STRING id als Eingabeparameter an die Methoden ObjectSetDouble und ObjectSetInteger übergeben.

Im Allgemeinen sollte man keine gemeinsame Bibliothek für zwei Sprachen erstellen, da dies zu mehr Verwirrung führen würde.

 
comp:

Ich glaube, ich habe es herausgefunden. In MT5 müssen alle drei ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER und ENUM_OBJECT_PROPERTY_DOUBLE eindeutig angegeben werden. In MT4 geben Sie einfach int an, und alles wird funktionieren.

Ganz genau!

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

Jetzt wird es auf beiden Plattformen kompiliert. Hier liegt eindeutig ein Fehler in der Hilfe 5 vor.

 
comp:

Ganz genau!

Er kompiliert jetzt auf beiden Plattformen. Es liegt eindeutig ein Fehler in der Hilfe der Fünf vor.

Welcher Fehler?
 
Slawa:
Worin besteht der Fehler?

In der ObjectSetInteger-Beschreibung heißt es jetzt zum Beispiel

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

So sollte es sein.

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

Was ist mit fünf Indikatorpuffern, wenn die Anzahl der AKTUELLEN Puffer nicht starr über #property festgelegt werden kann? Bei Vierern gibt es dabei keine Einschränkung.