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

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

Что за указатели на подмассивы? Как их вычислять? (по поиску ничего не удалось найти)

 
juicy_emad:

Что за указатели на подмассивы? Как их вычислять? (по поиску ничего не удалось найти)

Вот, пожалуйста. 'Помогите с массивами.'

 
Talex:

Вот, пожалуйста. 'Помогите с массивами.'

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

Так или иначе, кое-как я смогу решить свою проблему с помощью библиотеки ZH_Dynamic_Arrays_Lib

 
juicy_emad:

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

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

А как же ещё. Классы-структуры-публиичные_типы в MQL-4 не реализованы. И если хочешь сделать некое подобие структур - приходится делать многомерные массивы. Приходится резервировать массу памяти под них, которая в дальнейшем не будет использоваться, а будет просто хвостом висеть.

Допустим нужно реализовать структуру, на С++ она может выглядеть так:

struct my_struct
{
    double x;        //  Переменная x типа double
    double y;        //  Переменная y типа double
    int z;           //  Переменная z типа int
    1_array mass;    //  Массив n-й длинны
    2_array mass2;   //  Массив m-й длинны
};

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

Вот что у меня из этого получается:

double my_struct[100,5,100];// Прототип массива Struct my_struct
                            // my_struct[a][b][c]:
                            // Где a -  название переменной типа my_struct
                            //          выраженное в числовом эквиваленте типа int
                            //          name_var = 0, 1, 2, ... n
                            //     b -  название переменной из типа MultiLayerPerceptron (описаны ниже)
                            //     c -  размерность массивов внутри типа MultiLayerPerceptron (берётся по максимальному)
int
    x     = 0,             // Переменная х будет использована как простая переменная, но - МАССИВ
    y     = 1,             // Переменная y будет использована как простая переменная, но - МАССИВ
    z     = 2,             // Переменная z переведена из типа INT в тип DOUBLE, и - МАССИВ
    mass  = 3,             // - МАССИВ
    mass1 = 4;             // - МАССИВ

При этом переменные, которым в C++ присваиваются типы my_struct здесь описываются как имена целых переменных:

my_struct var_1;    // Описание С++
my_struct var_2;    // Описание С++

static int var_1 = 0;      // Описание MQL-4
static int var_2 = 1;      // Описание MQL-4

Причем и имена переменных типа my_struct и внутреструктурные переменные (x, y, z, mass, mass1) приходится описывать на глобальном уровне всей программы и потом следьить за их неизменностью.

А обращение к внутриструктурным переменным идёт через обращение к массиву:

my_struct[var_1][x][0] = 10.0;

Не очень, конечно удобно, а что делать. И переменные x, y, z, не смотря на то, что они используются как простые переменные, приходится описывать как массив, а потом исаользовать только одну ячейку из этого массива [0].

Вроде бы в MQL-5 собираюся реализовывать структуры. Посмотрим.

 

С указателями на подмассивы - нужно поэкспериментировать.

Идея хорошая.

 

Можно задать одномерный строковый массив.

Второе измерение массива загоняем в строки путем преобразования. Размер каждого элемента известен.

После этого организовываем работу со строкой, как со вторым измерением массива.

Единственное ограничение - размер строки.

Если необходимо увеличить (уменьшить) второе измерение, то добавляем (удаляем) в строку дополнительные элементы второго измерения, преобразованные в строковую переменную. Примерно так сделал в WSH (Windows script host). Там вообще нельзя создавать многомерные массивы. А вот таким способом получилось сделать многомерный массив. И он нормально работает.

 
nen:

Можно задать одномерный строковый массив.

Второе измерение массива загоняем в строки путем преобразования. Размер каждого элемента известен.

Работа со строковым типом достаточно сильно тормозит машину.

Будет ли в при этом реальная экономия - память/время? Не получится ли - желая сэкономим память - убиваем скорость?.

 
Kadet:

Работа со строковым типом достаточно сильно тормозит машину.

Будет ли в при этом реальная экономия - память/время? Не получится ли - желая сэкономим память - убиваем скорость?.

Это уже о другом разговор.

Первоначальная задача была - изменение второго измерения массива.

Причина обращения: