Inicializar y rellenar arrays
Describir un array con una lista de inicialización sólo es posible para arrays de tamaño fijo. Los arrays dinámicos sólo pueden poblarse después de asignarles memoria mediante la función ArrayResize. Se rellenan con las funciones ArrayInitialize o ArrayFill, que también son útiles en un programa cuando se desea reemplazar valores en bloque en arrays fijos o series temporales.
Tras la descripción de las funciones se ofrecen ejemplos de uso de las mismas.
int ArrayInitialize(type &array[], type value)
La función establece todos los elementos del array en el valor especificado. Sólo se admiten arrays de tipos numéricos integrados (char, uchar, short, ushort, int, uint, long, ulong, bool, color, datetime, float, double). Los arrays de cadenas, estructuras y punteros no pueden rellenarse de esta forma: tendrán que implementar sus propias funciones de inicialización. Un array puede ser multidimensional.
La función devuelve el número de elementos.
Si el array dinámico se asigna con una reserva (el tercer parámetro de la función ArrayResize), entonces la reserva no se inicializa.
Si, una vez inicializado el array, se aumenta su tamaño mediante ArrayResize, los elementos añadidos no se ajustarán automáticamente a value. Pueden rellenarse con la función ArrayFill.
void ArrayFill(type &array[], int start, int count, type value)
La función rellena un array numérico o parte de él con un valor especificado. Parte del array viene dado por los parámetros start y count, que indican el número inicial del elemento y el número de elementos que se van a rellenar, respectivamente.
A la función no le importa si se establece el orden de numeración de los elementos del array como en series temporales o no: esta propiedad se ignora. En otras palabras: los elementos de un array se cuentan siempre desde su principio hasta su final.
Para un array multidimensional, el parámetro start puede obtenerse convirtiendo las coordenadas en todas las dimensiones en un índice de paso para un array unidimensional equivalente. Así, para un array bidimensional, los elementos con el índice 0 en la primera dimensión se ubican primero en memoria, después estarán los elementos con el índice 1 en la primera dimensión, y así sucesivamente. La fórmula para calcular start es la siguiente:
start = D1 * N2 + D2 |
donde D1 y D2 son los índices de la primera y segunda dimensión, respectivamente, y N2 es el número de elementos de la segunda dimensión. D2 pasa de 0 a (N2-1), D1 pasa de 0 a (N1-1). Por ejemplo, en un array array[3][4], el elemento con índices [1][3] es el séptimo de una fila, por lo que la llamada ArrayFill(array, 7, 2, ...) llenará dos elementos:array[1][3] y a continuación array[2][0]. En el diagrama, esto puede representarse de la siguiente manera (cada celda contiene un índice de paso del elemento):
[][0] [][1] [][2] [][3]
|
El script ArrayFill.mq5 proporciona ejemplos de uso de las funciones mencionadas.
void OnStart()
|
A continuación se muestra un posible resultado (los datos aleatorios en elementos no inicializados de un array dinámico serán diferentes):
ArrayInitialize(fixed,-1)=8
|