static array error

 

В новом билде не позволяет работать с массивом, объявленным внутри функции как static. 

Например

static int a[];

ArrayResize(a,1);

 Компилятор ошибки не выдает. Но ошибка возникает в терминале (4.00 билд 890, 32-bit) 

Access violation write to 0x00000008

 

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

 
Операционная система Win 10 x32. В 881 работает без ошибки. В билде 890 работает без ошибки. У Вас скомпилирован код в каком билде? 
 

Скомпилирован в билде 890. Операционка Win XP 32-bit.  Допустимо ли объявлять динамические массивы как static? Ведь работало. На 840 билде работает. 

 
dmipec:

Скомпилирован в билде 890. Операционка Win XP 32-bit.  Допустимо ли объявлять динамические массивы как static? Ведь работало. На 840 билде работает. 

Build 890:

//+------------------------------------------------------------------+
//|                                                  test_script.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   static int a[];
   ArrayResize(a,1);
  }
//+------------------------------------------------------------------+
Ошибки нет.
 

Попробуйте то же самое скомпилировать в эксперте. Там появляется эта ошибка на втором тике или сразу.

Странно все это. 

 
dmipec:

Попробуйте то же самое скомпилировать в эксперте. Там появляется эта ошибка на втором тике или сразу.

Странно все это. 

И в советнике работает без ошибок:

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int count=0;
   static int a[];
   ResetLastError();
   int rezult=ArrayResize(a,1);
   if(rezult==-1)
     {
      Print("Error ",GetLastError());
      return;
     }
   Print("Count ",count);
   count++;
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---

  }
//+------------------------------------------------------------------+

Вы точно других операций и вычислений не выполняете? 

 
Спасибо за сообщение, ошибку воспроизвели. Исправим.
 
Ilyas:
Спасибо за сообщение, ошибку воспроизвели. Исправим.
Эта ошибка зависит от операционной системы?
 

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

Ребята из Сервисдеска взяли на карандаш.  Владмимр, попробуйте запустить вот такой код, и у вас, скорее всего, будет 

Access violation write to 0x00000008

 

bool EquityGain(int gain=40) 
  {
   static int GainData[];  //создаем массив учета достижения такой прибыли
   int buffer_reserve=1000; // задаем размер резерва для буфера 
      //и создаем массив для буфера без размера. 
      //данные будт храниться после каждого вызова функции
   static double EquityBuffer[]; 
      //если в буфере уже есть что-то, то сдвигаем на один индекс право все что есть. 
      //чтобы освободить нулевой индекс для свежих данных
      //общий размер массива при копировании автоматически увеличивается
      //освобождается нулевая позиция:
   if(ArrayRange(EquityBuffer,0)>0) ArrayCopy(EquityBuffer,EquityBuffer,1,0);
      // если буфер еще пустой, то делаем ему начальный размер. В пустой ничего не положишь
   else ArrayResize(EquityBuffer,1,buffer_reserve);
      //в любом случае начальная позиция подготовлена 
      //и мы кладем в нее величину текущих средств
   EquityBuffer[0]=MathRound(AccountEquity());
      // выясняем максимальное значение в буфере (не требуется)
   double buffer_max=EquityBuffer[ArrayMaximum(EquityBuffer,WHOLE_ARRAY,0)];
      // выясняем минимальное значение
   double buffer_min=EquityBuffer[ArrayMinimum(EquityBuffer,WHOLE_ARRAY,0)];
   double top_threshold=buffer_min+gain; // вычисляем верхнюю границу 
   Comment("equity top:"+(string)top_threshold); // напишем на экране на каком уровне состоится отскок
      //если самые свежие данные в буфере достигли верхней границы 
   if(EquityBuffer[0]>=top_threshold) 
     {
         //We prepare GainData array the same way. see above
      if(ArrayRange(GainData,0)>0) ArrayCopy(GainData,GainData,1,0);
      else ArrayResize(GainData,1,buffer_reserve);
         //и положим в него например информацию о размере буфера,
         //i.e. number of records in the buffer
         //т.е. number of ticks for which Equity has rebounded from the bottom
      GainData[0]=ArrayRange(EquityBuffer,0);
         //zero out the main buffer to start all over again. 
         //Zero dimension also zeros out with ArrayFree
      ArrayFree(EquityBuffer);
         //and return function true
      return(true);
     }
      //GainData may not be ready when the function is called for the first time
      //so we have to check if the array is accecible. otherwise it will be system critical error
      //if the size of array is undefined than skip
   if(ArrayRange(GainData,0)>0) 
      Comment("ticks:"+(string)GainData[0]); //write on the screen how many ticks have passed
   return(false); // if the new data is still below the threshold than return false
  }
 

Ошибку даёт функция ArrayCopy, если массив назначения имеет резерв. Пожалуйста, уберите его для работы в текущем билде.

int buffer_reserve=0; // задаем размер резерва для буфера