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

 

컴파일러 오류입니다. 오래된 빌드에서 잘 작동합니다.

 struct A { };

template < typename T> 
struct B : T { };   // 'A' - unexpected token

struct C : B<A> { };
 

간단한 Expert Advisor가 있습니다(스크린샷 참조).

차트 개체는 차트에 겹쳐집니다.

어제 터미널 업데이트 전에는 차트에 거래 수준이 표시되었지만 지금은 사라졌습니다.

매뉴얼의 예 에 표시된 대로 차트를 작성합니다. 거래 수준을 표시하기 위한 속성이 없습니다(이러한 속성은 기본 차트에만 존재합니다).

도와주세요, 제발.

MetaTrader 거래 플랫폼의 스크린샷

GBPUSD, M5, 2020.05.25

Forex Club International Limited, MetaTrader 5, Real

GBPUSD, M5, 2020.05.25, Forex Club International Limited, MetaTrader 5, Real


Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
  • www.mql5.com
//| Создает объект "График"                                          |               chart_ID=0,                               sub_window=0,                             x=0,                                      y=0,                                      width=300,                                height=200,               ...
 

안녕하세요. 쓰여진 내용을 이해하도록 도와주세요.

mqlrate rt[2] ;

이것이 동일한 구조 데이터를 자동으로 수신한 두 구조의 배열이라는 것을 올바르게 이해하고 있습니까?

데이터 배열에 더 이상 할당이 없고 배열의 데이터가 즉시 사용된다는 것입니다.
 
Ivan_Invanov :

안녕하세요. 쓰여진 내용을 이해하도록 도와주세요.

mqlrate rt[2] ;

이것이 동일한 데이터를 자동으로 수신한 두 구조의 배열이라는 것을 올바르게 이해하고 있습니까?

MQL5에서 녹음:

 MqlRates rt[ 2 ]

의미: 두 MqlRates 구조의 정적 배열이 선언 됩니다. 일단 선언되면 이러한 구조는 쓰레기를 저장할 수 있으므로 이러한 구조는 명시적으로 데이터로 채워야 합니다.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
  • www.mql5.com
Константы, перечисления и структуры / Структуры данных / Структура исторических данных - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov :

MQL5에서 녹음:

의미: 두 MqlRates 구조의 정적 배열이 선언 됩니다. 일단 선언되면 이러한 구조는 정크를 저장할 수 있으므로 이러한 구조는 데이터로 명시적으로 채워야 합니다.

고맙습니다.
 
Alexey Navoykov :

컴파일러 오류입니다. 오래된 빌드에서 잘 작동합니다.

네, 2020.03.25 보고 도 벌써 2달째 같은 날 그런게 있습니다...
( MT5(빌드 2390)에서 수정되지 않음 ) (신규) 템플릿 매개변수가 기본 클래스인 경우 템플릿 클래스에서 상속할 때 기본 액세스 한정자를 사용할 때 컴파일 오류가 발생합니다.

 

또 다른 버그:

 class A
{
   void operator =(A const &) = delete ;
};

class B : public A
{
};

class C : public B
{
};

class D : public C
{
 public :
   void operator =(A const & other) { }
};

void OnStart ()
{
  C c;
  D d;
  d = c; // attempting to reference deleted function 'void C::operator=(const C&)'
}

D::operator=가 여기에서 실행되지만 C::operator=에서 맹세합니다. 버그를 해결하려면 계층 구조의 모든 기본 클래스에 대해 연산자를 오버로드해야 합니다.


ps 일반적으로 개발자들은 오랫동안 할당 연산자 의 잘못된 동작을 수정하겠다고 약속했지만 여전히 문제가 있습니다. 이 엉망. 예를 들어 다음 코드는 지옥이 할당되어 있어도 오류 없이 컴파일됩니다.

 #include <Expert\Expert.mqh>

#include <Strings\String.mqh>

void OnStart ()
{
  CExpert Expert;
  CString String;
  Expert = String; // Ошибки нет. Типа всё нормально?
}
 
Alexey Navoykov :

또 다른 버그:
1) D::operator=가 여기에서 실행되지만 C::operator=에서 맹세합니다. 버그를 해결하려면 계층 구조의 모든 기본 클래스에 대해 연산자를 오버로드해야 합니다.
2) 일반적으로 개발자 들은 할당 연산자의 잘못된 동작을 오랫동안 수정하겠다고 약속했지만 여전히 존재합니다. 이 엉망. 예를 들어 다음 코드는 지옥이 할당되어 있어도 오류 없이 컴파일됩니다.

1) 버그가 아닐 가능성이 높지만 MQL의 기능을 고려할 때 다음과 같은 일반적인 동작입니다.
MQL에서 기본 클래스의 메소드와 필드는 하위 클래스에서 "직접 사용 가능"합니다.
본질적으로 상속 중 MQL의 동작은 각 기본 필드 및 메서드에 대해 선언을 사용하여 적용하는 C ++의 동작과 유사합니다.
C++ 온라인: https://onlinegdb.com/rJkckvFsU

 class A
{
public :
   void operator =(A const &) = delete ;
};

class B : public A
{
};

class C : public B
{
public :
     //void operator=(C const& other) { printf("C");}
};

class D : public C
{
public :
#ifdef __cplusplus
  using A:: operator =;
  using B:: operator =;
  using C:: operator =;
#endif
   void operator =(A const & other) { printf ( "D" );}
};

void OnStart ()
{
  C c;
  D d;
  d = c; 
}



따라서 작업에서 d = c;
적절한 함수를 검색할 때 기본 클래스의 모든 operator= 함수도 참여합니다.
결과적으로 오버로드된 함수를 호출하기 위한 최적의 서명은 기본값이며 제거된 void operator=(const C&)입니다.

 
Sergey Dzyublik :

1) 버그가 아닐 가능성이 높지만 MQL의 기능을 고려할 때 다음과 같은 일반적인 동작입니다.
MQL에서 기본 클래스의 메소드와 필드는 하위 클래스에서 "직접 사용 가능"합니다.
본질적으로 상속 중 MQL의 동작은 각 기본 필드 및 메서드에 대해 선언을 사용하여 적용하는 C ++의 동작과 유사합니다.
C++ 온라인: https://onlinegdb.com/rJkckvFsU


따라서 작업에서 d = c;
적절한 함수를 검색할 때 기본 클래스의 모든 operator= 함수도 참여합니다.
결과적으로 오버로드된 함수를 호출하기 위한 최적의 서명은 기본값이며 제거된 void operator=(const C&)입니다.

언어의 명백한 결함에서 신성한 의미를 찾을 필요는 없습니다. 여기에서 이미 이 문제를 제기했으며 Ilyas는 해결될 것이라고 확신했습니다. 하지만 거의 10개월이 지난 지금...

실제로 상속 중 MQL의 동작은 선언을 사용하여 C++ 적용의 동작과 유사합니다.

네, 하지만 MQL에서 2 x 2 = 5를 가질 수 있다면 이것은 C++에서 결과에 증분 연산이 추가되는 방식과 유사하다고 말할 수 있습니다.

 
Alexey Navoykov :

언어의 명백한 결함에서 신성한 의미를 찾을 필요는 없습니다.

그들은 그것이 당신에게 어려운 경우 어떻게 그리고 왜 이렇게 작동하는지 설명했습니다. 다행스럽게도 나는 당신을 도울 수 없습니다 ...
이것은 신성한 의미가 아니라 "this."를 사용하지 않고 기본 클래스의 필드와 메소드에 액세스 할 수 있도록 사용자의 입력 수준을 줄이는 일반적인 접근 방식뿐만 아니라 기본 클래스 기능을 오버로드하는 경우에도 마찬가지입니다. .