数组测量
数组的主要特性之一就是其大小,即其中的元素数量。务必要注意的是,对于多维数组,其大小是所有其维度的长度的乘积。
对于 fixed 数组,可以在编译阶段使用基于 sizeof 运算符的语言句法结构计算其大小:
sizeof(array) / sizeof(type) |
其中,array 是标识符,而 type 是数组类型。
例如,如果在 fixed 代码中定义了一个数组:
int fixed[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}}; |
则其大小为:
int n = sizeof(fixed) / sizeof(int); // 8 |
对于动态数组,此规则不适用,因为 sizeof 运算符为其生成的大小始终是内部动态数组对象的大小:52 字节。
请注意,在所有函数中,所有数组参数在内部均表示为动态数组包装器对象。这样做是为了让采用任何内存分配方法的数组(包括固定大小数组)都能被传递至函数。这就是 sizeof(array) 将为数组参数返回 52 的原因,即使通过该参数传递了一个固定大小数组。
“包装器”的存在仅影响 sizeof。ArrayIsDynamic 函数始终正确确定通过数组参数传递的实际自变量的类别。
要在程序执行阶段获取任何数组的大小,使用 ArraySize 函数。
int ArraySize(const void &array[])
该函数返回数组中的元素总数。数组可以是任意类型、任意维度。对于一维数组,该函数调用类似于 ArrayRange(array, 0)(参见下文)。
如果数组分配有保留部分( ArrayResize 函数的第三个参数),则其值不纳入考虑。
使用 ArrayResize 为动态数组分配了内存之前,ArraySize 函数将返回 0。同样,在为该数组调用了 ArrayFree 之后,大小也会变为零。
int ArrayRange(const void &array[], int dimension)
ArrayRange 函数返回指定数组维度中的元素数量。数组可以是任意类型、任意维度。dimension 参数必须在 0 和数组维度数量减 1 之间。索引 0 对应于第一维度,索引 1 对应于第二维度,以此类推。
ArrayRange(array, i) 所有值的乘积(其中 i 遍历所有维度)等于 ArraySize(array)。
我们看看上述函数的示例(参见 ArraySize.mq5 文件)。
void OnStart()
|