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

 

문제가 있었습니다. 무엇을 탓해야 할지조차 모르겠습니다.

관심 코드 섹션은 다음과 같습니다.

       Print ( "itogo do=" ,itogo);
       if (itogo> 1000 )
        {
         Print ( "itogo>1000 =" ,itogo);
         itogo= 500 ;
         Print ( " vsego_ if=" ,itogo);
        }
       Print ( "itogo posle=" ,itogo);
       Print ( "+-----------------------------------------------------------+" );

먼저 itogo 변수의 값을 "itogo do"라는 텍스트로 인쇄해야 한다고 말합니다.

그런 다음 itogo가 1000보다 크면 "itogo>1000"이라는 텍스트와 함께 itogo를 인쇄합니다.

총 할당 500

"vsego_if="라는 텍스트로 itogo를 인쇄한 다음 조건으로 보호된 영역을 그대로 둡니다.

"itogo after="라는 텍스트로 itogo를 인쇄합니다.

라인을 인쇄합니다.

내가 왜 이렇게 자세하게 써?

조건이 없으면 행 사이에 2개의 인쇄가 있고, 조건이 있는 경우 4개의 인쇄가 있다는 것이 분명해야 합니다.

조건이 트리거되면 변수 값이 변경된다는 것을 이해합니다.

다음은 두 개의 인쇄가 있는 것이 분명한 인쇄물입니다. 이는 조건이 트리거되지 않았지만 변수 값이 변경되었음을 의미합니다.

어떻게 이럴 수있어?????????


다음은 코드의 스크린샷입니다. 필드 외부의 줄 사이에 아무 것도 숨겨져 있지 않은 것을 볼 수 있도록 선택 항목이 있는 화면을 제공하겠습니다.

이 코드에는 충돌이 없고 문제 없이 컴파일되지만 제대로 작동하고 싶지 않습니다.

변수는 전역적으로 int로 선언되고 코드 자체는 크지만 코드의 다른 곳에서는 아무 것도 인쇄되지 않습니다.

위협 디버거에서 가장 흥미로운 점은 작동하는 규범이지만 일반 모드에서 시작할 때 몇 가지 트릭이 있습니다.

그리고 이것들은 인쇄물이 아닙니다. 프로그램의 논리에 따르면 뭔가 조각이 아니라는 것을 알 수 있습니다.

 

다른 예에서는 아직 재현할 수 없었지만 이것이 해결 방법을 설명한 것 같습니다.

텍스트에는 이전에 DebugBreak() 가 있었습니다. 코드가 디버거를 통해 실행되었고 나중에 DebugBreak()가 제거되고 모든 것이 다시 컴파일되었습니다.

그러나 ME는 디버거가 사용되었고 컴파일 후 실행하지 않으면 올바르게 작동하지 않는다는 것을 기억합니다.

디버거에서 실행하면 정기적으로 시작하더라도 스크립트가 제대로 작동합니다.

 
Urain :

다른 예에서는 아직 재현할 수 없었지만 이것이 해결 방법을 설명한 것 같습니다.

텍스트에는 이전에 DebugBreak()가 있었습니다. 코드가 디버거를 통해 실행되었고 나중에 DebugBreak()가 제거되고 모든 것이 다시 컴파일되었습니다.

그러나 ME는 디버거가 사용되었고 컴파일 후 실행하지 않으면 올바르게 작동하지 않는다는 것을 기억합니다.

디버거에서 실행하면 정기적으로 시작하더라도 스크립트가 제대로 작동합니다.


그리고 그들은 그것을 릴리스라고 부르나요?

챔피언십 2010 고문의 잠재적인 참가자가 작성하여 디버깅했지만 "디버거의 것"이 코드에 남아 있습니다. 그리고 고문은 잘 작동합니다. 그러나 "사물"에서만 잘 작동하지만 참가자는 이것을 의심하지 않습니다. 문서화되지 않은 기능에 대해 어떻게 알 수 있습니까?

그래서 참가자는 챔피언십 2010에 참가하기 위해 자신의 Expert Advisor 소스 코드를 MetaQuotes에 보냈고 거기에서 간단히 컴파일했고 코드는 물론 "디버거의 물건" 없이 깨끗한 것으로 판명되었습니다.

Championship 2010이 진행 중이며 어떤 이유로 MetaQuotes의 Expert Advisor는 자신의 컴퓨터에서 참가자와 동일한 방식으로 거래하지 않습니다. 그리고 참가자는 당황하고 온갖 생각이 머리를 스쳐 지납니다 ...

 
Urain :

문제가 있었습니다. 무엇을 탓해야 할지조차 모르겠습니다.

예를 들어 다음 코드를 만들었습니다(값 입력).

 void Check( int itogo)
  {
   Print ( "itogo do=" ,itogo);
   if (itogo> 1000 )
     {
       Print ( "itogo>1000 =" ,itogo);
      itogo= 500 ;
       Print ( "vsego_if=" ,itogo);
     }
   Print ( "itogo posle=" ,itogo);
   Print ( "+-----------------------------------------------------------+" );  
  }
