Как сделать динамический двумерный массив? То есть массив, обе размерности которого будут изменяться динамически.

 

Как делать одномерный динамический массив понятно. Понятно как делать динамический многомерный массив (в котором динамически изменяется первое измерение).

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

 
Yury Kirillov:

Как делать одномерный динамический массив понятно. Понятно как делать динамический многомерный массив (в котором динамически изменяется первое измерение).

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

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

https://www.mql5.com/ru/forum/3250#comment_49309

мне этот вариант больше нравится

Как создать динамический двумерный массив?
Как создать динамический двумерный массив?
  • 2011.02.23
  • www.mql5.com
Как создать динамический двумерный массив?
 

MQL5 не дает создать динамический массив более одного измерения, т.е. double arr[] , double arr[][100], double arr[][100][100] - это компилятор пропустит

можно лишь создать структуру (или класс) с обычным динамическим массивом внутри и потом создать динамический массив таких структур

примерно так:

  struct srow{double y[];}x[];
  ArrayResize(x,100);
  for(int j=0;j<ArraySize(x);j++)
     {
      ArrayResize(x[j].y,100);
     }

чтобы было удобно всем этим пользоваться нужно написать перегрузку оператора []....

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

#include <Math\Alglib\matrix.mqh>

CMatrixDouble myarr = new CMatrixDouble(100,100);
myarr[1][2] = 0.5;
 
Создаёшь одномерный массив из объектов, в которых только одна переменная - одномерный динамический массив.
 
Yury Kirillov:

Как делать одномерный динамический массив понятно. Понятно как делать динамический многомерный массив (в котором динамически изменяется первое измерение).

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

Никак, в том виде в которым вы это представляете себе.

Можно сделать массив структур, а в структуре обычный массив. Размер первого измерения (массива структур) будет легко изменить за одно действие, а вот размер второго измерения (массивов находящихся в структурах), нужно будет менять для каждого элемента отдельно.

struct SS{
   double b[];
};

SS a[];

 
Всем спасибо! Вариант со структурой для меня вполне подходит.
 
Dmitry Fedoseev:

Никак, в том виде в которым вы это представляете себе.

Можно сделать массив структур, а в структуре обычный массив. Размер первого измерения (массива структур) будет легко изменить за одно действие, а вот размер второго измерения (массивов находящихся в структурах), нужно будет менять для каждого элемента отдельно.

Может ли функция принимать разные структуры но похожего типа, имеется в виду объявить 2 структуры у каждой структуры по 2 массива функция примет любую из структур или это невозможно также возникает вопрос с типами данных шаблоны тут уже не помогут?

 
Seric29:

Может ли функция принимать разные структуры но похожего типа, имеется в виду объявить 2 структуры у каждой структуры по 2 массива функция примет любую из структур или это невозможно также возникает вопрос с типами данных шаблоны тут уже не помогут?

может, но не похожего а одинакового типа - MQL, как и С++ строго типизированный язык, т.е. обьявили тип структура (или класс) и потом создали массив таких структур - т.е. получили 2-х мерный динамический массив и передавайте по ссылке в функцию, примерно так:

struct Srow
  {
   double            arr[];
  };
Srow table1[],table2[];

void myfunc(Srow &t[])
{
   t[1].arr[1] = 10;  
}

но нужно размеры массивов установить с помощью ArrayResize() - я выше пример приводил

ЗЫ: если нет задач которым нужна максимальная производительность, я бы все таки посоветовал классом CMatrixDouble пользоваться, багов не выявлено, пользоваться удобно 

 
Igor Makanu:

может, но не похожего а одинакового типа - MQL, как и С++ строго типизированный язык, т.е. обьявили тип структура (или класс) и потом создали массив таких структур - т.е. получили 2-х мерный динамический массив и передавайте по ссылке в функцию, примерно так:

но нужно размеры массивов установить с помощью ArrayResize() - я выше пример приводил

ЗЫ: если нет задач которым нужна максимальная производительность, я бы все таки посоветовал классом CMatrixDouble пользоваться, багов не выявлено, пользоваться удобно 

1. Ваша структура содержит 2 массива типа double что значит запись 

table1[],table2[];

2. Я так понимаю что функция может принимать 1ну структуру с одним именем а если я создам пять таких структур которые будут одинаковы столько же параметров содержать но с разными именами придётся писать и разные функции под каждую структуру так что ли?

 
Seric29:

1. Ваша структура содержит 2 массива типа double что значит запись 

2. Я так понимаю что функция может принимать 1ну структуру с одним именем а если я создам пять таких структур которые будут одинаковы столько же параметров содержать но с разными именами придётся писать и разные функции под каждую структуру так что ли?

1. структура Srow - это тип

потом объявляем 2 массива table1[],table2[] типа Srow - обычные действия по описанию переменных

2. описание функции подразумевает описание типов и кол-ва передаваемых значений, в моем примере в качестве параметра передается 1 структура по ссылке, если нужно 5 перемнных, значит описание функции и должно иметь 5 параметров


ЗЫ: еще раз повторюсь, используйте CMatrixDouble  и забудьте про все эти ужасы программирования ))))