初始化和填充数组

只有固定大小数组才能使用初始化列表进行描述。仅当由函数 ArrayResize为数组分配了内存之后,才能填充动态数组。使用 ArrayInitializeArrayFill 函数填充数组。若要批量替换 fixed 数组或时间序列中的值,也可以在程序中使用这两个函数。

函数的使用示例在其说明之后提供。

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)

该函数以指定值填充整个或部分数字数组。具体的数组部分由参数 startcount 指定,分别表示元素的初始编号以及要填充的元素数量。

无论数组元素的编号顺序是否 与时间序列中 设置的一致,均不影响该函数:该属性被忽略。换言之,一个数组的元素始终从其开头到末尾计数。

对于多维数组,要获取 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