Está en la página 1de 21

Arreglos Dinámicos

 Sintaxis : array of baseType


 Ejemplo :
var MiArreglo: array of Real;

 La declaración no reserva memoria. Para hacerlo


utilice SetLength.
 Ejemplo:

SetLength(MiArreglo, 20);
Aloca un arreglo de 20 reales indexados de 0 a 19.
 Los arreglos dinámicos siempre tienen índices enteros
y comienzan en cero.
Arreglos Dinámicos
 Utilizan el mismo método del contador de
referencia de los LongString.
 Para desalocar un arreglo dinámico hay que
asignar el valor nil a la variable que lo
referencia.
 Los arreglos dinámicos de longitud cero
tienen el valor nil.
 No aplique el operador ^ a la variable que
maneja el arreglo dinámico ni la pase como
parámetro de los procedure New o Dispose.
Arreglo Dinámico
 Funciones
 Length retorna la cant.de elementos del
arreglo.
 High retorna el índice más alto del
arreglo (Length – 1)
 Low retorna 0.

¿Qué devuelve si el arreglo


está vacío?
Ejemplo
 Desarrolle una aplicación de consola que
permita asignar una secuencia números
enteros en un arreglo dinámico.
 La cantidad de números a ingresar es
conocida sólo en ejecución.
Var vec : array of Integer;
i, cant :integer;
begin
write('¿Cuántos enteros va a leer?');
readln(cant);
SetLength(Vec,cant); //reserva memoria
for i:= 0 to cant-1 do readln(Vec[i]);
writeln('Los números ingresados son:');
for i:= 0 to High(Vec) do
writeln(Vec[i]);
Vec := nil; //Libera memoria
end.
Ejemplo
 Desarrolle una aplicación de consola que
permita asignar una secuencia de números
enteros terminada en 0 en un arreglo
dinámico.
Var i, nro : Integer;
Numeros : array of integer;
begin
readln(nro);
while (nro<>0) do begin
// reservar lugar para uno mas
setLength(Numeros, Length(Numeros)+1);
// guardarlo en el arreglo
Numeros[High(Numeros)] := nro;
readln(nro);
end;
for i:= Low(Numeros) to High(Numeros) do
writeln(Numeros[i]);
Numeros := nil;
end.
DimArray1.dpr
Arreglos Dinámicos
 Si X e Y son variables del mismo tipo de arreglo
dinámico, la asignación
X := Y
hará que X apunte al mismo arreglo que Y. No
será necesario reservar memoria para X ya que se
compartirá el arreglo.
 A diferencia de los arreglos estáticos, los arreglos
dinámicos no son duplicados antes de ser
copiados.
Arreglos Dinámicos
 Ejemplos
Var A, B: array of Integer;
begin
SetLength(A, 1);
A[0] := 1;
B := A;
B[0] := 2;
end;

 Al terminar el valor de A[0] es 2. Note que si A y


B fueran arreglos estáticos, A[0] valdría 1.
Copia de Arreglos Dinámicos
 Ejemplo
Var A, B: array of Integer;
begin
SetLength(A, 1);
A[0] := 1;
B := copy(A, Low(A), Length(A));
B[0] := 2;
end;

 Al terminar el valor de A[0] es 1 porque B no


comparte memoria con A.
Arreglos Dinámicos
 Las asignaciones realizadas al arreglo no
cambian su dimensión.

 Ej: MiArreglo[2] := 7 no lo
convierte en un arreglo de 3 elementos.

 Los chequeos de rango no son verificados


en compilación.
Arreglos Dinámicos
 Cuando se comparan dos arreglos dinámicos, se comparan
sus referencias no el valor de los arreglos
Var A, B: array of Integer;
begin
SetLength(A, 1);
SetLength(B, 1);
A[0] := 2;
B[0] := 2;
end;
 A = B retorna False pero A[0] = B[0] retorna True.
Arreglos como parámetros
 En algunos módulos los arreglos son pasados
como parámetro sin especificar el tipo de índices
que utiliza
function CheckStrings(A: array of string): Boolean;

 Esto indica que la función opera con todos los


arreglos del tipo base especificado sin importar su
tamaño, cómo ha sido indexada o si es dinámica o
estática.
Arreglos como parámetros
 Ejemplo

procedure Clear(var A: array of Real);


var I: Integer;
begin
for I := 0 to High(A) do
A[I] := 0;
end;
Arreglos como parámetros
 Ejemplo
function Sum(const A: array of Real): Real;
Var I: Integer;
S: Real;
begin
S := 0;
for I := 0 to High(A) do
S := S + A[I];
Sum := S;
end;
Arreglos dinámicos multidimensionales

 Para declarar arreglos dinámicos de varias


dimensiones utilice iterativamente la contrucción
array of ...
 Ejemplo:
type TMessageGrid = array of array of string;
var Msgs: TMessageGrid;

declara un arreglo de strings de dos dimensiones.


Arreglos dinámicos multidimensionales

 Para inicializar este tipode arreglos llame al


proceso SetLength con tantos argumentos
enteros como dimensiones tenga el arreglo.
 Ejemplo: Si Msgs es un arreglo de dos
dimensiones e I y J son variables enteras,
SetLength(Msgs,I,J);
aloca un arreglo de IxJ elementos y
Msgs[0,0] denota un elemento del arreglo.
Ejercicio
 Defina una matriz dinámica que permita
almacenar esta estructura
43 23 12.12 65.1 76
12.45 0.45 10 98 54.8
-89 1 60 21.3 27.3

Var Matriz : array of array of real;


Begin
//reserva de memoria ¿Qué índices le
corresponde?
setLength(Matriz,3,5)
Arreglos dinámicos multidimensionales
 Se pueden crear arreglos multimensionales que no
sean rectangulares.
 Ejemplo:
var Ints: array of array of Integer;
 Usando SetLength(Ints,10); aloca 10 filas
pero ninguna columna.
 Luego se le puede dar el tamaño a cada fila
reservando diferente número de columnas.
 Ejemplo:
SetLength(Ints[2], 5);
 Reserva memoria para 5 elementos en la fila 3.
¿Qué hace?
var
A : array of array of string;
I, J : Integer;
begin
SetLength(A, 10);
for I := Low(A) to High(A) do
begin
SetLength(A[I], I);
for J:= Low(A[I]) to High(A[I]) do
A[I,J]:=IntToStr(I)+','+IntToStr(J);
end;
end;
El programa anterior sólo reserva memoria
para los elementos pintados de amarillo
Fila 0
1,0
2,0 2,1
3,0 3,1 3,2
4,0 4,1 4,2 4,3
5,0 5,1 5,2 5,3 5,4
6,0 6,1 6,2 6,3 6,4 6,5
7,0 7,1 7,2 7,3 7,4 7,5 7,6
8,0 8,1 8,2 8,3 8,4 8,5 8,6 8,7
Fila 9 9,0 9,1 9,2 9,3 9,4 9,5 9,6 9,7 9,8

También podría gustarte