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

 
Andrey Dik :

인코딩을 어떻게 볼 수 있습니까?
타사 편집기에서 텍스트 유형을 변경하여 변경되었다는 것을 알았지만 어떤 인코딩을 찾는 방법을 모르겠습니다.
안드레이 카팀리안스키 :
ME 1580: Win-1251(ANSI)에서 EA 생성

예, Akepadom은 인코딩이 Win-1251(ANSI)인 반면 이전 파일에는 UTF-16LE 1200이 있음을 알 수 있습니다.

새 파일의 기본 인코딩이 변경되었다는 의미입니까?

 

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

mql5 언어의 특징, 미묘함 및 작업 방법

fxsaber , 2017.04.14 11:40

그래, 비뚤어진 브로커. 그들은 여전히 거기에 음수를 채울 것입니다.

브로커가 기호를 설정할 때 개발자가 각 매개 변수에 대해 가능한 값의 범위에 제한이 있으면 좋을 것입니다.

 

시장에서 제품을 업데이트할 때 차트에 있는 이 제품의 모든 설정이 기본 설정으로 재설정되는 것을 알았습니다.

이것은 잘못된 것입니다. 그것을 피하는 방법?

 

ArrayMaximum() 및 ArrayMinimum() - 전달된 매개변수의 순서가 도움말과 일치하지 않습니다.


[삭제]  
fxsaber :
약간의 해킹. 할당 우회

결과

이것은 구명 해킹이 아니라 변태입니다.

당신에게 이것을 기대하지 않았습니다.

 
Koldun Zloy :

이것은 구명 해킹이 아니라 변태입니다.

당신에게 이것을 기대하지 않았습니다.

그렇다면 이것은 당신을위한 것입니다

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

라이브러리: TypeToBytes

fxsaber , 2017.04.13 13:34

이 기능이 잠재적인 버그를 식별하는 데 어떻게 유용할 수 있는지에 대한 예입니다.

우리는 스크립트를 작성하고 실행합니다.

 #include <TypeToBytes.mqh>

struct STRUCT
{
   int i;
  
  STRUCT() : i( 0 ) {}
  
   template < typename T>
   void operator =( T& ) {}
};

#define PRINT(A) :: Print ( #A + " = " + ( string )(A));

void OnStart ()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}


결과.

_WRONG_ASSIGN_OPERATOR(STRUCT) = true

이것은 할당 연산자가 같은 유형의 구조체에 구조체를 복사하지 않는다는 것을 알려줍니다.


구조에 더 추가하면,

   void operator =( STRUCT &Value ) { this .i = 0 ; }

그러면 결과는 같을 것입니다.


이 연산자를 수정하면

   void operator =( STRUCT &Value ) { this .i = Value.i; }

모든 것이 정확해야 하지만 라이브러리는 그렇지 않다고 말합니다.


아마도 이것이 이 예의 가장 미묘한 요점일 것입니다.

우리는 수정

 #include <TypeToBytes.mqh>

struct STRUCT
{
   int i;
  
  STRUCT() : i( 0 ) {}
  
   template < typename T>
   void operator =( T& ) {}

   void operator =( const STRUCT &Value ) { this .i = Value.i; }
};

#define PRINT(A) :: Print ( #A + " = " + ( string )(A));

void OnStart ()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}

그리고 결과를 얻는다

_WRONG_ASSIGN_OPERATOR(STRUCT) = false


이제 복사 연산자가 올바르게 작성되었습니다!

유사하게, 모든 단순 구조 의 할당/복사 연산자의 정확성을 확인할 수 있습니다.

[삭제]  

1. 다음과 같이 작성할 때:

STRUCT StructCopy1 = Struct;
operator= 대신 복사 생성자를 호출해야 합니다.

그러나 이것은 Metaquote에 대한 질문입니다.

2. 컴파일러에서 생성한 복사 생성자가 호출되지 않으면 직접 작성할 수 있습니다.

 struct STRUCT
{
   int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = other.i;
  }
  
   void operator =( const STRUCT& )
  {
     this .i = 5 ;
  }
};

이제 operator=가 호출되지 않습니다.

3. 구조체의 멤버를 사용할 수 있으므로 다음과 같이 간단하게 작성할 수 있습니다.

StructCopy1.i = Struct.i;

비공개로 설정하면 구명 해킹도 도움이 되지 않습니다.

4. 그리고 가장 중요한 것은 operator=가 수행되어 모든 할당이 주변이 아닌 그것을 통과하도록 합니다.

일반적으로 복사 생성자도 함께 정의됩니다.

네. 예를 살펴보았습니다. 많은 혜택을 보지 못했습니다.

 
Koldun Zloy :

1. 다음과 같이 작성할 때:

operator= 대신 복사 생성자를 호출해야 합니다.

그러나 이것은 Metaquote에 대한 질문입니다.

2. 컴파일러에서 생성한 복사 생성자가 호출되지 않으면 직접 작성할 수 있습니다.

이제 operator=가 호출되지 않습니다.

3. 구조체의 멤버를 사용할 수 있으므로 다음과 같이 간단하게 작성할 수 있습니다.

비공개로 설정하면 구명 해킹도 도움이 되지 않습니다.

4. 그리고 가장 중요한 것은 operator=가 수행되어 모든 할당이 주변이 아닌 그것을 통과하도록 합니다.

일반적으로 복사 생성자도 함께 정의됩니다.

네. 예를 살펴보았습니다. 많은 혜택을 보지 못했습니다.

라이프 핵은 또한 복사 생성자를 우회합니다. 그리고 이점은 여기
 #include <TypeToBytes.mqh>

struct STRUCT
{
   int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = 2 ;
  }
  
   void operator =( const STRUCT& )
  {
//    Print(__FUNCSIG__);
    
     this .i = 5 ;
  }
};

void OnStart ()
{
  STRUCT Struct( 1 );  

   ArrayPrint(_R(Struct).Bytes); // 1 0 0 0
  
  STRUCT StructCopy1 = Struct;   // STRUCT( const STRUCT& )

   ArrayPrint(_R(StructCopy1).Bytes); // 2 0 0 0
    
  StructCopy1 = Struct;         // void STRUCT::operator=( const STRUCT& )

   ArrayPrint(_R(StructCopy1).Bytes); // 5 0 0 0
}

_R은 보편적인 것입니다. 따라서 자체 연산자가 있는 외부 구조를 재정의할 필요가 없습니다.

 #include <TypeToBytes.mqh>

struct STRUCT
{
   int i;
  
   void operator =( const STRUCT& )
  {
     this .i = 5 ;
  }
};

void OnStart ()
{
  STRUCT Structs[] = {{ 1 }, { 2 }};
  
   ArrayPrint(_R(Structs).Bytes); // 1 0 0 0 2 0 0 0
}
 
Andrey Dik :

예, Akepadom은 인코딩이 Win-1251(ANSI)인 반면 이전 파일에는 UTF-16LE 1200이 있음을 알 수 있습니다.

새 파일의 기본 인코딩이 변경되었다는 의미입니까?

아니요, 항상 Win-1251(ANSI)이 있었고 어느 시점에서 UTF가 추가되었습니다. 그러나 ansi가 아닌 문자가 포함된 소스에만 해당됩니다.
 
Andrey Khatimlianskii :
아니요, 항상 Win-1251(ANSI)이 있었고 어느 시점에서 UTF가 추가되었습니다. 그러나 ansi가 아닌 문자가 포함된 소스에만 해당됩니다.
분명한. 고맙습니다.