Ошибки, баги, вопросы - страница 512

 
Neofit:
Размер массиву задайте. ArrayResize
 
Neofit:

Подскажите пожалуйста как правильно работать с массивом элементами которого являются структуры Mqlrates.

Вот конкретно то что интересует.Например: 

MqlRates AdaptedRates[];

ArraySetAsSeries(AdaptedRates,true); 

AdaptedRates[300].open=1;

В отладчике выдает ошибку - Invalid array access.

Насколько я понимаю это связано с тем что используя такую форму записи можно только читать элементы структуры которая в свою очередь является элементом массива. 

Вопрос как правильно записывать элементы структуры. Все элементы не интересуют важны непосредственно цены .open .high .low .close .

 Заранее извиняюсь вопрос наверно очень банальный (я вообще не программист), но в справке ответа я не нашел. Буду благодарен за любую помощь.

У Вас используется динамический массив AdaptedRates[]. Насколько я помню, при работе с динамическими массивами следует устанавливать их размер с помощью функции ArrayResize(). А пока что компилятор ругается на индекс 300, указанный в третьей строчке.
 
Swan:
Размер массиву задайте. ArrayResize
Насколько я понимаю если определить размер, к примеру 
MqlRates AdaptedRates[302];  
То я не смогу установить тип индексации as series.  
 
Neofit:
Насколько я понимаю если определить размер, к примеру 
MqlRates AdaptedRates[302];  
То я не смогу установить тип индексации as series.  

:) Вы не статический массив задайте, а динамическому размер установите с помощью ArrayResize().

Ну, типа: ArrayResize(AdaptedRates,302); и т.д.

 
Yedelkin:
У Вас используется динамический массив AdaptedRates[]. Насколько я помню, при работе с динамическими массивами следует устанавливать их размер с помощью функции ArrayResize(). А пока что компилятор ругается на индекс 300, указанный в третьей строчке.
Статические массивы не могут быть представлены в виде таймсерий, то есть к ним не применима функция ArraySetAsSeries(), которая устанавливает доступ к элементам массива от конца массива к его началу. Если требуется обеспечить доступ к массиву как в таймсериях, используйте объект динамического массива.

Это цитата из справки.

 Swan, Yedelkin спасибо что так быстро откликнулись.

 
Neofit:
Насколько я понимаю если определить размер, к примеру 
MqlRates AdaptedRates[302];  
То я не смогу установить тип индексации as series.  

да.

MqlRates AdaptedRates[];//таки оставьте массив динамическим

ArrayResize(AdaptedRates,302);//и установите нужный размер

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных - Документация по MQL5
 
Yedelkin:

:) Вы не статический массив задайте, а динамическому размер установите с помощью ArrayResize().

Ну, типа ArrayResize(AdaptedRates,302); и т.д.

 

Спасибо за популярное объяснение, насколько я понял перед любым обращением  к ячейке динамического массива желательно его  ArrayResize до нужных пределов, буду пробовать.
 
pusheax:

Глюк в тестере стратегий.

Он вдруг останавливается и у всех локальных и удаленных агентов надпись finished и так висит.

Не подскажите как его запустить дальше, жалко время все начинать сначала?
Регулярно  :-) Не надо сначала.Отключаю облака.Начинают локальные идти.Потом опять подключаю облака.Пока так борюсь.Хуже ,когда такое ночью случается,простаивает до моего пробуждения :-)
 
Neofit:
Спасибо за популярное объяснение, насколько я понял перед любым обращением  к ячейке динамического массива желательно его  ArrayResize до нужных пределов, буду пробовать.

Примечание. Только для индикаторных буферов этого не надо будет делать. Там исполняющая подсистема терминала с этим сама справляется.

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

 
Yedelkin:

Примечание. Только для индикаторных буферов этого не надо будет делать. Там исполняющая подсистема терминала с этим сама справляется.

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

Ну я так по глупости сказал на самом деле я понимаю что если  уже расширил динамический массив до 302 то к любому  элементу с 0 по 301 я обратиться смогу и без ArrayResize.
Причина обращения: