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

 
Nikolai Semko :

특히 다음과 같이 특정 부정확성을 도입 하여 코드 를 최소한으로 단순화한 점에 대해 사과드립니다.
- 함수에 전달된 객체의 크기가 동일합니다(코드가 업데이트됨).
- 어리석은 출력 대신 printf("1");/printf("2"); 실제로 인터페이스 또는 객체 내부에 대한 액세스는 직접 수행되며, 이는 차례로 두 개의 알고리즘을 단일 호출 함수로 인라인하는 것을 가능하게 하지 않습니다(코드 업데이트됨).

 
Sergey Dzyublik :

특히 다음과 같이 특정 부정확성을 도입 하여 코드 를 최소한으로 단순화한 점에 대해 사과드립니다.
- 함수에 전달된 객체의 크기가 동일합니다(코드가 업데이트됨).
- 어리석은 출력 대신 printf("1");/printf("2"); 실제로 인터페이스 또는 객체 내부에 대한 액세스는 직접 수행되며, 이는 차례로 두 개의 알고리즘을 단일 호출 함수로 인라인하는 것을 가능하게 하지 않습니다(코드 업데이트됨).

 class C{
public :
   struct A{
   public :
       char aaa;
      
      A ( char value = 0 ) : aaa( value ){}
       void set ( char value ){
         aaa = value ; 
      };
       uint Type(){ return 0x778F6712 ;}
       char get (){ return aaa;}
       A Get() { return this ;}
   };
   
   void test(A&, A& a1, A& a2){
      printf( "1" );
      a1.aaa = a2.aaa;
   }
   
   template<typename T>
   void test(A& a, T& d1, T& d2){
       if (a.Type()== d1.Type()) test(a,d1.Get(),d2.Get());
       else {
      printf( "2" );
      d1. set (d2. get ());}
   }
};

struct B : public C::A{};


struct D{
private :
   char data;
public :  
   D( char value = 0 ) : data( value ){}
   void set ( char value ){
      data = value ; 
   };
   uint Type(){ return 0x308FD7FE ;}
   char get (){ return data;}
   D Get() { return this ;}
};


void OnStart(){
   C c;

   B b;
   D d;
   
   c.test(b, b, b);     // 1      should be: 1
   c.test(b, d, d);     // 2      should be: 2   
}


또는 다음과 같이:

 class C{
public :
   struct A{
   public :
       char aaa;
      
      A ( char value = 0 ) : aaa( value ){}
       void set ( char value ){
         aaa = value ; 
      };
       char get (){ return aaa;}
       A Get() { return this ;}
   };
   
   void test(A&, A& a1, A& a2){
      printf( "1" );
      a1.aaa = a2.aaa;
   }
   
   template<typename T>
   void test(A& a, T& d1, T& d2){
      printf( "2" );
      d1. set (d2. get ());
   }
};

struct B : public C::A{};


struct D{
private :
   char data;
public :  
   D( char value = 0 ) : data( value ){}
   void set ( char value ){
      data = value ; 
   };
   char get (){ return data;}
   D Get() { return this ;}
};


void OnStart(){
   C c;

   B b;
   D d;
   
   c.test(b .Get() , b .Get() , b .Get() );     // 1      should be: 1
   c.test(b .Get() , d .Get() , d .Get() );     // 2      should be: 2   
}
 
솔루션 감사합니다
사용된 개체의 구조를 변경해야 하고 논리가 번지기 때문에 이상적이지는 않지만 작동합니다.

그리고 예, 테스트보다 래퍼 기능을 만드는 것이 좋습니다.
   template < typename T>
   void test(A& a, T& t1, T& t2){ 
      __test(a, t1.CastToMain(), t2.CastToMain());
   }
프로젝트의 모든 호출을 검색하는 방법:
   c.test(b, b.CastToMain(), b.CastToMain());     // 1      should be: 1
   c.test(b, d.CastToMain(), d.CastToMain());     // 2      should be: 2  
어쨌든 많은 도움을 주셔서 감사합니다.
 
Sergey Dzyublik :
솔루션 감사합니다
사용된 개체의 구조를 변경해야 하고 논리가 번지기 때문에 이상적이지는 않지만 작동합니다.

그리고 예, 테스트보다 래퍼 기능을 만드는 것이 좋습니다.
프로젝트의 모든 통화를 검색하는 방법:

어쨌든 많은 도움을 주셔서 감사합니다.

그래, 난 동의

 

템플릿 기능/클래스 캐시 작업의 결함:
(MT5(빌드 2345)에 의해 수정 되지 않음) ** 정의되지 않은 동작, 내부 유형 "C"를 사용하여 복잡한 다중 래핑된 개체를 생성하면 완전히 다른 데이터 유형, 아마도 "B", 아마도 " int" 원하는 대로...
(MT5(빌드 2345)에 의해 수정되지 않음 ) * 컴파일 오류, 함수 포인터 인수를 const ref 템플릿으로 전달할 때 발생하는 버그.
(MT5(빌드 2345)로 수정되지 않음 ) * 컴파일 오류, B<void*> 개체 뒤에 B<int> 개체가 생성될 수 있지만 이전에 완료되면 컴파일 오류가 발생합니다.


템플릿 기능/클래스 작업의 결함:
( MT5(빌드 2345)에 의해 수정되지 않음 ) ** 컴파일 오류, 템플릿 함수 내부의 버그 , 명시적 캐스트 작업의 일부로 전달된 포인터는 포인터처럼 다른 경우에는 클래스처럼 작동합니다.
(MT5(빌드 2345)로 수정되지 않음 ) ** 컴파일 오류, 내부 클래스 사용 시 템플릿 클래스 코드 생성 버그.
(MT5(빌드 2345)에 의해 수정되지 않음 ) ** 컴파일 오류, 템플릿 함수의 템플릿 매개변수에 대한 내부 클래스에 액세스하려고 할 때 발생하는 버그.
(MT5(빌드 2345)로 수정되지 않음 ) * 컴파일 오류, 템플릿 메서드/클래스 생성 시 버그, 템플릿 매개변수의 "자동 교체" 프로세스가 범위를 넘어 메인 프로그램 코드로 넘어갑니다.
(MT5(빌드 2345)에서 수정되지 않음 ) * 컴파일 오류, 템플릿 클래스가 템플릿 메서드의 반환 값으로 작동할 때 템플릿 클래스 코드가 자동으로 생성되지 않는 버그입니다.
( MT5(build 2345)에 의해 수정되지 않음 ) * 컴파일 오류, 내부 클래스 정의 시 버그 - 기본 클래스를 지정할 때 전역 네임스페이스를 명시적으로 참조할 수 없습니다.
( MT5(build 2345)에 의해 수정되지 않음 ) *(new) 컴파일 오류, 내부 구조체를 템플릿 함수에 전달할 때의 버그, 결과 데이터 형식은 템플릿 클래스의 다른 내부 구조체에 대한 기본 데이터 형식으로 사용할 수 없습니다.
(MT5(build 2345)에 의해 수정되지 않음 ) *(new) 컴파일 오류, 오버로드된 비 템플릿 함수에서 호출이 이루어질 때 명시적 인수 유형으로 템플릿 함수를 호출할 때 발생하는 버그.


