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

 
fxsaber :

2365 - 코드에 오류가 있습니다. 그것을 알아낼 시간이 없었습니다. 2361로 롤백 - 정상. mq4에서 - 같은 상황입니다.

쪽지 감사합니다 확인하겠습니다

 
새 버전의 MT5(빌드 2365)를 다운로드했는데 불행히도 문제가 발생했습니다.
기본 클래스 생성자를 호출할 때 매개변수를 전달하는 것과 유사합니다.
 
Sergey Dzyublik :
MT5 버그(빌드 2365) 참조로 포인터를 전달할 때 할당 연산자를 사용하여 클래스 생성자 를 암시적으로 호출할 때 컴파일 오류가 생성자 인수로 사용됩니다.
참조로 전달되는 포인터가 값으로 전달되는 것으로 대체되면 모든 것이 작동합니다.

올려주셔서 감사합니다 수정했습니다

 

템플릿 클래스의 템플릿 매개변수를 기본 클래스로 사용할 때 기본 클래스 생성자 를 호출할 때 MT5 버그(빌드 2365) 컴파일 오류가 발생합니다.
MT5(빌드 2363)에는 문제가 없었습니다.

 class B;

template < typename T>
class A : public T{
public :
   A() : T(){}   // 'B' - identifier expected
};


class B{};

void OnStart (){
   A<B> a;
};
 
Ilyas :
개체에 대한 ArrayResize가 더 빠르게 작동하기 시작한 것을 알 수 있습니다.
다시 한 번, ArrayResize 함수의 일부 중 하나의 복잡성이 로그에서 0으로 감소했습니다.

예약된 메모리에 대한 ArrayResize 속도를 높여주셔서 대단히 감사합니다.
실제 프로젝트의 MT5(빌드 2365)에서는 std::vector::push_back의 속도가 이전 빌드에 비해 1.5배 빨라졌습니다.
그리고 std::vector:resize 뒤의 지연이 2.2배에서 1.45배로 줄었습니다.

 

빌드 2366, 제 생각에는 상수가 지금 올바르게 작동하지 않습니다.

 class A
{
private :
   int                f1(){ Print ( __FUNCTION__ ); return ( 1 );}
   int                f2(){ Print ( __FUNCTION__ ); return ( 2 );}
public :
   int                func( int v){ const int a = f1(); const int b = f2(); return (a+b+v);}
};

A a1,a2;
//+------------------------------------------------------------------+
void OnStart ()
{
   Print ( "1. " ,a1.func( 1 ));
   Print ( "2. " ,a1.func( 2 ));
   Print ( "3. " ,a2.func( 3 ));
   Print ( "4. " ,a2.func( 4 ));
}
//+------------------------------------------------------------------+

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 십사

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2.5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3.6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4.7

const 를 static 으로 바꾸면 예상대로 작동합니다. a 및 b를 초기화할 때 f1() 및 f2()를 한 번 호출합니다.

   int                func( int v){ static int a = f1(); static int b = f2(); return (a+b+v);}

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 십사

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2.5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3.6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4.7

 

그런 코드를 작성하면 일반적으로 잡을 수 없는 지속적인 버그

 class A
{
private :
   int                f1() const { static int v1= 1 ; Print ( __FUNCTION__ ); return (v1++);}
   int                f2() const { static int v2= 1 ; Print ( __FUNCTION__ ); return (v2++);}
public :
   int                func( int v){ const int a = f1(); const int b = f2(); return (a+b+v);}
};
 
Igor Makanu :

빌드 2366, 제 생각에는 상수가 지금 올바르게 작동하지 않습니다.

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 십사

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2.5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3.6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4.7

const 를 static 으로 바꾸면 예상대로 작동합니다. a 및 b를 초기화할 때 f1() 및 f2()를 한 번 호출합니다.

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 십사

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2.5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3.6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4.7

그것이 정확히 작동하는 방식입니다.

 
Igor Makanu :

그런 코드를 작성하면 일반적으로 잡을 수 없는 지속적인 버그

여기에서도 모든 것이 맞습니다.

 
Koldun Zloy :

그것이 정확히 작동하는 방식입니다.

작년에 잘못 작동했습니다 - 특별히 테스트된 const 수정자

@Ilyas 는 MQL 프로그램이 시작되는 방법을 설명한 것 같습니다. 먼저 설명된 위치에 관계없이 모든 const 및 static이 초기화된 다음 클래스 생성자가 호출됩니다.

좋아, 이 정적 / const 초기화를 사용하면 - 여전히 올바르게 배포될 수 있지만 여기에는 const 수정자가 컴파일러가 이를 확인할 것을 보장하지 않는다는 사실이 있습니다. 매우 예상치 못한 - 내 두 번째 예