Скачать MetaTrader 5

Как задать размер второму измерению массива по условию?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Изучаешь MQL5? Начни с документации!
VANDER
33
VANDER 2014.08.05 20:06 

Собсно сабж, сегодня чуть голову себе не сломал, выход нашел корявый: создал 2 массива с разными размерами, по условию выбираю между ними, но эт конечно извращение)

Пример:

input int X=0;              //имееется входная переменная

if (X==0)                   //если выполняется условие     

   int Mass[][10]           //инициализируем динамический массив с определенным размером 2 измерения

else                        //если не выполняется

   int Mass[][100]          //с другим размером
Понятно, что массив инициализируется в пределах блока if, как инициализировать его в идеале на глобальном уровне? Переменными 2 измерение задать нельзя, ArrayResize канает только для 1-го измерения,  #define SIZE тоже по условию не задать только жестко цифрой. Подскажите!
Stanislav Korotky
17940
Stanislav Korotky 2014.08.05 20:26  
MQL поддерживает динамический ресайз массива только по первой размерности. Если нужно что-то более сложное типа вектора векторов, нужно применять ООП, например, на основе CArrayObj.
Sergey Chalyshev
4513
Sergey Chalyshev 2014.08.05 21:32  

Массив структур должен помочь.

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

struct Mass { double dim2[]; }; // сама структура
Mass dim1[];                    // массив структур

input int size_dim1 = 10;  // задаем необходимую первую размерность
input int size_dim2 = 100; // задаем необходимую вторую размерность
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayResize(dim1,size_dim1);          // изменяем первуюразмерность 
   for(int i=0; i<size_dim1; i++)
   ArrayResize(dim1[i].dim2,size_dim2);  // изменяем вторую размерность
  }
//+------------------------------------------------------------------+
dim1[3].dim2[5]=102.34; // пример использования
VANDER
33
VANDER 2014.08.06 03:13  
marketeer:
MQL поддерживает динамический ресайз массива только по первой размерности. Если нужно что-то более сложное типа вектора векторов, нужно применять ООП, например, на основе CArrayObj.
ох, старался не касаться этих классов 15-ти метровой палкой, видимо придется все-таки рано или поздно изучать)
VANDER
33
VANDER 2014.08.06 03:25  
Serj_Che:

Массив структур должен помочь.

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

Значит простых решений нет) Можно прокомментировать код?)
Sergey Chalyshev
4513
Sergey Chalyshev 2014.08.06 08:55  
VANDERRR:
Значит простых решений нет) Можно прокомментировать код?)
куда же проще) прокомментировал.
VANDER
33
VANDER 2014.08.06 09:10  
Serj_Che:
куда же проще) прокомментировал.
Прост сначала немного запутался) потом прочитал про структуры и в принципе понял, ваши комментарии подтвердили догадки, получается какбэ массив массивов) Спасибо, применю ваше решение!
Dmitry Fedoseev
42924
Dmitry Fedoseev 2014.08.06 13:49  

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

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

Sergey Chalyshev
4513
Sergey Chalyshev 2014.08.06 13:58  
Integer:

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

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

Да, можно и с одним большим массивом обойтись, умножая первую размерность на вторую.

Со структурой удобнее, у меня такой вариант без проблем работает. И еще преимущества есть, можно искать максимумы минимумы с помощью стандартных функций. 

VANDER
33
VANDER 2014.08.06 17:24  
Кстати, скорость обработки массива структур просто в разы быстрее чем одного массива с аналогичными по размеру измерениями, что собсно говоря и вынудило меня задать этот вопрос, программа заметно теряла в скорости при увеличении размера 2-го измерения
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий