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

 
Karputov Vladimir :
따옴표가 켜져 있는지 여부는 중요하지 않습니다. 표시기에서 prev_calculate==0 조건을 제어해야 합니다. 이것은 히스토리의 스와핑이고 두 번째 포인트는 변경된 막대를 다시 계산하는 스페어 모드, 즉, 실제로 Rates_total -prev_calculate+1입니다.

당신은 먼저 쓰여진 것을 읽고 나서서야 대답할 것입니다. 디버거 버그를 재현하는 코드! 모든 재생 데이터가 제공됩니다.

다음은 동일한 버그를 재현하는 스크립트입니다.

 int Func(){ return ( 0 ); }

int Func2()
{
//  return(0); // если расскоментировать и здесь поставить точку останова, то отладчик отработает, как надо  
   return (Func()); // здесь поставить точку останова (F9)
}

void OnStart ()
{
  Func2();
}
 
fxsaber :
당신은 먼저 쓰여진 것을 읽고 나서서야 대답할 것입니다. 디버거 버그를 재현하는 코드! 모든 재생 데이터가 제공됩니다.

나는 당신에게 대답했습니다. 당신 은 OnCalculate가 몇 번이나 호출 되는지 상관하지 않습니다. 귀하의 임무는 두 값(rates_total, prev_calculate 및 prev_calculate==0일 때 조건)을 분석하여 표시기의 전체 또는 부분 재계산을 제공하는 것입니다.

OnCalculate()가 한 번 또는 두 번 호출되어야 하는 어렵고 빠른 조건은 없습니다. OnCalculate()는 누구에게도 빚지지 않습니다. 그러나 프로그래머는 두 가지 값을 제어해야 합니다: rate_total, prev_calculate 및 prev_calculate==0일 때의 조건.

 
Karputov Vladimir :
나는 당신에게 대답했습니다. 당신 은 OnCalculate가 몇 번이나 호출 되는지 상관하지 않습니다. 귀하의 임무는 두 값(rates_total, prev_calculate 및 prev_calculate==0일 때 조건)을 분석하여 표시기의 전체 또는 부분 재계산을 제공하는 것입니다.

디버거가 호출되는 횟수와 OnCalculate가 호출되는 횟수에 관심이 있습니다. 나는 천성적으로 BORE다! 그리고 나는 그것과 관련된 모든 것이 있습니다.

당신은 문제의 본질을 전혀 모르고 나에게 무언가를 가르치려고합니다. 물론 감사합니다. 하지만 상대방의 말을 잘 들어보자.

 
fxsaber :

아니요, 현재 견적이 서 있을 때 RTS를 실행하고 있습니다. 한 번 호출되고 디버거가 거짓말을하여 2임을 보여줍니다. 재생할 코드(틱이 없는 기호에서 실행)

F5 키를 누르면 중단점이 적중됩니다. 그리고 두 번째로 F5를 누른 후 - 유사하게. 이렇게 해서는 안 되지만 확인을 위해 코드에 있는 줄의 주석 처리를 제거하고 시도해 볼 수 있습니다.

이것이 어떻게 진행되고 있는지 볼 수 있는 방법입니다. 첫 번째 및 두 번째 정류장에서 i 값을 추적합니다.

 int Func( int & i)
{
        i++;
         return 0 ;
}

int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{
         int i = 1 ;
         return (Func(i)); // здесь поставить точку останова (F9)
}
 
Sergei Vladimirov :

이것이 어떻게 진행되고 있는지 볼 수 있는 방법입니다. 첫 번째 및 두 번째 정류장에서 i 값을 확인합니다.

따라해서 썼습니다

나는 그것이 한 번 호출되고 디버거가 거짓말을하고 있다는 것을 알았습니다.

F5 키를 두 번 누르면 디버거가 동일한 위치로 다시 이동하는 이유는 무엇입니까? return(0)을 사용하면 이러한 일이 발생하지 않습니다. 이는 맞습니다.

 

예, 그는 거짓말을 하지 않지만 두 번 멈춥니다. 괄호 안의 표현식을 계산하기 전과 그 뒤에, 돌아오기 직전에 멈춥니다.

그건 그렇고, 제 생각에는 매우 편리한 기능입니다. 기억할 필요가 있습니다. 종료하기 전에 반환 값을 확인하기 위해 괄호 안의 결과를 별도의 변수에 넣을 필요가 없습니다. 디버거가 다시 자체적으로 중지됩니다.

 
Sergei Vladimirov :

예, 그는 거짓말을 하지 않지만 두 번 멈춥니다. 괄호 안의 표현식을 계산하기 전과 그 뒤에, 돌아오기 직전에 멈춥니다.

그건 그렇고, 제 생각에는 매우 편리한 기능입니다. 기억할 필요가 있습니다. 종료하기 전에 반환 값을 확인하기 위해 괄호 안의 결과를 별도의 변수에 넣을 필요가 없습니다. 디버거는 두 번째로 스스로를 멈춥니다 .

편리하다는 점에 동의합니다. 그러나 디버거에서 변수 없이 종료하기 전에 반환 결과를 어떻게 알 수 있습니까?
 
fxsaber :


다음 코드를 입력하세요.

 int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
   int i= 1 ;
   Print ( "Перед: i " ,i, ",rates_total " ,rates_total, ", prev_calculated " ,prev_calculated);
   int rezult=Func(i);
   Print ( "После: i " ,i, ",rates_total " ,rates_total, ", prev_calculated " ,prev_calculated);
   return (rezult); // здесь поставить точку останова (F9)
  }

차트에 지표를 스케치합니다 . 그런 다음 터미널을 다시 시작합니다(차트에서 표시기를 제거할 필요가 없음). OnCalculate()가 한 번, 두 번 또는 세 번 호출될 수 있음을 알 수 있습니다. 즉, 위에서 말했듯이 어렵고 빠른 규칙은 없습니다.

 
Karputov Vladimir :

다음 코드를 입력하세요.

차트에 지표를 스케치합니다 . 그런 다음 터미널을 다시 시작합니다(차트에서 표시기를 제거할 필요가 없음). OnCalculate()가 한 번, 두 번 또는 세 번 호출될 수 있음을 알 수 있습니다. 즉, 위에서 말했듯이 어렵고 빠른 규칙은 없습니다.

당신은 상대방이 쓰는 것을 절대적으로 듣고 싶어하지 않는다고 당신에 대해 불평하도록 강요합니다.
 
fxsaber :
편리하다는 점에 동의합니다. 그러나 디버거에서 변수 없이 종료하기 전에 반환 결과를 어떻게 알 수 있습니까?

Func()의 본문을 살펴보고 종료하기 전에 반환되는 내용을 확인하십시오. 특정한 경우를 말하는 것입니다. 값이 대괄호로 직접 계산된다면 당연히 안 됩니다.

추신. 하지만... 왜 안되지? 두 번째 정류장에서 모든 return() 인수의 값을 보고 결과를 계산합니다. )