Инициализация и заполнение массивов

Описание массива со списком инициализации возможно только для массивов фиксированного размера. Динамические массивы можно заполнить только после выделения под них памяти функцией ArrayResize. Заполнение делается с помощью функций ArrayInitialize или ArrayFill. Они также пригодятся в программе, когда требуется массово заменить значения в фиксированных массивах или временных рядах.

Примеры использования функций приведены после их описания.

int ArrayInitialize(type &array[], type value)

Функция устанавливает всем элементам массива указанное значение. Поддерживаются только массивы встроенных числовых типов (char, uchar, short, ushort, int, uint, long, ulong, bool, color, datetime, float, double). Массивы строк, структур, указателей так заполнить нельзя: для них потребуется реализовать собственные функции инициализации. Массив может быть многомерным.

Функция возвращает количество элементов.

Если динамический массив распределен с резервом (третий параметр функции ArrayResize), то резерв не инициализируется.

Если после инициализации массива его размер будет увеличен с помощью ArrayResize, добавленные элементы не установятся автоматически в значение value. Их можно заполнить с помощью функции ArrayFill.

void ArrayFill(type &array[], int start, int count, type value)

Функция заполняет числовой массив или его часть указанным значением. Часть массива задается параметрами start и count, которые обозначают, соответственно, начальный номер элемента и количество элементов, подлежащих заполнению.

Для функции не имеет значения, установлен ли порядок нумерации элементов массива как в таймсерии или нет: данное свойство игнорируется. Иными словами, элементы массива всегда считаются от его начала к концу.

Для многомерного массива параметр start может быть получен путем пересчета координат по измерениям в сквозной индекс для эквивалентного одномерного массива. Так, для двумерного массива в памяти сперва располагаются элементы с 0-м индексом по первому измерению, потом элементы с индексом 1 по первому измерению, и так далее. Формула для вычисления start выглядит так:

start = D1 * N2 + D2

где D1 и D2 — соответственно, индексы по первому и второму измерению, N2 — количество элементов по второму измерению. D2 меняется от 0 до (N2-1), D1 — от 0 до (N1-1). Например, в массиве array[3][4] элемент с индексами [1][3] является седьмым по счету, и потому вызов ArrayFill(array, 7, 2, ...) заполнит два элемента: array[1][3] и следующий за ним array[2][0]. На схеме это можно изобразить следующим образом (в каждой ячейке приведен сквозной индекс элемента):

      [][0]  [][1]  [][2]  [][3]
[0][]    0      1      2      3
[1][]    4      5      6      7
[2][]    8      9     10     11

В скрипте ArrayFill.mq5 представлены примеры использования функций.

void OnStart()
{
   int dynamic[];
   int fixed[][4] = {{1234}, {5678}};
   
   PRT(ArrayInitialize(fixed, -1));
   ArrayPrint(fixed);
   ArrayFill(fixed34, +1);
   ArrayPrint(fixed);
   
   PRT(ArrayResize(dynamic1050));
   PRT(ArrayInitialize(dynamic0));
   ArrayPrint(dynamic);
   PRT(ArrayResize(dynamic50));
   ArrayPrint(dynamic);
   ArrayFill(dynamic10400);
   ArrayPrint(dynamic);
}

Вот как выглядит возможный результат (случайные данные в неинициализированных элементах динамического массива будут отличаться):

ArrayInitialize(fixed,-1)=8
    [,0][,1][,2][,3]
[0,]  -1  -1  -1  -1
[1,]  -1  -1  -1  -1
    [,0][,1][,2][,3]
[0,]  -1  -1  -1   1
[1,]   1   1   1  -1
ArrayResize(dynamic,10,50)=10
ArrayInitialize(dynamic,0)=10
0 0 0 0 0 0 0 0 0 0
ArrayResize(dynamic,50)=50
[ 0]           0           0           0           0           0
               0           0           0           0           0
[10] -1402885947  -727144693   699739629   172950740 -1326090126
           47384           0           0     4194184           0
[20]           2           0           2           0           0
               0           0  1765933056  2084602885 -1956758056
[30]    73910037 -1937061701          56           0          56
               0     1048601  1979187200       10851           0
[40]           0           0           0  -685178880 -1720475236
       782716519 -1462194191  1434596297   415166825 -1944066819
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0