C++와 비교하여 MQL에서 오버로드된 함수 호출의 우선순위 불일치 내 결함:
(MT5(빌드 2345)에 의해 수정되지 않음 ) *** 컴파일 오류, 클래스 A <= B <= C <= D의 상속이 있고 두 개의 오버로딩 함수가 구현되는 경우(예: 매개변수 A*가 있는 함수 및 두 번째로 B*를 사용한 다음 MQL에서 이러한 C* 또는 D* 개체의 함수로 전달하면 "모호 오버로드된 함수 호출" 컴파일 오류가 발생합니다.
(MT5(빌드 2345)로 수정되지 않음 ) ** 런타임, 오버로드된 템플릿 함수 호출에 대한 우선 순위 불일치.
( MT5(build 2345)에 의해 수정되지 않음 ) **(new) 컴파일 오류, 오버로드된 템플릿 함수에 대한 호출의 우선 순위는 실제로 템플릿 매개변수의 유형에 따라 다르며 이론상 컴파일 결과에 영향을 주어서는 안 됩니다. .
( MT5(build 2345)에 의해 수정되지 않음 ) **(new) 컴파일 오류, 템플릿 함수 코드 생성 시 전달된 매개변수에 적합한 서명을 가진 오버로드된 템플릿 함수가 있음에도 불구하고 컴파일 오류가 발생합니다.



제안:
링크 - 리터럴 및 임시 변수를 const ref 함수 인수로 전달하는 기능 제공에 대해.
링크 - "프로젝트" 탭에서 프로젝트 파일을 이동할 때 열려 있고 ME 탭에 있는 파일을 이동하려면 위치 경로를 자동으로 업데이트합니다.
링크 - MQL typedef 선언에 기능을 도입해야 할 필요성에 대해.
링크 - 기본 복사 생성자 및 할당 연산자 생성을 강제하는 기능 제공에 대해.

 

Sergey Dzyublik :
Спасибо за вариант решения

임시 사본은 참조로 전달되므로 구조 변경이 작동하지 않습니다.

 
Andrei Trukhanovich :
임시 사본은 참조로 전달되므로 구조 변경이 작동하지 않습니다.

일반적으로 당신이 옳습니다 ...
그러나 사적으로는 모든 것이 훨씬 더 복잡하며 실제로 주어진 구조는 반복자 포인터 이며 변경되는 내용이 아니라 참조하는 객체입니다.
따라서 특별한 경우에는 문제가 해결되고 이에 대해 감사가 표현됩니다.

 
MT5 버그(빌드 2345) 개체가 템플릿 클래스/구조일 때 "제자리에서 생성된" 개체 반환과 관련된 많은 결함:

 class A{
public :
   A( int , int , int ){};  
   A( const A&){}
   A( const A*){}
};

// simple class type
A* test_a_ptr_ptr(){
   return &A( 1 , 2 , 3 );               //OK
};

A test_a_class_class(){
   return A( 1 , 2 , 3 );                //OK
};

A test_a_ptr_class(){
   return &A( 1 , 2 , 3 );               //OK
};


template < typename T>
class B{
public :
   B( int &){}
   B( long ){}
   B( int , int , int ){};  
   B( const B&){}
   B( const A*){}
};

// template class type
B<A*> test_b_class_class(){
   B<A*> b( 1 );
   int x = 22 ;
   
   return B<A*>();               // Compile Error: ambiguous call to overloaded function with the same parameters: "B(long)" and "B(const A*)"
   return B<A*>( 1 , 2 , 3 );         // Compile Error: only one argument is acceptable, argument should be castable to int
   return B<A*>(x);             // Compile Error: argument is passed by value instead of by reference.
   return B<A*>((A*) NULL );       // Compile Error: 'int' - invalid cast operation         
   return B<B<B< long >>>( 1 );     // Compile Error: OK, template parameter type does not provide any effort on compilation result
   
   return b;
};

B<A*>* test_b_ptr_ptr(){
   B<A*> b( 1 );
   
   return &B<A*>( 1 );             // Compile Error: '&' - illegal operation use
   return &b;                 
};


void OnStart (){ 
   // simple class type
   A* a_ptr = test_a_ptr_ptr();
   A a0 = test_a_class_class();
   A a1 = test_a_ptr_class();
   
   // template class type
   B<A*> b0 = test_b_class_class();
   B<A*>* b_ptr = test_b_ptr_ptr();
}
 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

Sergey Dzyublik , 2020.03.01 12:53

 class A{
public :
   A( int , int , int ){};  
   A( const A&){}
   A( const A*){}
};

// simple class type
A* test_a_ptr_ptr(){
   return &A( 1 , 2 , 3 );               //OK
};

이 함수가 존재하지 않는 객체에 대한 포인터를 반환한다는 것을 정확히 이해하고 있습니까?

 
fxsaber :

이 함수가 존재하지 않는 객체에 대한 포인터를 반환한다는 것을 정확히 이해하고 있습니까?

예, 위의 예에서 함수는 존재하지 않는 개체에 대한 포인터를 반환합니다.
이 코드의 주요 목적은 간단한 클래스에 대한 작동 기능의 존재와 동시에 템플릿 클래스에 대한 실제 부재를 보여주는 것입니다.