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

 

사실, 배열의 차원을 잘못된 것으로 설정했습니다. 아마도 어떤 식으로든 영향을 미쳤을 것입니다(어떤 식으로든 영향을 주어서는 안 되지만).

차원 = 3으로 여기에서 시도하십시오.

 template < typename T>
int F1( const T& array[]) { return ArrayMaximum (array); }

template < typename T>
int F2( const T& array[]) { return F1(array); }

void OnStart ()
  {
     int arr[ 3 ]= { 1 , 2 , 3 };
     Print (F2(arr));   // Выдаёт -1 !!!
  }
 

불일치의 원인을 찾았습니다. OPTIMIZE=0 모드에서는 오류가 있지만 OPTIMIZE=1에서는 오류가 없습니다. 나는 일반적으로 항상 OPTIMIZE=0만 사용합니다.

 
fxsaber :

결과에 대한 논리적(일관된) 설명을 찾으면 버그가 표시되지 않습니다. 결과가 C++와 일치하지 않으면 버그 증거가 허용되지 않는다고 생각합니다. 누군가 그렇게 생각하고 실행한 C++입니다. 그리고 그는 그렇게 생각하지 않을 수도 있고 따라서 그렇게 하지 않을 수도 있습니다. 그러므로 거기에 있는 어떤 것을 지칭하는 것이 아니라 어떤 종류의 내부 개념을 기반으로 하는 것이 바람직합니다. 그리고 "자신의 것"은 실제로 자신의 것이 되는 것이 바람직합니다. 프로그래밍 경험을 쌓으면서 인식할 수 없는 고정관념을 "있는 그대로" 강요한 결과가 아닙니다.

설명이 없으면 오류가 없습니다. 그리고 1 년 안에이 설명이 나타나고 매우 설득력이 있다면 모든 사람을 위해 모든 것을 다시해야합니까 ??? C ++에서 그들은 이미 이것이 왜 그래야 하는지 백 번 생각했고 그렇지 않은 경우에는 생각하지 않았습니다. 그리고 MQL에서 C++에서와 다르게 배열되어 있다면 설명이 필요하고 그 반대는 불가

 
Alexey Viktorov :
정적 변수는 모든 표현식으로 초기화할 수 있는 단순 지역 변수와 달리 해당 유형에 해당하는 상수 또는 상수 표현식 으로 초기화할 수 있습니다.


그러나 기능은 아닙니다.

그런 다음 클래스의 정적 인스턴스를 비활성화해야 합니다. 생성자 함수에 의해 초기화되기 때문입니다.

 

그리고 여기에 변수 초기화 주제에 대한 자세한 내용이 있습니다. 설명서에 나온 대로 따라하면 다른 전역/정적 변수 참조도 불가능합니다. 왜냐하면 이것은 상수 표현식이 아닙니다.

 int a= 1 ;
int b= a+ 1 ;  // Согласно документации, такая инициализация не возможна

void OnStart ()
{
   Print (b);
}

그러나 지금은 작동합니다. 그리고 나는 많은 사람들이 아무 것도 의심하지 않고 항상 그러한 구조를 사용했다고 믿습니다. 그러나 개발자는 언제든지 그것을 차단할 수 있음이 밝혀졌습니다. 그리고 함수 초기화와 마찬가지로 이러한 코드는 계속 성공적으로 컴파일되지만 제대로 작동하지 않습니다. 일반적으로 전체 MQL은 시한 폭탄입니다.

 
Alexey Navoykov :

그리고 여기에 변수 초기화 주제에 대한 자세한 내용이 있습니다. 설명서에 나온 대로 따라하면 다른 전역/정적 변수 참조도 불가능합니다. 왜냐하면 이것은 상수 표현식이 아닙니다.

 //+------------------------------------------------------------------+
//|                                                   ExpertMACD.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
CExpert ExtExpert;

생성자 함수로 초기화 - 금지!

최신 메시지를 논리적으로 요약하면

알렉세이 나보이코프 :

불일치의 원인을 찾았습니다. OPTIMIZE=0 모드에서는 오류가 있지만 OPTIMIZE=1에서는 오류가 없습니다. 나는 일반적으로 항상 OPTIMIZE=0만 사용합니다.

32비트 터미널에서 모든 OPTIMIZE와 함께 오류가 발생합니다.

 int g1( int & t[] ) { return ArraySize ( t ); }
