¿Cómo especificar el tamaño de un arreglo en tiempo de ejecución?

Arreglos dinámicos

Copyright © 2000 Ernesto De Spirito

Boycott Trend Micro!

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 |
      +---+---+---+---+
JfControls Library - para Delphi y C++ Builder