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

 
더엑스퍼트 :

의미는 어떻습니까? 몇 바이트의 메모리를 절약하시겠습니까? 특히 두 배로 다른 숫자를 얻을 수 있습니다(== 거짓)

아무 소용이 없습니다. 디자인이 마음에 들었습니다. 전에 본 적이 없습니다.

 
fxsaber :

아무 소용이 없습니다. 디자인이 마음에 들었습니다. 전에 본 적이 없습니다.

그래. xor를 통해 더 우아합니다, IMHO

 
더엑스퍼트 :

그래. xor를 통해 더 우아합니다, IMHO

동의한다

 #define SWAP(A, B) { A ^= B; B ^= A; A ^= B; }


추신

 #define SWAP(A, B) A ^= (B ^= (A ^= B));


위키에서

그러나 최신 CPU 에서 XOR 기술은 스와핑을 위해 임시 변수를 사용하는 것보다 훨씬 느립니다. 이것은 명령 실행의 병렬화 때문입니다. XOR 기법에서 모든 명령어의 피연산자는 이전 명령어의 결과에 의존하므로 엄격하게 순차적으로 실행되어야 합니다. 각각의 특정 경우에 대상 아키텍처에서 두 대안의 속도를 테스트하는 것이 좋습니다.

 
악몽.
 
fxsaber :

위키에서

그리고 이전 덧셈/뺄셈이 병렬화된다면? )

 
타라스 슬로보디아닉 :

그리고 이전 덧셈/뺄셈이 병렬화된다면? )

일련의 동작에 의존하는 알고리즘은 병렬화되지 않습니다.

임시 변수가 있는 알고리즘은 이와 같지 않으므로 병렬화됩니다.

 
아니...
 

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

오류, 버그, 질문

일리아스 , 2016.08.24 11:08

배열("내부") 은 배열이 할당된 요소 수 아래에 할당된 저장합니다.

예비 작업 논리(조건부 코드):
 ArrayResize (arr, int size, int reserve)
  {
   if (arr.allocated<size)
       if (!ArrayAllocateMemory(arr,size+reserve))   // -> arr.allocated=size+reserve;
         return (- 1 );
   //---
   CallConstructorsOrDestructors(arr,size);
   //---
   arr.size=size;
   return (size);
  }
 

우리는 "미친 손"이라는 제목을 계속합니다. 오늘 프로그램의 주제는 패턴 열병, 또는 엉덩이에 패턴을 없애는 방법입니다)

종종 일부 변수를 수정하기 위해 참조로 템플릿 인수로 전달해야 할 필요가 있습니다. 그러나 템플릿 사양은 불행히도 일반 함수의 경우와 같이 인수의 비불변성 을 명시적으로 지정할 수 없습니다.

 void Modify( int &) { }   // Принимает только не константы

template < typename T>
void Modify(T& a) {  }  // Принимает любые аргументы

그리고 이것은 인수가 템플릿 체인을 따라 대상으로 갈 때 불편을 초래할 수 있으며, 이는 상수이며 변경할 수 없습니다. 그리고 이 오류는 라이브러리 내부 어딘가에서 발생합니다. 원본 템플릿이 호출된 위치를 찾는 것은 때때로 매우 어려운 작업입니다.

 template < typename T>
void f0(T& a)  { a= 10 ; }   // 'a' - constant cannot be modified

template < typename T>
void f1(T& a)  { f0(a); }

template < typename T>
void f2(T& a)  { f1(a); }

void Source() { const int a= 0 ;  f2(a); }

일반 IDE에서는 문제가 되지 않습니다. 예를 들어 VS는 템플릿 경로의 전체 추적을 표시하므로 올바른 위치를 클릭하기만 하면 즉시 올바른 위치로 이동할 수 있습니다. 그러나 MQL에는 문제가 있습니다. 이는 패턴 제작자에게 지속적인 골칫거리가 될 수 있습니다.

하지만 우리는 그것을 고칠 것입니다. 이렇게 하려면 템플릿 오버로딩을 사용할 수 있습니다.

 template < typename T>
void Modify( const T&);  // Фэйковый запрещённый шаблон

template < typename T>
void Modify(T& a) { a=10; }

이제 상수를 전달하려고 할 때 최상위 템플릿이 호출됩니다. 이후 정의되지 않은 경우 오류가 발생합니다. 그러나 이것은 불충분한 해결책입니다. 첫째, 실행 가능한 모듈을 컴파일할 때만 오류가 발생하고(.mqh에서는 발행되지 않음), 둘째, 이 오류는 템플릿 선언 위치가 아니라 템플릿 선언 위치에서 발생하기 때문입니다. 우리가 찾고자 하는 그 부름. 계속 진행하겠습니다.

템플릿이 클래스 메서드인 경우 모든 것이 간단합니다. 가짜 템플릿을 private 섹션에 넣고 호출하려고 하면 액세스 오류가 발생합니다.

일반 함수의 경우에는 더 어렵습니다. C++에서 이 작업은 오버로드만으로는 해결할 수 없으며 MQL에서 사용할 수 없는 추가 기능이 필요합니다. 그러나 여기에 MQL의 강력한 무기가 우리를 돕습니다 - 버그! ) 이 경우 이 버그 중 하나가 우리에게 매우 유용합니다)
가짜 템플릿에 추가 매개변수 T2를 추가합니다. 이제 잘못된 템플릿을 호출하려고 하면 호출 위치에서 오류가 발생합니다.

 template < typename T, typename T2 >
void Modify( const T&);   // Запрещаем

template < typename T>
void Modify(T& a) { a=10; }

void Source()
{ 
   int a, const b= 0 ;
  Modify(a);   // всё ОК
  Modify(b);   // template mismatch
}

