Medición de arrays

Una de las principales características de un array es su tamaño, es decir, el número total de elementos que lo componen. Es importante tener en cuenta que, para los arrays multidimensionales, el tamaño es el producto de las longitudes de todas sus dimensiones.

Para arrays fijos, puede calcular su tamaño en la fase de compilación utilizando la siguiente construcción del lenguaje basada en operadores sizeof:

sizeof(array) / sizeof(type)

donde array es un identificador y type es el tipo de array.

Por ejemplo, si se define un array en el código fixed:

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

entonces su tamaño es:

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

Para arrays dinámicos, esta regla no funciona, ya que el operador sizeof siempre genera el mismo tamaño del objeto array dinámico interno: 52 bytes.

Tenga en cuenta que en las funciones, todos los parámetros de array se representan internamente como objetos envoltorio de array dinámicos. Esto se hace para que se pueda pasar a la función un array con cualquier método de asignación de memoria, incluido uno fijo. Por eso sizeof(array) devolverá 52 para el array de parámetros, aunque se le haya pasado un array de tamaño fijo.
 
La presencia de «envoltorios» sólo afecta a sizeof. La función ArrayIsDynamic siempre determina correctamente la categoría del argumento real pasado a través del array de parámetros.

Para obtener el tamaño de cualquier array en la fase de ejecución del programa, utilice la función ArraySize.

int ArraySize(const void &array[])

La función devuelve el número total de elementos del array. La dimensión y el tipo de array pueden ser cualesquiera. Para un array unidimensional, la llamada a la función es similar a ArrayRange(array, 0) (véase más abajo).

Si el array se distribuyó con una reserva (el tercer parámetro de la función ArrayResize), su valor no se tiene en cuenta.

Hasta que se asigne memoria para el array dinámico utilizando ArrayResize, la función ArraySize devolverá 0. Además, el tamaño pasa a ser cero después de llamar a ArrayFree para el array

int ArrayRange(const void &array[], int dimension)

La función ArrayRange devuelve el número de elementos de la dimensión de array especificada. La dimensión y el tipo de array pueden ser cualesquiera. El parámetro dimension debe estar comprendido entre 0 y el número de dimensiones del array menos 1. El índice 0 corresponde a la primera dimensión, el índice 1 a la segunda, y así sucesivamente.

El producto de todos los valores de ArrayRange(array, i) con i ejecutándose en todas las dimensiones da ArraySize(array).

Veamos los ejemplos de las funciones descritas anteriormente (véase el archivo 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
}