Access violation write to 0x3FF3AAC7 in...

 
Что за ошибка в индикаторе появилась и не как не избавится? DLL не использует.
 
Nauris Zukas:
Что за ошибка в индикаторе появилась и не как не избавится? DLL не использует.
Вижу проблему, но не понимаю почему так! Если размер массива доходит до 131070 (ArraySize(х)=131070; ArrayRange(х,0)=43690), то выскакивает эта ошибка. Если ограничить до этого размера 131070 и дальше не добавлять, то все порядке.
Есть какое-то ограничение размеру массива?
 
При увеличении размера массива он может быть перенесен в памяти в больший кусок, когда прежнего выделенного места в памяти не хватает. При этом старый указатель на массив становится невалидным. Если используете передачу ссылок на массив, то после добавления в него данных не нужно продолжать обращаться к этому массиву по старой ссылке. То есть после добавления элемента в массив нужно вернуться в то место, где формируется ссылка на массив, и создать новую ссылку на него.
 
Ihor Herasko:
При увеличении размера массива он может быть перенесен в памяти в больший кусок, когда прежнего выделенного места в памяти не хватает. При этом старый указатель на массив становится невалидным. Если используете передачу ссылок на массив, то после добавления в него данных не нужно продолжать обращаться к этому массиву по старой ссылке. То есть после добавления элемента в массив нужно вернуться в то место, где формируется ссылка на массив, и создать новую ссылку на него.

Спасибо! Пока не понятно что такое "указатель на массив", в документаций не нашёл, ищу по форумам.
Если не трудно, какой-то пример вставьте.

 

Ещё такой вопрос, я сделал массив как double что-бы не заморачиватся структурой и переделал время в double:

double MaxMinPrice[][3];
         ...
         MaxMinPrice[MaxMinCount][0]=(double)iTime(Symbol(),PERIOD_H1,cnt1);
         MaxMinPrice[MaxMinCount][1]=iHigh(Symbol(),PERIOD_H1,cnt1);
         ...

Если было-бы это сделано структурой, то память было-бы меньше использовано?

 
Nauris Zukas:

Спасибо! Пока не понятно что такое "указатель на массив", в документаций не нашёл, ищу по форумам.
Если не трудно, какой-то пример вставьте.

Это когда массив передается в какую-либо функцию. По синтаксису выглядит как ссылка, но по сути (внутри) может быть и указателем:

double arrfArray[20];
ArrayInitialize(arrfArray, 0.0)
ProcessArray(arrfArray);


void ProcessArray(double &arrfArray[])
{
   for (int i = ArraySize(arrfArray) - 1; i >= 0; --i) 
      arrfArray[i] = i * 2.4;
}
 
Nauris Zukas:

Ещё такой вопрос, я сделал массив как double что-бы не заморачиватся структурой и переделал время в double:

Если было-бы это сделано структурой, то память было-бы меньше использовано?

Нет, не меньше (double и datetime имеют одинаковый размер), но со структурами намного удобнее и понятнее. Ведь тяжело постоянно держать в голове, какой индекс элемента массива за что отвечает. С многомерными массивами проблема усугубляется.

В Вашем случае это выглядело бы так:

struct Dot
{
   datetime    dtTime;
   double      fPrice;

   void Set(const datetime _dtTime, const double _fPrice)
   {
      dtTime = _dtTime;
      fPrice = _fPrice;
   }
};

Dot arrstDots[10];

arrstDots[0].Set(iTime(Symbol(),PERIOD_H1,cnt1), iHigh(Symbol(),PERIOD_H1,cnt1));
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Переменные - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ihor Herasko:

Спасибо! Буду разбираться.

 
Nauris Zukas:

Ещё такой вопрос, я сделал массив как double что-бы не заморачиватся структурой и переделал время в double:

Если было-бы это сделано структурой, то память было-бы меньше использовано?

(double)iTime(Symbol(),PERIOD_H1,cnt1);

странно...

может быть так?

(int)iTime(Symbol(),PERIOD_H1,cnt1);
 
Renat Akhtyamov:

странно...

может быть так?

int в два раза меньше, чем datetime.

 
Ihor Herasko:

int в два раза меньше, чем datetime.

И экстент (кусков) в DOS до 16.