Размерность многомерных динамических массивов через ArrayResize

 

Добрый день.

Такой вопрос волнует: как использовать ArrayResize для двумерных динамических массивов? Функция выделяет память под первое измерение, а как выделить память под второе тоже? В документации ничего такого не нашла про это.

Пример кода:

input int a;
input int b;
...
int array[][];
...
OnInit(...)

{
        ArrayResize(array, a);
        //как тут выделить память под размер a, b?)
        ...
}
 
Olga Miakhovich:

Добрый день.

Такой вопрос волнует: как использовать ArrayResize для двумерных динамических массивов? Функция выделяет память под первое измерение, а как выделить память под второе тоже? В документации ничего такого не нашла про это.

Пример кода:

'[' - invalid index value

Нельзя у них многомерные динамические массивы. Только первое измерение доступно. Изобретайте свой велосипед.

 
Vladimir Simakov:

Нельзя у них многомерные динамические массивы. Только первое измерение доступно. Изобретайте свой велосипед.

Все велосипеды уже давно тут изобретены. Причём в стандартной поставке.

 
Olga Miakhovich:

Добрый день.

Такой вопрос волнует: как использовать ArrayResize для двумерных динамических массивов? Функция выделяет память под первое измерение, а как выделить память под второе тоже? В документации ничего такого не нашла про это.

Пример кода:

второе измерение нужно определить сразу

например:

input int a;
...
int array[,5];
...
OnInit(...) {          ArrayResize(array, a);
        //как тут выделить память под размер a, b?)
        ...
}

по первому измерению увеличится

ну и размер массива чтобы узнать, делим  в данном случае общий размер на 5

смысл в том, что у таблицы обычно количество колонок постоянно
 
Artyom Trishkin:

Все велосипеды уже давно тут изобретены. Причём в стандартной поставке.

Ну так подскажите Ольге. Я так и не нашел с ходу, оно конечно и не особо искал... Может соберусь и свое изображу когда-нибудь. Правда пока не нужно ни разу было.
 
Самый простой способ - сделать одномерный массив длиной n*m и вместо a[i][j] использовать a[i+j*m]
 
Aleksey Nikolayev:
Самый простой способ - сделать одномерный массив длиной n*m и вместо a[i][j] использовать a[i+j*m]
где n?
 
Vladimir Simakov:
Ну так подскажите Ольге. Я так и не нашел с ходу, оно конечно и не особо искал... Может соберусь и свое изображу когда-нибудь. Правда пока не нужно ни разу было.

Здесь пример создания двумерного массива.

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

В примере не показана возможность управления элементами массива в каждом измерении, но почитав описания методов класса, можно и догадаться - там всё несложно.

Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
  • www.mql5.com
Класс CArrayObj обеспечивает возможность работы с динамическим массивом указателей на экземпляры класса CObject и его наследников. Это дает возможность работы как с многомерными динамическими массивами примитивных типов данных, так и с более сложно организованными структурами данных. В классе реализованы возможности добавления/вставки/удаления...
 
Renat Akhtyamov:
где n?

Опечатался, если 0<=i<n, 0<=j<m, то a[i][j]=a[i+j*n]

 
Aleksey Nikolayev:

Опечатался, если 0<=i<n, 0<=j<m, то a[i][j]=a[i+j*n]

ок

в принципе, форум завален решениями по этому вопросу

мне лично понравились структуры

но я пользуюсь тем, что написал выше
 
Artyom Trishkin:

Здесь пример создания двумерного массива.

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

В примере не показана возможность управления элементами массива в каждом измерении, но почитав описания методов класса, можно и догадаться - там всё несложно.

Мдя. Тот же доступ к элементу:
arr.At(i).At(ii).At(iii).At(iv) - а что, оператор [] переопределить не судьба?
Чувствую, из коробки красивого решения не будет. Возьмусь наверное, запилю путную реализацию, благо давно хотел.