mql4 + работа с многомерными массивами

 

Поскольку в mql4 нет структур, я решил использовать многомерные массивы. Но вот проблема... как изменять их размеры-то?

Объявил я массивчик:

int myArray[][][];

Вроде как изменил размерность массива первого уровня:

ArrayResize(myArray, 3);

Попытался изменить размерность массива второго уровня:

ArrayResize(myArray[0], 2);



Поимел ошибку:

',' - wrong dimension

Переписал по-другому:

ArrayResize(myArray[0][][], 2);

Снова поимел ошибку:

'[' - array index is to be an integer

Что происходит? Как динамически изменять размерность многомерных массивов?
 

в mql4 Можно изменять только размер 1 уровня.

 
Никак. Надо один массив использовать и рассчитывать индексы. В CodeBase кажется есть где-то библиотека для работы с виртуальными многомерными массивами.
 

В общем, понятно. Придётся воспользоваться https://www.mql5.com/ru/code/7736

Вот жесть-то какая. После такого и руки опускаются продолжать писать что-либо на MQL4. =(

 

На форуме (сайте) у Игоря Кима посмотри. Там описано, как это сделать.

 
juicy_emad:


Что происходит? Как динамически изменять размерность многомерных массивов?


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

 
nen:

На форуме (сайте) у Игоря Кима посмотри. Там описано, как это сделать.

Это вот так описано-то?:

http://kimiv.ru/forum/viewtopic.php?t=212

KimIV: Во втором измерении размерность массива в MQL4 изменить невозможно.

=))

 
Rosh:

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


Тогда у меня оперативной памяти не хватит. =)

 
juicy_emad:
nen:

На форуме (сайте) у Игоря Кима посмотри. Там описано, как это сделать.

Это вот так описано-то?:

http://kimiv.ru/forum/viewtopic.php?t=212

KimIV: Во втором измерении размерность массива в MQL4 изменить невозможно.

=))

У меня также были вопросы по многомерным массивам. Но несколько другого плана. Решил их самостоятельно.


По Вашей проблеме можно предложить следующее.

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

После этого первый массив функцией аррайресайз уменьшаете до одного элемента - это если массивы у Вас объявлены на глобальном уровне. Да и на локальном уровне тоже лучше уменьшить размер первого массива.

Коряво. К тому же непонятно, как дальше будет использоваться новый массив? Потребуется ли его еще раз менять? Все зависит от поставленной задачи.


Другой вариант - использовать несколько связанных между собой массивов. И внешним по отношению к массивам алгоритмом управлять этой структурой.

 
Динамический _одномерный_ массив с явным вычислением индекса и указателей на подмассивы, использующийся от начала вычислительной математики, особенно при острой необходимости экономии памяти и вычислительной эффективности алгоритма, - _полностью_ решает эту задачу. См. соответствующие темы по здешнему форуму.
 

Офигеть! Я шокирован!

Вот, к примеру, в C++, можно было замечательно динамически создавать двумерные массивы, причём разной длины ... в общем, проще в коде:


int **p, i, n, m, j;
n=10; m=100;
p=new int*[n];
for(i=0; i<n; i++)
p[i] = new int[m++];



Имеется ввиду, что переменная m может быть изменена во время создания массива и всё будет ОК.

...

Посмотрел я библиотеку ZH_Dynamic_Arrays_Lib.mq4 (выложенную в сорцах этого сайта) и нашел в ней функцию:


//| IntArrayDynamicDimension2 (переключатель true/false - писать/читать, переключатель true/false - контролировать/не контролировать входные данные, |
//| переключатель true/false - печатать/не печатать содержимое массива после каждого обращения к функции, установка размера нулевой размерности, |
//| установка размера первой размерности, номер ячейки в нулевой размерности, номер ячейки в первой размерности, числовое значение для ввода/вывода, |
//| 1-о мерный массив для преобразования в многомерный и заполнения); |
//| int IntArrayDynamicDimension2 (bool Write_Read, bool CheckingERROR, bool PRINT, int SizeDimension_0, int SizeDimension_1, int Cell_0, int Cell_1, int Value, int Array[]);



Т.е. тут можно задать SizeDimension_1 для всего массива! Т.е. нельзя задать SizeDimension_1 для конкретного массива в массиве... (в общем, вы меня понимаете). =)


И что теперь делать? Это значит, что придётся искать самый большой "m" и указывать его в SizeDimension_1 что-ли? Но это же ... жесть какая-то!