Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Скачай MetaTrader 5 и начни торговать уже сегодня!
Александр
16
Александр 2015.07.10 01:35 

Здравствуйте всем!

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

Интересует вопрос, сохраняются ли ранее записанные данные во время изменения размера массива? Потому что на выходе я получаю массив заполненный нулями, кроме последних записанных данных (они сохраняются). 

double Bars[][10000]; 

ArrayResize(Bars,qwer+1); 

for(int i=0;i<k;i++){

Bars[qwer][i]=iTime(NULL,0,i+1); 

qwer++; //глобальная переменная

Slawa
Модератор
6676
Slawa 2015.07.10 06:10  

Не должны затираться данные при вызове ArrayResize.

Проверим

Ihor Herasko
8435
Ihor Herasko 2015.07.10 06:22  

Если приведенный код расположен в теле одной и той же функции, то ничего удивительного нет - на каждой новой итерации массив Bars создается заново с нулевым количеством элементов в первом измерении.

Способы лечения:

1. Объявить массив статическим.

2. Вынести объявление массива на глобальный уровень.

P. S. Название массива совпадает с именем предопределенной переменной. Желательно переименовать массив. 

Rashid Umarov
Админ
6600
Rashid Umarov 2015.07.10 08:07  

Смотрите также справку https://docs.mql4.com/ru/mql4changes

Старый компилятор MQL4

Новый компилятор MQL4

Новый компилятор MQL4 с #property strict

Точки входа init(), start(), deinit() могут иметь любые параметры и любой тип возврата

init(), start(), deinit(), оставленные для совместимости,

и новые OnInit(), OnStart(), OnCalculate(), OnTick(), OnTimer(), OnChartEvent(), OnTester(), OnDeinit() должны точно соответствовать своим сигнатурам

То же

Результат возврата из функции init() никак не анализируется исполняющей подсистемой

Результат возврата из функций init() и OnInit() никак не анализируется исполняющей подсистемой

При возврате из OnInit() ненулевого значения выполнение эксперта или индикатора прекращается, программа выгружается

Имена переменных практически любые (кроме зарезервированных слов), включая спецсимволы и точки

Имена переменных не могут иметь спецсимволы и точки.

Список зарезервированных слов расширен, поэтому именами не могут быть такие широко распространенные слова, как short, long, const и т.д.

То же

Область видимости переменной - от объявления (даже во вложенном блоке) до конца функции

То же

Область видимости переменной - от объявления до конца блока, в котором переменная объявлена

Неявная инициализация всех переменных (и глобальных и локальных) нулями

То же

Инициализация только глобальных переменных. Из локальных переменных неявно инициализируются только строки

Локальные массивы при выходе из функции не освобождаются

Локальные массивы освобождаются при выходе из функции

Локальные массивы освобождаются при выходе из блока {}

Александр
16
Александр 2015.07.10 12:57  
Scriptong:

Если приведенный код расположен в теле одной и той же функции, то ничего удивительного нет - на каждой новой итерации массив Bars создается заново с нулевым количеством элементов в первом измерении.

Способы лечения:

1. Объявить массив статическим.

2. Вынести объявление массива на глобальный уровень.

P. S. Название массива совпадает с именем предопределенной переменной. Желательно переименовать массив. 

Массив double Bars[] объявлен приватным свойством класса. Функция, которая занимается заполнением массива, это метод класса, который вызывается во время появления нового бара. Данный массив был специально засунут в класс, чтобы избежать "непредвиденного" доступа к нему и изменения какой-либо функцией. Объявление массива статическим не помогло, компилятор ругается (я так понимаю потому что массив инициализирован, как динамический).

P.S. Bars[] - в коде название массива другое и не совпадает с названием предопределенной переменной, для удобства данный массив носит подобное название исключительно на данном форуме.

Александр
16
Александр 2015.07.10 19:26  

Всем спасибо!!! Так сказать подтолкнули на путь истинный. Вся проблема заключалась в создании объекта класса, а если быть точнее, в конструкторе. Создание объекта класса происходило в момент образования новой свечи (а не как нужно, во время инициализации), в это же время создавался новый массив, старый перезаписывался, а так как данных не было для заполнения, все элементы забивались "0". 

 P.S. Всем спасибо за помощь.

P.S.S. Только начинаю осваивать классы.

Алексей Тарабанов
7220
Алексей Тарабанов 2015.07.10 22:31  
Scriptong:

Если приведенный код расположен в теле одной и той же функции, то ничего удивительного нет - на каждой новой итерации массив Bars создается заново с нулевым количеством элементов в первом измерении.

Способы лечения:

1. Объявить массив статическим.

2. Вынести объявление массива на глобальный уровень.

P. S. Название массива совпадает с именем предопределенной переменной. Желательно переименовать массив. 

Не примите за предвзятость. 

Имхенько, не бывает статических массивов, а потому - не следует назначать их таковыми; они и так в статическом режиме управления памятью числятся.  

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий