Ошибки, баги, вопросы - страница 1681

 
fxsaber:

Не, я на RTS сейчас запускаю, когда котиры стоят. Выяснил, что вызывается один раз, а отладчик врет, показывая, будто два. Код для воспроизведения (запускать на символе, где не идут тики)

После нажатия на 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(), что она возвращает перед выходом. Я ж о частном случае говорю. Если значение будет вычисляться непосредственно в скобках, то никак, конечно.

PS. Хотя... Почему никак? На второй остановке посмотреть значения всех аргументов return() и подсчитать результат. ) 

 
fxsaber:
Вы вынуждаете меня жаловаться на вас, как абсолютно не желающего слышать то, что пишет оппонент.
Это Ваше право, моя задача донести до Вас, что нет жестких правил по количеству вызовов OnCalculate() - так как эта функция по сути, отображает реакцию на события: или подкачку истории, или изменении истории (приход свежих тиков) или подготовка торгового окружения.
 
Sergei Vladimirov:
Посмотреть в теле Func(), что она возвращает перед выходом. Я ж о частном случае говорю. Если значение будет вычисляться непосредственно в скобках, то никак, конечно.
Тогда никакого смысла во втором F5 нет!
[Удален]  
fxsaber:
Спасибо. Никак не могу понять, почему в начале индикатор вызывает дважды OnCalculate. Хотелось бы выяснить, на какое событие такая реакция. По отладке, к сожалению, событий не видно.

Ответ из Сервисдеска по этому вопросу: 

Конкретно зависит от контрольной суммы.

История может и не подкачалась (вполне может быть модификация уже существующей истории без добавления новых данных), а контрольная сумма значительно изменилась