zero divide

 

Как обработать такую ошибку?

 
LastError сохраняет значение между вызовами start()

int start()
{
    int rc = GetLastError();
    if (rc != ERR_NO_ERROR)
    {
        /* Runtime errors like zero divide */
        printError("Occured in previous tick", rc);
    }
 
    /* Rest of the handler */
}
 

Дело не в том как её вывасти, дело в том как её обойти эту ошибку, тестер вспотыкается и тестирование прекращается.

 
Вы спрашивали, как обработать ошибку. Про тестер тоже трудно было догадаться.
В моем примере обработчик выводит сообщение в лог. Ничто не мешает обрабатывать любым другим способом.
Не вполне ясно, что значит обойти. Ошибку можно исправить, чему очень может помочь подробная трассировка.
 
Чтобы избежать ошибки (это ошибка самого программиста) деления на ноль, надо (в любом языке) перед любым делением гарантированно проверять делитель на равенство нулю.
 
Пол ночи искал какой пример привести для полного понимания.
И всетаки нашел.
Есть такой индикатор WPR (Williams’ Percent Range, %R), формула расчёта, согласно описанию на сайте
%R = -(MAX (HIGH (i - n)) - CLOSE (i)) / (MAX (HIGH (i - n)) - MIN (LOW (i - n))) * 100
Так вот просто начинаем подставлять значения те которые сделают ошибку деления на ноль

double dMaxHigh=High[iHighest(NULL,0,MODE_HIGH,14,1)];
double dMinLow=Low[iLowest(NULL,0,MODE_LOW,14,1)];
ExtWPRBuffer[i]=-100*(dMaxHigh-Close[i])/(dMaxHigh-dMinLow);

Подставим цифры которые вполне могут встретиться в рынке

double dMaxHigh=1,2860
double dMinLow=1,2860
ExtWPRBuffer[i]=-100*(1,2860-1,2860)/(1,2860-1,2860);

Собственно деление на ноль мы получили и тестер выдав эту ошибку дальше тестировать не хочит.
А ситуация возникает на открытии бара. Когда залотав все дыры в истории с помощью скрипта мы получаем равенство High = Low.
Допускаем такой момент, что дырка в истории у нас как раз имеет размер в 14 баров. И вот на этих 14 барах и вспотыкается тестер.

Каким образом не допускать эту ошибку, когда хочится что-бы дыр в истории небыло, ну и естественно расчёт по формуле шел.

 
HIDDEN:
Пол ночи искал какой пример привести для полного понимания.
И всетаки нашел.
Есть такой индикатор WPR (Williams’ Percent Range, %R), формула расчёта, согласно описанию на сайте
%R = -(MAX (HIGH (i - n)) - CLOSE (i)) / (MAX (HIGH (i - n)) - MIN (LOW (i - n))) * 100
Так вот просто начинаем подставлять значения те которые сделают ошибку деления на ноль


Каким образом не допускать эту ошибку, когда хочится что-бы дыр в истории небыло, ну и естественно расчёт по формуле шел.


Все очень просто:
  1. формула для людей, а не для компьютера
  2. всегда и во всех языках нужно проверять делитель на ноль перед делением
У нас везде есть проверки всех делителей на ноль. Это нормальная практика в программировании.

Кстати, мы также отслеживаем все деления в MQL4 коде и сообщаем, если программист допускает деление на ноль. Конечно же, работу программы приходится останавливать, так как ее логика нарушена.
 
Renat писал (а):

Все очень просто:
  1. формула для людей, а не для компьютера
  2. всегда и во всех языках нужно проверять делитель на ноль перед делением
У нас везде есть проверки всех делителей на ноль. Это нормальная практика в программировании.

Кстати, мы также отслеживаем все деления в MQL4 коде и сообщаем, если программист допускает деление на ноль. Конечно же, работу программы приходится останавливать, так как ее логика нарушена.

Так что мне то делать есть выход из этой ситуации?
Отслеживаете Вы в программе деление на ноль, это правильно. Вот то что останавливаете не очень одыкватно при таких ситуациях.
Самое что интересное индикатор же не останавливает свой расчёт, а расчитавыет далее переходя к новому бару.
 
      double dMaxHigh=High[iHighest(NULL,0,MODE_HIGH,14,1)];
      double dMinLow=Low[iLowest(NULL,0,MODE_LOW,14,1)];
 
if ( MathAbs(dMaxHigh-dMinLow) < Point )
      ExtWPRBuffer[i]=-100*(dMaxHigh-Close[i])/Point;
else
      ExtWPRBuffer[i]=-100*(dMaxHigh-Close[i])/(dMaxHigh-dMinLow);
 
HIDDEN:
Renat писал (а):

Все очень просто:
  1. формула для людей, а не для компьютера
  2. всегда и во всех языках нужно проверять делитель на ноль перед делением
У нас везде есть проверки всех делителей на ноль. Это нормальная практика в программировании.

Кстати, мы также отслеживаем все деления в MQL4 коде и сообщаем, если программист допускает деление на ноль. Конечно же, работу программы приходится останавливать, так как ее логика нарушена.

Так что мне то делать есть выход из этой ситуации?
Отслеживаете Вы в программе деление на ноль, это правильно. Вот то что останавливаете не очень одыкватно при таких ситуациях.
Самое что интересное индикатор же не останавливает свой расчёт, а расчитавыет далее переходя к новому бару.
Я третий раз повторяю: "проверять всегда и везде все делители самостоятельно". Странно, что программист не понимает таких базовых вещей.
 
Renat:
Я третий раз повторяю: "проверять всегда и везде все делители самостоятельно". Странно, что программист не понимает таких базовых вещей.

Извините за назойливость, я новичок в программировании, вы не могли бы разъяснить метод поиска и исправления ошибки "zero divide" через линейную логику, очень сложно использовать метафизику, на начальной стадии развития.
Причина обращения: