Zero divide поиск в сложном и объемном коде

 

Добрый день господа!

Есть проблема - советник, написанный мной, чуть менее 2т строк чистого сложноразветвленного кода в терминале работает без проблем, но в тестере выдает "Zero divide", деление на ноль.

Вопрос - есть ли у кого опыт локализации данной ошибки? Если не затруднит - поделитесь!

Есть ли какие-либо упрощенные способы в метаэдиторе или сторонними разработками найти эту ошибку?

P.S. Методы исключения отдельных блоков, глушения функций, установки Print() перед всеми делениями (О_о) мне известны, но крайне трудозатратны или мало эффективны.

P.P.S. Если нет - считайте это криком души... Все равно найду... )))

 

делайте так:

Ctrl+F

/

Enter

Enter

Enter

...

 
sergeev:

делайте так:

Ctrl+F

/

Enter

Enter

Enter

...



У меня каждый блок закомментирован, а в блоке все переменные и результаты, плюс особо хитровыделанные моменты не только закомментированы но и объяснены, т.к. имею свойство через 1-2 месяца забывать что там наваял... И это при том, что комментарии кодом не считаю - это я про объем...

Представляете СКОЛЬКО он мне / найдет?! 

 

А вы предварительно удалите комментарии из текста :)

Не знаю, на мой взгляд, 2т строк это не так уж и много. У меня, например, сейчас открыто с десяток индикаторов/советников объемом 500-1000 строк каждый.

Если вы так уж боитесь просмотреть эти 2т строк вручную, пришлите мне ваш код, постараюсь найти баг - уже лет 15 подобной работой занимаюсь)))

 
ktest0:


У меня каждый блок закомментирован, а в блоке все переменные и результаты, плюс особо хитровыделанные моменты не только закомментированы но и объяснены, т.к. имею свойство через 1-2 месяца забывать что там наваял... И это при том, что комментарии кодом не считаю - это я про объем...

Представляете СКОЛЬКО он мне / найдет?! 


Чтобы не возникало подобных проблем, каждую арифметическую операцию обрамляйте пробелами:

double a = b * c - d / e + f;

 тогда поиск операций деления будет произвести просто - по тегу " / ". 

Кстати, в этом случае код читается легче. 

 
ktest0:


Представляете СКОЛЬКО он мне / найдет?! 


кончено:) вы думаете вы первый кто столкнулся с таким?


если не хотите - то

- или сидите и думайте где

- но лучше воспользоваться тогда Print, расставляя сначала на больших блоках, потом постепенно локализуя место итд

Print(1)

Print(2)

Print(3)

// тут будет /0, значит 4 и 5 в журнал не попадет. значит между 3 и 4 баг

Print(4)

Print(5)

 
airbas:

А вы предварительно удалите комментарии из текста :)

Не знаю, на мой взгляд, 2т строк это не так уж и много. У меня, например, сейчас открыто с десяток индикаторов/советников объемом 500-1000 строк каждый.

Если вы так уж боитесь просмотреть эти 2т строк вручную, пришлите мне ваш код, постараюсь найти баг - уже лет 15 подобной работой занимаюсь)))


Про удалить комментарий - идея кстати толковая...

Сделаю копию и ее буду насиловать... там и найду! Спасибо!

А про "выслать код" - где тут смайлик с кукишем? Что-то найти не могу...

 
Scriptong:


Чтобы не возникало подобных проблем, каждую арифметическую операцию обрамляйте пробелами:

 тогда поиск операций деления будет произвести просто - по тегу " / ". 

Кстати, в этом случае код читается легче. 


Да, пожалуй на будущее это надо использовать, спасибо!
 
sergeev:

кончено:) вы думаете вы первый кто столкнулся с таким?


если не хотите - то

- или сидите и думайте где

- но лучше воспользоваться тогда Print, расставляя сначала на больших блоках, потом постепенно локализуя место итд

Print(1)

Print(2)

Print(3)

// тут будет /0, значит 4 и 5 в журнал не попадет. значит между 3 и 4 баг

Print(4)

Print(5)



да, об этом я и думал, но тоскливо очень... (((
 
ktest0:

да, об этом я и думал, но тоскливо очень... (((

хватит тут на форуме околачиваться.

займитесь уже поиском бага. :)

 

Я всегда делаю так: если еще на этапе написания кода есть хоть малейшее подозрение, что делитель может быть нулем, то

if(c!=0) a=b/c;
else {сообщение об ошибке}

Возьмите за привычку, и Zero divide вас отпустит) Потраченное время на 10 лишних строчек << потраченного времени на поиск нуля на этапе выполнения.

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