数组测量

数组的主要特性之一就是其大小,即其中的元素数量。务必要注意的是,对于多维数组,其大小是所有其维度的长度的乘积。

对于 fixed 数组,可以在编译阶段使用基于 sizeof 运算符的语言句法结构计算其大小:

sizeof(array) / sizeof(type)

其中,array 是标识符,而 type 是数组类型。

例如,如果在 fixed 代码中定义了一个数组:

int fixed[][4] = {{1234}, {5678}};

则其大小为:

int n = sizeof(fixed) / sizeof(int); // 8

对于动态数组,此规则不适用,因为 sizeof 运算符为其生成的大小始终是内部动态数组对象的大小:52 字节。

请注意,在所有函数中,所有数组参数在内部均表示为动态数组包装器对象。这样做是为了让采用任何内存分配方法的数组(包括固定大小数组)都能被传递至函数。这就是 sizeof(array) 将为数组参数返回 52 的原因,即使通过该参数传递了一个固定大小数组。
 
“包装器”的存在仅影响 sizeofArrayIsDynamic 函数始终正确确定通过数组参数传递的实际自变量的类别。

要在程序执行阶段获取任何数组的大小,使用 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()
{
   int dynamic[];
   int fixed[][4] = {{1234}, {5678}};
   
   PRT(sizeof(fixed) / sizeof(int));   // 8
   PRT(ArraySize(fixed));              // 8
   
   ArrayResize(dynamic10);
   
   PRT(sizeof(dynamic) / sizeof(int)); // 13 (incorrect)
   PRT(ArraySize(dynamic));            // 10
   
   PRT(ArrayRange(fixed0));          // 2
   PRT(ArrayRange(fixed1));          // 4
   
   PRT(ArrayRange(dynamic0));        // 10
   PRT(ArrayRange(dynamic1));        // 0
   int size = 1;
   for(int i = 0i < 2; ++i)
   {
      size *= ArrayRange(fixedi);
   }
   PRT(size == ArraySize(fixed));      // true
}