初始化和填充数组
只有固定大小数组才能使用初始化列表进行描述。仅当由函数 ArrayResize为数组分配了内存之后,才能填充动态数组。使用 ArrayInitialize 或 ArrayFill 函数填充数组。若要批量替换 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)
该函数以指定值填充整个或部分数字数组。具体的数组部分由参数 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]
|
ArrayFill.mq5 脚本提供了前述函数的用法示例。
void OnStart()
|
可能结果如下所示(动态数组的未初始化元素中的随机数据将有所不同):
ArrayInitialize(fixed,-1)=8
|