포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 156

 

1) int err=0 선언 시 즉시 초기화하지 않는 이유는 무엇입니까?

2) 확인하지 않았지만 설명서 에 따르면 오류가 GetLastError () 함수 를 사용할 때 자동으로 0되는 일부 변수에 저장됩니다.

또한 일부 기능(주로 터미널 기능)을 사용할 때 항상 변경됩니다.

3) 이것이 GetLastError ()가 OrderSelect 에 존재하지 않는 티켓 번호에 액세스한 후 값 0을 준 이유입니다.

" 나머지 함수는 어떠한 경우에도 last_error 변수의 값을 변경하지 않습니다. .................., OrderSelect , .............. .... ... "

 
hoz :

종종 다음과 같이 함수 내부에 유형 변수를 선언했습니다.

더 안쪽으로 어떤 조건에서 오류가 있는지 확인하기 위해 이미 호출합니다. 글쎄, 이것은 나뿐만 아니라 많은 곳에서 내가 만난 코드에 있습니다. 말하자면 전형적인 상황. 오늘은 에러를 제어하고 싶은 모든 함수에서 매번 같은 변수를 선언하는 것은 논리적이지 않다고 생각했습니다. 일단 전역적으로 선언하고 init에서 초기화하는 것이 더 쉬울 것이라는 결론에 이르렀습니다. 이 같은:

그런 다음 사용자 정의 함수에서 err 변수를 호출해야 할 때 이미 값이 있음을 알고 있습니다. 실제로 GetLastError () 는 마지막 오류의 코드를 제공합니다. 즉, 각 함수에서 오류 코드를 표시하고 GetLastError ()를 호출하는 역할을 하는 이 변수 err이 모든 계산의 끝에서 호출되면 모든 맞겠죠?

그러나 반면에 전문가 코드 실행 체인을 따라 일부 함수의 끝에서 호출하지 않으면 변수는 0으로 재설정되지 않으며 이는 오류가 있는 경우 잘못된 실행으로 위협합니다. 이전 코드 실행 체인, 하지만 현재 체인에는 없지만 마지막 오류 코드가 반환됩니다... 그리고 재설정하려면 이 GetLastError () 함수를 호출해야 합니다. 저것들. 그것은 모두 그것이 호출되었는지 여부에 달려 있습니다. 어딜가나 이렇게 될 거라는 확신이 없다면, 안전하게 플레이하고 매번 초기화하는 것이 더 쉽겠죠?

전역 수준에서 err을 선언한 다음 GetLastError() 를 호출 하기 전에 start() 에서 0으로 설정할 수 있습니다. 예를 들면 다음과 같습니다.

 int err;
//------------------
int init() 
{
  // ...
  return ( 0 );
}
//------------------
int start() 
{ 
  // ...
  RefreshRates();
  OrderClose(...);
  err= 0 ;     // обнуление
  err= GetLastError ();
  SomeErrFunction(err);
  // ...
return ( 0 );
}
 
ALXIMIKS :

1) int err=0 선언 시 즉시 초기화하지 않는 이유는 무엇입니까?


그것을 시도하십시오! :) 그것은 나를 위해 작동하지 않았습니다. 내가 알기로는 스페셜 초기화. 전역 변수의 함수는 허용되지 않습니다 . 문서에는 이것을 언급하지 않는 것 같지만.
알시믹스 :

2) 확인하지 않았지만 설명서 에 따르면 오류가 GetLastError () 함수 를 사용할 때 자동으로 0되는 일부 변수에 저장됩니다.

또한 일부 기능(주로 터미널 기능)을 사용할 때 항상 변경됩니다.

0에 대해 위에서 작성하고 현재 값이 LastError () 변수에 들어간 후 재설정하려면 GetLastError () 함수를 호출하여 마지막 오류 코드를 반환하고 LastError 변수를 재설정합니다. 그렇지 않으면 GetLastError () 가 호출될 때까지 마지막 오류의 코드가 영구적으로 저장되므로 더 이상 존재하지 않는 마지막 오류의 코드를 반환할 수 있습니다. (즉, 로그를 읽거나 인쇄하기 어렵게 만드는 다른 기능에서).
알시믹스 :

3) 이것이 GetLastError ()가 OrderSelect 에 존재하지 않는 티켓 번호에 액세스한 후 값 0을 준 이유입니다.

" 나머지 함수는 어떠한 경우에도 last_error 변수의 값을 변경하지 않습니다. .................., OrderSelect , .............. .... ... "

OrderSelect() 때문이 아닐 가능성이 높지만 다른 것이 아닙니다(동일한 기능 근처에 있음). 게다가, 그것은 종종 더 많은 것들에 의해 영향을 받습니다.
 
paladin80 :

전역 수준에서 err을 선언한 다음 GetLastError()를 호출하기 전에 start()에서 0으로 설정할 수 있습니다. 예를 들면 다음과 같습니다.

시작할 때 선언한 다음 코드에서 2개 이상의 오류를 선언하면 이미 논리에 따라 잼이 나옵니다. 그렇지 않은 경우 GetLastError() 가 지속적으로 호출됩니다(이론적으로는 모든 사용자 정의 함수가 끝날 때) .
 
hoz :
그러면 이미 논리에 따라 잼이 나옵니다. 그렇지 않으면 GetLastError()가 지속적으로 호출됩니다(이론적으로 모든 사용자 정의 함수의 끝에서).

더 자주 전화해야 할 때도 있습니다.
 

Victor (hoz), 나는 마지막 실수 로 당신의 문제를 이해하지 못합니다.

오류를 처리하는 함수를 선언하고 필요한 경우 호출합니다. 모든 것이 지역적이며 모든 곳에서 사용할 수 있습니다.

 // Объявление:
void CommentError( int nLastCodeError, string sComment)
 {
   if (nLastCodeError != 0 ) Print (sComment, "  " , ErrorDescription(nLastCodeError));
 }

// Вызов:
void start()
 {
  CommentError( GetLastError (), "Ошибка в функции start()!" );
 }
 
Zhunko :

Victor (hoz), 나는 마지막 실수로 당신의 문제를 이해하지 못합니다.

오류를 처리하는 함수를 선언하고 필요한 경우 호출합니다. 모든 것이 지역적이며 모든 곳에서 사용할 수 있습니다.


이해할 수 있습니다. 그러나 이 함수는 제 경우에 필요할 때 호출됩니다. 오류가 있는지 확인하고 싶을 때. 그러나 이전 어딘가에 오류가 있었고 현재 오류가 없는 경우 이전 오류가 반환 됩니다 . 요점이..
 
hoz :

이해할 수 있습니다. 그러나 이 함수는 제 경우에 필요할 때 호출됩니다. 오류가 있는지 확인하고 싶을 때. 그러나 이전 어딘가에 오류가 있었고 현재 오류가 없는 경우 이전 오류가 반환됩니다. 결국 Vadim 함수에서 LastError 변수는 GetLastError()를 호출하여 재설정되지 않습니다 . 요점이..

재설정할 필요가 없습니다. 함수 뒤에 있는 모든 곳에서 오류를 확인하는 습관이 있어야 합니다. 그래도 전화를 끊어야 합니다. 전투 모드에서 속도가 느려지지 않도록. 저것들. 그런 디버거입니다.

물론 결정을 내리기 위해 분석해야 하는 오류는 예외입니다.

 
hoz :

이해할 수 있습니다. 그러나 이 함수는 제 경우에 필요할 때 호출됩니다. 오류가 있는지 확인하고 싶을 때. 그러나 이전 어딘가에 오류가 있었고 현재 오류가 없는 경우 이전 오류가 반환됩니다. 결국 Vadim 함수에서 LastError 변수는 GetLastError()를 호출하여 재설정되지 않습니다 . 요점이..
먼저 재설정(err=0;)한 다음 작업을 호출한 다음 오류 값 err=GetLastError()를 할당하고 처리하고 다시 err=0을 수행하지 못하게 하는 것입니다.
 
다른 t/p 및 s/l에서 이익 계수를 계산하는 방법. 예를 들어 테이크 앤 스톱이 각각 20포인트인 경우 수익성 있는 거래와 수익성이 없는 거래의 수를 세어 나눕니다. 예를 들어 테이크가 40점이고 정지가 30점인 경우 계산하는 방법은 무엇입니까? 고맙습니다!
사유: