PDA

Ver la Versión Completa : problema con un array de tipos


aram2r
07-06-2005, 13:32:58
Hola tengo una laguna mental y me he bloqueado en algo como esto:
me creo un tipo 'Tfichero':

type TFichero = record
Nombre, Ruta, Fecha, tamanyo : String;
end;


creo un array de ese tipo:


Ficheros: Array of TFichero


ahora que es lo que me falta??????????? como inicializo mi array para acceder de la siguiente forma:

Ficheros[0].Nombre:='Pepe.txt'
Ficheros[0].Ruta:='c:\'
Ficheros[0].Fecha:='10/10/05'
Ficheros[0].Tamanyo:='1024'

Ficheros[1].Nombre:='Juan.txt'
Ficheros[1].Ruta:='c:\'
Ficheros[1].Fecha:='10/10/05'
Ficheros[1].Tamanyo:='1024'

etc......


como hago para que esto funcione?????

Gracias

jam
07-06-2005, 14:56:58
utiliza:
setlength(ficheros, numeroelementos)
for i:=low(ficheros) to hight(ficheros) do
begin
...
Ficheros[i].Nombre:=var_nombre;
Ficheros[i].Ruta:=var_ruta;
Ficheros[i].Fecha:=var_fecha;
Ficheros[i].Tamanyo:=vartamanyo;
...
end

aram2r
07-06-2005, 16:11:27
1- No se los ficheros que voy ha almacenar aunque bueno eso no es muy importante...pero como puedo saber el limite de memoria que puedo reservar...de momento el limite en mi equipo es alrededor de 70millones pero si lo llevo a otro equipo con menos Ram me dará error...

2- Ese SetLength, luego no tendre que liberarlo de algun modo o simplemente cuando cierre la aplicacion se libera???

3- Como puedo implementar un Count o algo parecido como por ejemplo el Lines.Count para saber cuantos elementos tengo rellenados

como se definen metodos y funciones ???

type TFichero = record
Nombre, Ruta, Fecha, tamanyo : String;
procedure HHHH(); //......Asi da error...
end;


Muxas gracias con que me des una horientacion me vendria de fabula

jachguate
07-06-2005, 17:00:34
1- No se los ficheros que voy ha almacenar aunque bueno eso no es muy importante...pero como puedo saber el limite de memoria que puedo reservar...de momento el limite en mi equipo es alrededor de 70millones pero si lo llevo a otro equipo con menos Ram me dará error...
dado que ya estas usando una arreglo dinámico, sugiero que no te preocupes por esto. Crea los elementos bajo demanda, y veo dificil que topes la memoria del ordenador, tomando en cuenta que el sistema operativo seguramente ofrezca el uso automático de memoria virtual en caso se agote la RAM.

2- Ese SetLength, luego no tendre que liberarlo de algun modo o simplemente cuando cierre la aplicacion se libera???
Si queres liberarlo explicitamente, hacé un

SetLength(MiArreglo, 0);


Si no lo haces, la liberación de memoria será automática al cerrarse el programa.

3- Como puedo implementar un Count o algo parecido como por ejemplo el Lines.Count para saber cuantos elementos tengo rellenados


Elementos := high(Ficheros)+ 1;


como se definen metodos y funciones ???Un registro no puede tener métodos y funciones. Si queres que los tenga, estas hablando entonces de una clase, cuya declaración va mas o menos asi:


TFichero = class(TObject)
private
FNombre : String;
Procedure SetNombre(Value : String);
protected
public
constructor Create;
destructor destroy; override;
Procedure hhhh; // así no da error!
published
Property Nombre : String read FNombre write SetNombre;
end;


En todo caso, te recomiendo la lectura de algún libro o tutorial de introducción a la Programación Orientada a Objetos en Delphi.

Hasta luego.

;)

Crandel
07-06-2005, 20:38:35
Un detalle importante, es el de saber cuantos elementos ir almacenando.

Es cierto que puedes ir reservando espacio a demanda haciendo:


SetLength(ficheros, numeroelementos+1)


Pero el gran problema surge cuando el número comienza a crecer, dado que comienza a comsumir mayor cantidad de tiempo, debido a la reorganización en memoria del arreglo.

Para solucionarlo, sabiendo que vas a necesitar muchos elementos, pides muchos mas:


SetLength(ficheros, numeroelementos+10000)


10000 es sólo un ejemplo.

Si necesitas más vas agregando de a 10.000, una ves completado vuelves a redimensionar, para eliminar los sobrantes


SetLength(ficheros, numerostomados)


Recuerdo que esto sólo es necesario, cuendo se requieren procesos rápidos, por ejemplo de agregar más de 1000 datos por segundo, sino el tiempo consumido no es tan importante.

aram2r
08-06-2005, 09:54:28
Esto marcha de lujo....muxas gracias...y exare un vistazo a algun libro de orientacion a objetos ya que lo tengo bastante olvidado.