void OnStart ()
  {
   Check( 158 );
   Check( 179 );
   Check( 202 );
   Check( 222 );
   Check( 243 );
   Check( 261 );
   Check( 288 );
   Check( 301 );
  }

그것은 잘 작동했습니다 :

 2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo posle= 301
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo do = 301
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo posle= 288
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo do = 288
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo posle= 261
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo do = 261
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo posle= 243
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo do = 243
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo posle= 222
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo do = 222
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo posle= 202
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo do = 202
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo posle= 179
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo do = 179
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo posle= 158
2010.07 . 08 07 : 00 : 22      size (EURUSD,D1)        itogo do = 158

보시다시피 변수 값에는 오류나 불일치가 없습니다.

여러 번 수정한 후 코드를 다시 컴파일하는 것을 잊어버리고 이전 버전을 사용했을 수 있습니다.

해야 할 일:

  • 코드를 처음부터 복사하고 터미널을 다시 시작하고 (확실히) 확인하십시오.
  • 오류가 계속되면 서비스 데스크(또는 포럼)를 통해 전체 코드를 보내주십시오. 우리는 확실히 확인할 것입니다.
 
simpleton :

이미 충분한 히스테리.

이 오류가 확인되면 즉시 수정됩니다. 소프트웨어 개발은 오류 없이 진행될 수 없습니다.

 
Renat :

이미 충분한 히스테리.

이 오류가 확인되면 즉시 수정됩니다. 소프트웨어 개발은 오류 없이 진행될 수 없습니다.

Renat , "MQL5에 대한 비판"이나 이와 유사한 주제를 열 것을 제안합니다. 그리고 다른 주제(분기)에서 이 유형의 모든 메시지를 오프톱으로 삭제합니다.

따라서 비평가는 말할 자리가 있고 지부의 주제는 존중될 것입니다.

 

EA 의 인디케이터 호출 에 대한 요청 #18261 의 운명을 알고 싶습니다(값이 인디케이터와 일치하지 않음).

반응이 좀 있었으면 좋았을텐데...

Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.
 
ddd06 :

EA 의 인디케이터 호출 에 대한 요청 #18261 의 운명을 알고 싶습니다(값이 인디케이터와 일치하지 않음).

반응이 좀 있었으면 좋았을텐데...

귀하의 신청서가 답변되었습니다. 그들은 추천을 했습니다.

프로필에서 업데이트되지 않은 이유 - 알아보겠습니다.

 
Renat :

예를 들어 다음 코드를 만들었습니다(값 입력).

그것은 잘 작동했습니다 :

보시다시피 변수 값에는 오류나 불일치가 없습니다.

여러 번 수정한 후 코드를 다시 컴파일하는 것을 잊어버리고 이전 버전을 사용했을 수 있습니다.

해야 할 일:

  • 코드를 처음부터 복사하고 터미널을 다시 시작하고 (확실히) 확인하십시오.
  • 오류가 계속되면 서비스 데스크(또는 포럼)를 통해 전체 코드를 보내주십시오. 우리는 확실히 확인할 것입니다.

그리고 여기에 올리기 전에 저도 똑같이 했는데 결과는 님과 같았는데 원래 오류가 발생한 시트에서는 모든게 크래시가 나더라구요.

디버거에서 이유를 반복합니다. 특정 시트에서 다시 컴파일하고 디버그를 통해 실행하지 않으면 디버그에서 실행한 후 모든 것이 정상이고 올바르게 작동하지 않습니다. 디버거가 이 특정 시트에 고정된 이유를 모르겠습니다. 다른 시트의 코드 사본은 제대로 작동하지만 이 특정 시트는 작동하지 않습니다.

따라서 아직 오류를 재현할 수 없다고 위에 썼습니다.

분명히 디버거나 ME에는 편집 이력을 기억하는 기능이 있는 것 같은데, 아마도 내가 주의를 기울이지 않은 사건 이전에 치명적인 오류 가 있었을 것입니다.

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
Urain :

그리고 여기에 올리기 전에 저도 똑같이 했는데 결과는 님과 같았는데 원래 오류가 발생한 시트에서는 모든게 크래시가 나더라구요.

디버거에서 이유를 반복합니다. 특정 시트에서 다시 컴파일하고 디버그를 통해 실행하지 않으면 디버그에서 실행한 후 모든 것이 정상이고 올바르게 작동하지 않습니다. 디버거가 이 특정 시트에 고정된 이유를 모르겠습니다. 다른 시트의 코드 사본은 제대로 작동하지만 이 특정 시트는 작동하지 않습니다.

따라서 아직 오류를 재현할 수 없다고 위에 썼습니다.

분명히 디버거나 ME에는 편집 이력을 기억하는 기능이 있는 것 같은데, 아마도 내가 주의를 기울이지 않은 사건 이전에 치명적인 오류 가 있었을 것입니다.

DebugBreak()이 설정된 위치를 정확히 기억하지 못합니까?

지금까지는 복제가 불가능했습니다.