Ошибки, баги, вопросы - страница 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() никому ничего не должна. А вот программист обязан контролировать два значения: rates_total, prev_calculate и условие когда prev_calculate==0.

 
Karputov Vladimir:
Я Вам ответил - Вам нет дела до того, сколько раз вызывается OnCalculate. Ваша задача - обеспечивать или полный пересчёт индикатора или частичный, анализируя два значения: rates_total, prev_calculate и условие когда prev_calculate==0.

Мне есть дело, сколько раз вызывается отладчик и сколько раз вызывается OnCalculate. Я по натуре ЗАНУДА! И мне до всего есть дело.

Вы совершенно не разобравшись в сути проблемы, пытаетесь меня учить чему-то. Спасибо, конечно. Но давайте слушать и слышать оппонента. 

 
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() и подсчитать результат. ) 

Причина обращения: