|
Arreglos dinámicos
Copyright © 2000 Ernesto
De Spirito
Los arreglos dinámicos son arreglos que pueden crecer o achicarse en
tiempo de ejecución para acomodar más o menos elementos. La declaración
de un arreglo dinámico es parecida a la de un arreglo estático, excepto
que el rango de índices se omite. Por ejemplo:
var
a: array of integer;
Un arreglo dinámico inicialmente no tiene elementos. Puede usar el
procedimiento SetLength en su código para asignar el número de elementos
que necesita. Puede llamar a SetLength tantas veces como sea necesario.
Si la nueva longitud es mayor que el número actual de elementos, se
agrega espacio para nuevos elementos, y si es menor entonces los últimos
elementos del arreglo son descartados.
Por ejemplo SetLength(a, 10) asigna espacio para 10 elementos. Los
elementos en un arreglo dinámico se indexan comenzando por 0 hasta uno
menos que la longitud del arreglo, así que por ejemplo el siguiente
código se puede usar para inicializar los elementos de un arreglo en
cero:
for i := 0 to Length(a)-1 do
a[i] := 0;
En el ejemplo adjunto a este artículo verá
el uso de un arreglo dinámico para guardar los nombres de los archivos en un
directorio. Naturalmente, una lista de cadenas (stringlist) sería
mejor para la tarea, pero se usó un arreglo dinámico por propósitos pedagógicos.
Arreglos dinámicos multidimensionales
Un arreglo dinámico dos dimensiones puede declararse así:
var
a: array of array of integer;
De esta forma podrá asignar ambas dimensiones en tiempo de ejecución. El
procedimiento SetLength admite tantos
parámetros NewLength (nueva longitud) como dimensiones. Por
ejemplo SetLength(a, 10, 10) establecería un arreglo cuadrado
de 10 x 10.
Un cosa interesante es que en vez de ver el arreglo como una matriz (es
decir rectangular) puede verse como un vector de vectores que no necesariamente
tienen que tener el mismo número de elementos. Por ejemplo el siguiente código
crea un arreglo triangular e inicializa sus elementos con números
consecutivos:
k := 0;
SetLength(a, 4); // 4 filas
for i := 0 to 3 do begin // Por cada fila
SetLength(a[i], i + 1); // Establece el número de columnas
for j := 0 to i do begin // Inicializa la fila
a[i,j] := k;
inc(k);
end;
end;
0 1 2 3
+---+
0 | 0 |
+---+---+
1 | 1 | 2 |
+---+---+---+
2 | 3 | 4 | 5 |
+---+---+---+---+
3 | 6 | 7 | 8 | 9 |
+---+---+---+---+
|