int g2( int & t[] ) { return g1( t ); }
void OnStart ()
{
         int t[] = { 1 , 2 , 3 , 4 , 5 }; //всего 5
         Print ( g2(t)); //Результат:          3
}
 
A100 :

생성자 함수로 초기화 - 금지!

최신 메시지를 논리적으로 요약하면

글쎄, 그것은 그 사람이 자신을 잘못 표현했을뿐입니다. 물론 초기화 함수가 아니라 초기화 값에 대해 이야기하고 있습니다.


그렇습니다. 그리고 신은 금지령으로 그들을 축복합니다. 그것들은 그 자체로 문제를 일으키지 않습니다. 그러나 이 금지가 컴파일러에 의해 어떤 식으로든 제어되지 않고 대신 언어 규칙을 우회하여 작동하는 알고리즘을 생성하는 경우 이는 어떤 프레임워크에도 전혀 맞지 않습니다. 이제 그러한 순간을 찾고 모든 코드를 삽질해야하며 일반적으로 항상 경계해야합니다. 글쎄, 그런 프로그래밍이 도대체 무엇인지, 나는 차라리 예전 빌드에 머물고 싶다.

 
Alexey Navoykov :
네, 죄송합니다. 바로 눈치채지 못했습니다. 물론 그들이 어떻게 교활하게 그것을 변경하고 아무에게도 말하지 않은 것은 놀랍습니다. 그러면 컴파일러가 잘못된 연산이 수행되고 있다는 사실에 대해 어떤 식으로든 반응하지 않는 이유가 명확하지 않습니다. 저것들. 어쨌든 버그가있다
왜 그들이 변했다고 생각합니까? 왜 받아 들일 수 없습니까? 마음대로 사용하시기 바랍니다. 전체 문제는 정적 변수가 함수에 의해 초기화 될 때 초기화가 "일시 중단"되고 이 함수가 실행된다는 것입니다. 그리고 위의 예에서 그 함수에는 아직 초기화되지 않은 정적 변수가 있습니다. 여기에서 함수로 초기화된 변수는 해당 값을 받지 않습니다.
 
Alexey Navoykov :

그리고 여기에 변수 초기화 주제에 대한 자세한 내용이 있습니다. 설명서에 나온 대로 따라하면 다른 전역/정적 변수 참조도 불가능합니다. 왜냐하면 이것은 상수 표현식이 아닙니다.

그러나 지금은 작동합니다. 그리고 나는 많은 사람들이 아무 것도 의심하지 않고 항상 그러한 구조를 사용했다고 믿습니다. 그러나 개발자는 언제든지 이를 차단할 수 있습니다. 그리고 함수 초기화와 마찬가지로 이러한 코드는 계속 성공적으로 컴파일되지만 제대로 작동하지 않습니다. 일반적으로 전체 MQL은 시한 폭탄입니다.

음... 이 예의 문서에 있는 설명과 불일치가 없습니다... 문서의 인용문을 주의 깊게 연구하십시오

정적 변수는 모든 표현식으로 초기화할 수 있는 단순 지역 변수와 달리 해당 유형에 해당하는 상수 또는 상수 표현식 으로 초기화할 수 있습니다.


또는 상수 표현

 int a= 1 ;
int b= a+ 1 ;

이러한 초기화가 가능합니다. 변수 'a'는 상수로 초기화되고 변수 'b'는 상수 표현식으로 초기화되기 때문입니다.

 
A100 :

그런 다음 클래스의 정적 인스턴스를 비활성화해야 합니다. 생성자 함수에 의해 초기화되기 때문입니다.

주의를 기울이다

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

오류, 버그, 질문

알렉세이 빅토 로프 , 2017.10.18 09:19

왜 그들이 변했다고 생각합니까? 왜 받아 들일 수 없습니까? 자신의 판단에 따라 사용하십시오. 전체 문제는 정적 변수가 함수에 의해 초기화 될 때 초기화가 "일시 중단"되고 이 함수가 실행된다는 것입니다. 그리고 위의 예에서 그 함수에는 아직 초기화되지 않은 정적 변수가 있습니다 . 여기에서 함수로 초기화된 변수는 해당 값을 받지 않습니다.
생성자에서 정적 변수를 선언하고 초기화하는 것이 허용되는지, 아아, 나는 모르지만 그렇게 말해주기를 바랍니다. 그리고 제가 알기로는 초기화 순서가 매우 중요합니다.
사유: