Ошибки, баги, вопросы - страница 2493

 
Сергей Таболин:

Куда копать?

Нужно подождать - кабинка занята (данные на момент обращения не были рассчитаны)

 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL5 MT5 MetaTrader 5".
 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL5 MT5 MetaTrader 5".
 

Словил ошибку

...tested with error "critical runtime error 502 in OnTester function (array out of range, module ....ex5, file ....mqh, line 237, col 51...

Вот сам код:

//+-------------------
   // коррекция
   int      correcton_index[3];
            correcton_index[0]   = 1;
            correcton_index[1]   = (int)MathRound(balance_arr_size / 2);
            correcton_index[2]   = balance_arr_size;
   int      correcton_index3[5];
            correcton_index3[0]  =  1;
            correcton_index3[1]  = (int)MathRound(correcton_index[1] / 2);
            correcton_index3[2]  = correcton_index[1];
            correcton_index3[3]  = (int)MathRound((balance_arr_size - correcton_index[1]) / 2);
            correcton_index3[4]  = balance_arr_size;
   int      correcton_index7[9];
            correcton_index7[0]  = 1;
            correcton_index7[1]  = (int)MathRound(correcton_index3[1] / 2);
            correcton_index7[2]  = correcton_index3[1];
            correcton_index7[3]  = (int)MathRound((correcton_index3[2] - correcton_index3[1]) / 2);
            correcton_index7[4]  = correcton_index3[2];
            correcton_index7[5]  = (int)MathRound((correcton_index3[3] - correcton_index3[2]) / 2);
            correcton_index7[6]  = correcton_index3[3];
            correcton_index7[7]  = (int)MathRound((balance_arr_size - correcton_index3[3]) / 2);
            correcton_index7[8]  = balance_arr_size;
   
   double   correcton   = NormalizeDouble((balance_arr[correcton_index[2]-1] / balance_arr[correcton_index[1]-1]) / (balance_arr[correcton_index[1]-1] / balance_arr[correcton_index[0]-1]),8);
   double   correcton3[3];
   double   correcton7[7];
   double   crr         = 1;
   ArrayInitialize(correcton3,EMPTY_VALUE);
   ArrayInitialize(correcton7,EMPTY_VALUE);
   for(int i = 0; i < 3; i++)
   {
      correcton3[i]  = NormalizeDouble((balance_arr[correcton_index3[i+2]-1] / balance_arr[correcton_index3[i+1]-1]) / (balance_arr[correcton_index3[i+1]-1] / balance_arr[correcton_index3[i+0]-1]),8);
      crr            = NormalizeDouble(crr * correcton3[i],8);
   }
   correcton         = NormalizeDouble(correcton * crr,8);
   crr               = 1;
   for(int i = 0; i < 7; i++)
   {
      correcton7[i]  = NormalizeDouble((balance_arr[correcton_index7[i+2]-1] / balance_arr[correcton_index7[i+1]-1]) / (balance_arr[correcton_index7[i+1]-1] / balance_arr[correcton_index7[i+0]-1]),8);
      crr            = NormalizeDouble(crr * correcton7[i],8);
   }
   correcton         = NormalizeDouble(correcton * crr,8);

При i = 6 correcton_index7[i+2] (i+2=8) ну никак не может выйти за пределы массива. Тем более что аналогичный предыдущий цикл не ругается. Чего я не вижу?

 
Сергей Таболин:

Словил ошибку

Вот сам код:

При i = 6 correcton_index7[i+2] (i+2=8) ну никак не может выйти за пределы массива. Тем более что аналогичный предыдущий цикл не ругается. Чего я не вижу?

В correcton3[3]; вы указываете три элемента.
А цикл запускаете четыре раза.

В correcton7[7 ]; вы указываете семь элементов.
А цикл запускаете восемь раз.

 
Roman:

В correcton3[3]; вы указываете три элемента.
А цикл запускаете четыре раза.

В correcton7[7 ]; вы указываете семь элементов.
А цикл запускаете восемь раз.

Считаем на пальцах: i=0 и с каждым циклом увеличивается на 1. Работает пока i<7. Вопрос вам (считайте на пальцах) сколько раз будет пройден цикл?

 
Да, сорри, не доглядел что в условии цикла нет =

А вот тут не может быть проблем ?
correcton_index[0]   = 1;
correcton_index3[0]  = 1;  
correcton_index7[0]  = 1;
Вы указываете ноль элементов, а присваиваете туда значение.
 
Roman:
Да, сорри, не доглядел что в условии цикла нет =

А вот тут не может быть проблем ?
Вы указываете ноль элементов, а присваиваете туда значение.

Спасибо за желание помочь, только для начала сами разберитесь с массивами. )))

 
Сергей Таболин:

Спасибо за желание помочь, только для начала сами разберитесь с массивами. )))

Объявление массива и итерация по элементам массива разные вещи ))

 
Roman:

Объявление массивов и итерация по элементам массива разные вещи ))

   int      correcton_index7[9];        // объявление
            correcton_index7[0]  = 1;   // присвоение значения
            correcton_index7[1]  = (int)MathRound(correcton_index3[1] / 2);
Роман, прежде, чем поучать, научитесь сами.
Причина обращения: