Странная ошибка Array out of range

 

Доброго времени суток.

Ситуация следующая: объявляю статичный массив и при попытке записать туда данные вылетает ошибка out of range. Объявление массива динамически с выделением памяти ( ArrayResize) не помогает. Код вот:

double tv_ma_15(int timeframe) //Hull MA 9
{
   double result = 0;
   
   int ma_period = 9;
   
   double rhma[3]; //<<----тут уже не объявляется почему-то
   
   double wma_1 = 0;
   double wma_2 = 0;
   
   int i = 0;
   while (i < 3)
   {
      wma_1 = iMA(Symbol(), timeframe, 5, 0, MODE_LWMA, PRICE_CLOSE, i);
      wma_2 = iMA(Symbol(), timeframe, ma_period, 0, MODE_LWMA, PRICE_CLOSE, i);
      rhma[i] = (wma_1 * 2) - wma_2;
      
      i++;
   }
   
   double HMA = NormalizeDouble(iMAOnArray(rhma, 0, 3, 0, MODE_LWMA, 0), Digits);
   
   return result;
}

Забавно вот что, если я объявлю массив глобально (вне функции), то все хорошо работает, а внутри функции уже нет. Это что за прикол и как это побороть? За годы программирования на языке впервые столкнулся с этим.

 
Denis Glaz:

Доброго времени суток.

Ситуация следующая: объявляю статичный массив и при попытке записать туда данные вылетает ошибка out of range. Объявление массива динамически с выделением памяти ( ArrayResize) не помогает. Код вот:

Забавно вот что, если я объявлю массив глобально (вне функции), то все хорошо работает, а внутри функции уже нет. Это что за прикол и как это побороть? За годы программирования на языке впервые столкнулся с этим.

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

 
Алексей Тарабанов #:

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

И где там эти "попытки"?
 
Sergey Gridnev #:
И где там эти "попытки"?

i=0, 1, 2, 3. После - выход из цикла, но всё уже сломалось. 

 
Алексей Тарабанов #:

i=0, 1, 2, 3. После - выход из цикла. 

там знак < а не <=, оно выйдет до 3х. А на отладке ошибка возникает еще при первом обращении, то есть когда к 0-ому элементу

 
Denis Glaz #:

там знак < а не <=, оно выйдет до 3х. А на отладке ошибка возникает еще при первом обращении, то есть когда к 0-ому элементу

Учите матчасть. Оператор While. 

 
Алексей Тарабанов #:

Учите матчасть. Оператор While. 


Я пожалуй вас проигнорирую, потому что вы конкретно не правы.

 
Denis Glaz #:


Я пожалуй вас проигнорирую, потому что вы конкретно не правы.

Ну и зря, потому, что выход за границы массива у Вас, а не у меня. 

В Вашем алгоритме сначала вычисления, а уже после - модификация переменной цикла. 

 
Алексей Тарабанов #:

Ну и зря, потому, что выход за границы массива у Вас, а не у меня. 

Он происходит из-за особенностей объявления массивов внутри функций и никак не связан с циклом, потому что он правильный. While работает пока условие в скобках TRUE, а выражение 3 < 3 это уже FALSE и он не входит в цикл. Учите матчасть уважаемый

 
Denis Glaz #:

Он происходит из-за особенностей объявления массивов внутри функций и никак не связан с циклом, потому что он правильный. While работает пока условие в скобках TRUE, а выражение 3 < 3 это уже FALSE и он не входит в цикл. Учите матчасть уважаемый

Нет, всё совсем не так. 

 
Алексей Тарабанов #:

Нет, всё совсем не так. 

Вы трезвый?