Ошибки, баги, вопросы - страница 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);
Роман, прежде, чем поучать, научитесь сами.