Помогите найти БАГ

 

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

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

      if(close[i] > CurMax){

        UpLevelDn[i] = LastMax;

        while(close[i] > CurMax){

          LastMax = CurMax;

          CurMax  = LastMax + _Range;

        }

        UpLevelUp[i] = LastMax;               // UpLevelUp[i] = нормальное значение

        MidLevel[i]  = LastMax - _Range_2;// MidLevel[i]  = нормальное значение

        LastMin      = MidLevel[i] - _Range_2;

        CurMin       = LastMin - _Range;

        DnLevelUp[i] = 0.0;

        DnLevelDn[i] = 0.0;

      break;        // на это не обращайте внимание - внутри оператора CASE

      }

      if(close[i] < CurMin){

        DnLevelUp[i] = LastMin;

        while(close[i] < CurMin){

          LastMin = CurMin;

          CurMin  = LastMin - _Range;

        }

        DnLevelDn[i] = LastMin;                    // DnLevelDn[i] = нормальное значение 

        MidLevel[i]  = LastMin + _Range_2;    // Почему здесь MidLevel[i] = 0.0?

        LastMax      = MidLevel[i] + _Range_2;// А тут соответственно бред

        CurMax       = LastMax + _Range;        // И тут соответственно бред...

        UpLevelUp[i] = 0.0;

        UpLevelDn[i] = 0.0;

      break;

      }
 
Ну скорее только смотреть на корректность значения которые прибавляешь и отнимаешь.    
 

Скорее всего дело в начальных значениях LastMax и LastMin.

А вставляйте код через кнопку "Код" (13-я слева).

 
Dmitry Fedoseev:

Скорее всего дело в начальных значениях LastMax и LastMin.

А вставляйте код через кнопку "Код" (13-я слева).

        DnLevelDn[i] = LastMin;           // DnLevelDn[i] = нормальное значение 
        MidLevel[i]  = LastMin + _Range_2;// Почему здесь MidLevel[i] = 0.0?

Обратите внимание, первая строка выполняется корректно, т.е. значение буфера весьма себе адекватное.

Во второй строке добавляется всего 1 переменная, которая по умолчанию значительно меньше первой, но значение буфера почему-то равно 0 или EMPTYVALUE...

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

а при повторном прорыве нижней границы начинаются чудеса...

 
MidLevel[i]  = LastMin + _Range_2;    // Почему здесь MidLevel[i] = 0.0?
А что, если... LastMin == -_Range_2 ))
 
SeriousRacoon:
А что, если... LastMin == -_Range_2 ))

Ну просто поверьте мне на слово, это не так. Вобщем-то проблема решилась не знаю каким образом, как всегда, изменил кучу кода, а заодно

выгрузил индикатор с графика и снова его загрузил

 
Aleksandr Martynov:

Ну просто поверьте мне на слово, это не так. Вобщем-то проблема решилась не знаю каким образом, как всегда, изменил кучу кода, а заодно

выгрузил индикатор с графика и снова его загрузил

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