Динамический массив для эксперта

 

Объясните, пожалуйста.

При запуске на отладку простой программы (см. ниже)  выдается сообщение об ошибке: "test001 (EURUSD,H1) Array out of range in 'test001.mq5' (25,7)" с указанием на строку    "  test_array[i]=0.0;".

Подскажите, в чём проблема? 

========================================

//+------------------------------------------------------------------+
//|                                                      test001.mq5 |
//+------------------------------------------------------------------+
double test_array[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(test_array,true);
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<10;i++)
      test_array[i]=0.0;
  }
//+------------------------------------------------------------------+

Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
  • www.mql5.com
Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции - Документация по MQL5
 
Массив не отразмерен.
ArrayResize до нужного размера сначала, а потом с ним работать...
 

Странно, но теперь динамические массивы требуют обязательной инициализации. Вот такой код рабочий:

//+------------------------------------------------------------------+
//|                                                      test002.mq5 |
//|              Copyright Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                      test001.mq5 |
//+------------------------------------------------------------------+
double test[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   int gf=ArrayResize(test,10,5);
   ArraySetAsSeries(test,1);
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<10;i++)
     {
      test[i]=0.5;
     }
   Print(test[1]);
  }
//+------------------------------------------------------------------+

 

 
Joker:
Массив не отразмерен.
ArrayResize до нужного размера сначала, а потом с ним работать...

Странно. Когда создавал индикатор, то использовал динамические массивы, но при этом их не "отразмеривал". И всё прекрасно работает.

Но как только стал создавать эксперт для той же торговой стратегии, возникла вышеуказанная проблема.

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

..Да и если бы нужный размер массива был известен,  я бы использовал не динамический, а статический массив. В общем, интересует теоретическая (идеологическая) подоплёка вопроса.

 
Yedelkin:

Странно. Когда создавал индикатор, то использовал динамические массивы, но при этом их не "отразмеривал". И всё прекрасно работает.

Но как только стал создавать эксперт для той же торговой стратегии, возникла вышеуказанная проблема.

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

..Да и если бы нужный размер массива был известен,  я бы использовал не динамический, а статический массив. В общем, интересует теоретическая (идеологическая) подоплёка вопроса.

Этого раньше не было, появилось после какого-то обновления. Если это не устранят, то у меня будут проблемы... нужно будет исправлять кучу индикаторов, советников и нейронных сетей...
 
Rinng:
Этого раньше не было, появилось после какого-то обновления. Если это не устранят, то у меня будут проблемы... нужно будет исправлять кучу индикаторов, советников и нейронных сетей...
Благодарю, Rinng, за подробное разъяснение ситуации. Будем ждать пояснений разработчиков по теме.
 
Yedelkin:

Странно. Когда создавал индикатор, то использовал динамические массивы, но при этом их не "отразмеривал". И всё прекрасно работает.

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

Если же динамический массив используется в обычной работе, то его нужно ресайзить вручную.

 

Ясно, если стоит код типа

SetIndexBuffer(1,OutBuffer,INDICATOR_DATA);
то всё должно работать и без ресайза.

 

 
Renat:

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

Если же динамический массив используется в обычной работе, то его нужно ресайзить вручную.

ОК. Просьба: отразить аналогичную информацию в справочнике, в частности, в разделах "Динамические массивы", "ArrayResize". Для начинающих может оказаться весьма полезной.
 
Указанная Вами тема интересна с точки зрения дополнительного расширения кругозора, но ответа на обозначенную здесь проблему я там не обнаружил.
Причина обращения: