오류, 버그, 질문 - 페이지 1542

 
comp :

이 클래스가 MT4에서는 컴파일되지만 MT5에서는 컴파일되지 않는 이유는 무엇입니까?

이 클래스에서 연산자 정의가 삭제되면 MT5에서 컴파일을 시작합니다. 컴파일러 버그인 것 같습니다.
 
comp :
이 클래스에서 연산자 정의가 삭제되면 MT5에서 컴파일을 시작합니다. 컴파일러 버그인 것 같습니다.

교체 시도

__MQL5__

__MQL5빌드__

 
coderex :

교체 시도

__MQL5__

__MQL5빌드__

조건부 컴파일을 혼동하지 않도록 제거했습니다.

 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개는 괜찮습니다.

 
comp :

조건부 컴파일을 혼동하지 않도록 제거했습니다.

5개는 컴파일할 수 없고 4개는 괜찮습니다.

어떤 오류 로그가 표시됩니까?
 
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 ;
  }
};

이제 두 플랫폼 모두에서 컴파일됩니다. 다섯 가지의 도움은 분명히 오류입니다.

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

#property를 통해 COMPUTATION 버퍼의 수를 하드 코딩할 수 없을 때 IndicatorBuffers로 상위 5위 안에 드는 방법은 무엇입니까? 네 번째에는 이에 대한 제한이 없습니다.

사유: