Pascal/Turbo Pascal - Arrays dinamicos ??

 
Vista:

Arrays dinamicos ??

Publicado por Frange (3 intervenciones) el 19/12/2006 16:07:43
No estoy muy seguro, pero en pascal no se pueden hacer arrays dinamicos no ? y que solucion hay al respecto ? y como se hace ?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Arrays dinamicos ??

Publicado por Lucia Vilar (17 intervenciones) el 19/12/2006 16:13:18
Si se pueden hacer dinámicos, pero se hace a través de listas y punteros, así la lista (array dinámico) irá "creciendo" siempre y cuando el puntero siguiente sea distinto de "NIL".
Espero ayudarte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Arrays dinamicos ??

Publicado por Diego Romero (996 intervenciones) el 19/12/2006 18:35:20
Pues si hablamos de Pascal estandar extendido, como lo es Turbo Pascal, no existen los arrays dinámicos. A pesar de lo que dice Lucia. Ella se refiere a listas dinámicas pero esas no son arrays (ya que no tienen índices).

Ahora bien, si pasamos a Object Pascal (Delphi, FreePascal), entonces sí tenemos arrays dinámicos. Y se declaran así:

var
A: array of <tipo>;

Para luego usarlos con:

begin
SetLength(A, 20); { aquí asignamos 20 posiciones }
...

Todos los arrays dinámicos están indexados por un integer comenzando en la posición cero (en el ejemplo, el índice va de cero a 19). Hay que tener cuidado con las asignaciones entre arrays dinámicos distintos ya que como internamente trabaja con punteros a memoria puede resultar en cosas inesperadas, por ejemplo:

var
A, B: array of integer;
begin
SetLength(A, 20);
A[0]:=1;
B:=A;
B[0]:=2;
end.
Aquí al final del programa A[0] *ahora vale 2*; se debe a que cuando se hace la asignación de un array a otro en realidad lo que internamente sucede es que hay dos punteros que apuntan a la misma región de memoria, o sea, cambiar algo en uno es lo mismo que cambiarlo en los dos al mismo tiempo.

Sin embargo:
var
A, B: array of integer;
begin
SetLength(A, 20);
SetLength(B, 20);
A[0]:=1;
B[0]:=1;

Funciona como en los arrays clásicos hasta que...

if A = B then WriteLn('Son iguales.')
else WriteLn('No son iguales);

Aparentemente ambos arrays son iguales pero no es así pues cuando se usa el identificador del array en realidad se está comparando el puntero a la región de memoria. En el if prescedente la respuesta es siempre false, o sea, siempre va por el else. Cosa que no ocurriría con arrays estáticos.

Por último, hay que tener cuidado con las asignaciones fuera de rango.
En los arrays estáticos algo como esto:
var
A: Array[1..10] of integer;
var
A[11]:=0;
...

Saltará en error ("index out of range"). Pero el mismo caso con arrays dinámicos...

var
A: Array of integer;
var
SetLength(A,10);
A[10]:=0; { recuérdese que los índices de los arrays dinámicos comienzan en cero }
...

No reportará error pero el valor NO será almacenado como parte del array (irá a parar donde sea que caiga el puntero a esa posición en el array que bien puede ser una posición de memoria ocupada por otra variable.
...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Arrays dinamicos ??

Publicado por Frange (3 intervenciones) el 19/12/2006 19:26:51
Muchisimas gracias, ya voy encaminando un trabajo que tengo, pero tengo una pequeña duda mas, a ver si sabeis:

kiero pedir al usuario un numero, y luego usar ese numero para poner datos en un array, (eso lo se hacer) el problema esq si en vez de introducir un numero, pongo una letra y al ser INTEGER la variable se sale del programa con error. Como lo hago ?

Uso el freepascal.

Gracias a los 2, la verdad esq antes de haber visto vuestras respuestas lo habia conseguido lo de los arrays dinamicos a traves del foro otro mensaje q habia q no entendia bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Arrays dinamicos ??

Publicado por Diego Romero (996 intervenciones) el 20/12/2006 04:57:07
En vez de un integer usa un string y luego usa Val() para hacer la conversión de tipos, Val() te informa si lo pudo hacer, si no, puedes usar su valor de retorno para informar al usuario.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar