mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 227

 
fxsaber #:
흥미로운 결과입니다.

아직 수정되지 않은 것이 이상하네요:

트레이딩, 자동매매 시스템 및 트레이딩 전략 테스트 포럼

버그, 버그, 질문

A100, 2020.08.01 05:42

실행 중 오류가 발생했습니다:
template<typename T>
void f( T ) { Print( __FUNCTION__); }
void OnStart()
{
        {
                f<ulong>( 1 );
        }
}

Result: OnStart::unnamed#00000216656562DC80::f<ulong>

예상: OnStart::f<ulong>


 
fxsaber #:
컴파일러 제한.

이것은 명백한 결함입니다. 컴파일러가 이미 그러한 코드에 대해 의료팀을 불러야 한다고 생각합니다.

중첩된 매크로에서 괄호는 이러한 수량으로 상상할 수 있지만 중괄호는 상상할 수 없습니다.
 
구조체/클래스 객체의 필드 초기화 순서가 생성자 뒤의 항목이 아닌 필드의 상호 배열에 따라 달라지는 경우 이것이 올바른 동작인지 알려주세요.
struct A
{
  int Count;
  
  A() : Count(0) {}
};

struct B : public A
{
  int i, j; // Единственная строка, отличающая от C.

  B() : i(this.Count++), j(this.Count++) {}
};

struct C : public A
{
  int j, i; // Единственная строка, отличающая от B.

  C() : i(this.Count++), j(this.Count++) {}
};

void OnStart()
{
  B b;  
  Print(b.i); // 0
  Print(b.j); // 1

  C c;
  Print(c.i); // 1
  Print(c.j); // 0
}

생성자에 지정된 대로 왼쪽에서 오른쪽으로 초기화할 것으로 예상했습니다.

C() : i(this.Count++), j(this.Count++) {}

하지만 필드별로 위에서 아래로 초기화되는 것으로 밝혀졌습니다. 그리고 생성자 뒤에 지정된 초기화 순서는 중요하지 않습니다. 이것이 맞나요?

 
fxsaber #:
구조체/클래스 객체의 필드 초기화 순서가 생성자 뒤의 항목이 아닌 필드의 상호 배열에 따라 달라지는 경우 이것이 올바른 동작인지 알려주세요.

생성자에 지정된 대로 왼쪽에서 오른쪽으로 초기화할 것으로 예상했습니다.

하지만 필드별로 위에서 아래로 초기화되는 것으로 밝혀졌습니다. 그리고 생성자 뒤에 지정된 초기화 순서는 중요하지 않습니다. 이것이 맞나요?

어차피 아무도 읽지 않는다면 개발자는 왜 이렇게 상세한 도움말 을 작성할까요? 도움말을 한 문장으로 단순화할 것을 제안합니다. 포럼에 질문하면 도움이 될 것입니다!

 
A100 #:

어차피 아무도 읽지 않는데 개발자는 왜 이렇게 상세한 도움말을 작성할까요? 저는 도움말을 한 문장으로 단순화할 것을 제안합니다: 포럼에 질문하면 도움을 드릴 것입니다!

도움말에서 질문에 대한 답을 찾는 계획이 명확 해지면 포럼 도움말에 덜 자주 의지 할 것입니다.

 
fxsaber #:

도움말에서 질문에 대한 답을 찾는 방식을 이해하면 포럼을 덜 자주 사용하게 될 것입니다.


"데이터 유형" -> "구조체 및 클래스"에서.

초기화 목록에서 멤버는 어떤 순서로든 이동할 수 있지만 모든 클래스 멤버는 선언 순서에 따라 초기화됩니다.
 
Sergey Gridnev #:

"데이터 유형" -> "구조 및 클래스"에서

초기화 목록에서 멤버는 어떤 순서로든 이동할 수 있지만 모든 클래스 멤버는 선언된 순서에 따라 초기화됩니다.

고마워요. 안타깝게도 어디를 어떻게 찾아야 할지 항상 명확하지는 않습니다.

 
fxsaber #:

감사합니다. 안타깝게도 어디에서 어떻게 찾아야 할지 항상 명확하지는 않습니다.

네, 그렇죠.
 


이벤트가 타이머 작업을 차단합니다.
Expert Advisor에는 그런 것이 없습니다.
다시 한 번 안정적인 타이머 작업이 필요한 곳에서 지표를 사용하는 것은 의미가 없다고 확신합니다.

다음은 타이머가 20밀리초로 설정되어 있고 타이머 이벤트 사이의 시간이 100밀리초를 초과하면 표시되는 이 문제를 보여주는 인디케이터입니다.

#property indicator_chart_window
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(20);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
void  OnTimer()
  {
   static uint last_time = GetTickCount();
   uint cur_time = GetTickCount();
   if (cur_time-last_time>100) Print(string(cur_time-last_time)+" ms");
   last_time = cur_time;
  }
//+------------------------------------------------------------------+



 
추가되었습니다.
template <typename T>
class A
{
public:  
  void f() const { ::Print(typename(T)); }
};

void OnStart()
{
  const A<MqlTick> a;
  
  a.f(); // struct MqlTick
}