문제 해결됨. 물론 C++에서는 두 경우 모두 더 낮은 템플릿이 호출됩니다. 그런 버그가 없습니다.

이 방법은 암시적 캐스팅을 금지하여 함수 인수의 유형을 명확하게 제어해야 하는 경우에 유용할 수 있습니다.
예를 들어, 함수는 모든 종류의 정수 등을 차단하는 datetime 인수만 수락해야 합니다.
해당 옵션을 만듭니다.

 template < typename T, typename T2>
void MyFunc(T);   // Запрещаем

void MyFunc( datetime time) {  }

이제 이전의 경우와 마찬가지로 미해결 유형을 전달하려고 하면 컴파일 오류가 발생합니다.

덧붙여서 데이트 타임은 항상 그런 금지를 하고 있습니다. 내 생각에 개발자는 컴파일러 경고 없이(긴 및 문자열 제외) 암시적 캐스팅을 전혀 허용하지 않아야 한다고 생각합니다. 어떤 열거형이라도 경고 없이 자유롭게 가져옵니다.

반대 작업도 있습니다. 특정 유형의 호출만 금지하는 것입니다. 솔루션은 다음과 유사합니다.

 template < typename T, typename T2>
void MyFunc( datetime );   // Запрещаем

template < typename T>
void MyFunc(T arg) {  }


위에서 언급했듯이 모든 것은 불필요한 매개변수 없이 클래스 내부에서 결정됩니다.

 
알렉세이 나보이코프 :

우리는 "미친 손"이라는 제목을 계속합니다. 오늘 프로그램의 주제는 패턴 열병, 또는 엉덩이에 패턴을 없애는 방법입니다)

종종 일부 변수 를 수정하기 위해 참조에 의해 템플릿 인수로 일부 변수를 전달할 필요가 있습니다.

속도 또는 개체를 위해 수정 없이 참조로 전달할 필요가 있습니다.

그러나 불행히도 기존 C++ 템플릿 사양에서는 일반 함수의 경우와 같이 인수의 비 const 를 명시적으로 지정할 수 없습니다.

그리고 이것은 인수가 템플릿 체인을 따라 대상으로 갈 때 불편을 초래할 수 있으며, 이는 상수이며 변경할 수 없습니다. 그리고 이 오류는 라이브러리 내부 어딘가에서 발생합니다. 원본 템플릿이 호출된 위치를 찾는 것은 때때로 매우 어려운 작업입니다.

이 문제가 발생할 때 MQL5에 실제 예가 있습니까?

일반 IDE에서는 문제가 되지 않습니다. 예를 들어 VS는 템플릿 경로의 전체 추적을 표시하므로 올바른 위치를 클릭하기만 하면 즉시 올바른 위치로 이동할 수 있습니다. 그러나 MQL에는 문제가 있습니다. 이는 패턴 제작자에게 지속적인 골칫거리가 될 수 있습니다.

하지만 우리는 그것을 고칠 것입니다. 이렇게 하려면 템플릿 오버로딩을 사용할 수 있습니다.

이제 상수를 전달하려고 할 때 최상위 템플릿이 호출됩니다. 이후 정의되지 않은 경우 오류가 발생합니다. 그러나 이것은 불충분한 해결책입니다. 첫째, 실행 가능한 모듈을 컴파일할 때만 오류가 발생하고(.mqh에서는 발행되지 않음), 둘째, 이 오류는 템플릿 선언 위치가 아니라 템플릿 선언 위치에서 발생하기 때문입니다. 우리가 찾고자 하는 그 부름. 계속 진행하겠습니다.

템플릿이 클래스 메서드인 경우 모든 것이 간단합니다. 가짜 템플릿을 private 섹션에 넣고 호출하려고 하면 액세스 오류가 발생합니다.

일반 함수의 경우에는 더 어렵습니다. 구문적으로 C++에서 이 작업은 내가 이해하는 한 전혀 해결할 수 없습니다. 그러나 여기서 우리는 MQL이 C++가 아니라는 사실에 의해 구출됩니다. 버그가 있음) 그리고 이 경우 이러한 버그를 영구적으로 래핑할 수 있습니다.)

가짜 템플릿에 추가 매개변수 T2를 추가합니다. 이제 잘못된 템플릿을 호출하려고 하면 호출 위치에서 오류가 발생합니다.

문제 해결됨. 물론 C++에서는 두 경우 모두 하단 템플릿이 호출됩니다.

편의성의 실제 예가 누락되었습니다.

이 방법은 암시적 캐스팅을 금지하여 함수 인수의 유형을 명확하게 제어해야 하는 경우에 유용할 수 있습니다.
예를 들어, 함수는 모든 종류의 정수 등을 차단하는 datetime 인수만 수락해야 합니다.
해당 옵션을 만듭니다.

이제 이전의 경우와 마찬가지로 미해결 유형을 전달하려고 하면 컴파일 오류가 발생합니다.

기회가 생기자마자 MQL5에서 Might와 Main으로 사용하는 것 같습니다. 내가 올바르게 이해하면 이것이 표준입니다.

덧붙여서 데이트 타임은 항상 그런 금지를 하고 있습니다. 개발자가 일반적으로 암시적 캐스팅을 허용하고 컴파일러 경고 없이도(long 및 string 제외) 헛된 것이라고 생각합니다. 어떤 열거형이라도 경고 없이 자유롭게 가져옵니다.

반대 작업도 있습니다. 특정 유형의 호출만 금지하는 것입니다. 솔루션은 다음과 유사합니다.

datetime이 지금처럼 작동하도록 하는 편리함을 느끼십시오. 문제는 언제입니까?


모두 매우 좋은 게시물, 감사합니다!

사유: