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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Yury Kirillov
5298
Yury Kirillov  

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

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

Artyom Trishkin
Модератор
52871
Artyom Trishkin  
Yury Kirillov:

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

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

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

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

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

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

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;
Sergey Rashevskiy
2769
Sergey Rashevskiy  
Создаёшь одномерный массив из объектов, в которых только одна переменная - одномерный динамический массив.
Dmitry Fedoseev
56770
Dmitry Fedoseev  
Yury Kirillov:

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

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

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

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

struct SS{
   double b[];
};

SS a[];

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

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

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

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

Igor Makanu
9535
Igor Makanu  
Seric29:

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

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

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

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

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

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

Seric29
765
Seric29  
Igor Makanu:

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

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

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

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

table1[],table2[];

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

Igor Makanu
9535
Igor Makanu  
Seric29:

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

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

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

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

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


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

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