Скачать MetaTrader 5

static array error

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Торгуй как успешные трейдеры - подпишись на их сигналы!
dmipec
154
dmipec 2015.09.29 08:48 

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

Например

static int a[];

ArrayResize(a,1);

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

Access violation write to 0x00000008

 

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

Vladimir Karputov
Модератор
46162
Vladimir Karputov 2015.09.29 09:54  
Операционная система Win 10 x32. В 881 работает без ошибки. В билде 890 работает без ошибки. У Вас скомпилирован код в каком билде? 
dmipec
154
dmipec 2015.09.29 10:23  

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

Vladimir Karputov
Модератор
46162
Vladimir Karputov 2015.09.29 10:27  
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
154
dmipec 2015.09.29 10:43  

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

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

Vladimir Karputov
Модератор
46162
Vladimir Karputov 2015.09.29 11:11  
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
1206
Ilyas 2015.09.29 11:13  
Спасибо за сообщение, ошибку воспроизвели. Исправим.
Vladimir Karputov
Модератор
46162
Vladimir Karputov 2015.09.29 11:14  
Ilyas:
Спасибо за сообщение, ошибку воспроизвели. Исправим.
Эта ошибка зависит от операционной системы?
dmipec
154
dmipec 2015.09.29 12:03  

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

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

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
  }
Ilyas
1206
Ilyas 2015.09.29 12:05  

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

int buffer_reserve=0; // задаем размер резерва для буфера 
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий