Ver Mensaje Individual
  #11  
Antiguo 24-12-2010
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Reputación: 19
Bauhaus1975 Va por buen camino
Muy buenas de nuevo

He conseguido mejorar mucho la ejecución de mi programa. De tal manera que con las pautas que habiamos fijado, la gráfica de memoria se comporta como debería: Sube y baja sin pasar de un nivel 'apropiado'.
Sin duda, liberar correctamente la lista, evitar redimensionar las matrices con 'Setlength' etc han conseguido esto.

Cita:
Empezado por Delphius Ver Mensaje
Hola,
Disculpen que me meta pero va a ser necesario bajar más a tierra las cosas que expones. Si nos describes al menos la parte en que asignas y liberas memoria y la definición de los tipos podríamos ver en donde está la falla. De otro modo estaríamos adivinando en que parte de todo tu código que te resignas a mostrar está el error.

Lo que en todo caso deberías hacer es realizar un seguimiento o traza a tu código añadiendo breakpoints y evaluando paso a paso como se comporta hasta hallar el problema. O en todo caso deja al sistema que se ejecute hasta encontrar el error y la línea. Ya con eso se puede saber más o menos donde estaría el problema. Esa es la UNICA manera de saber donde está el problema.
No es ninguna intromisión pues con la ayuda de todos se consigue avanzar.
El problema es que en el segmento de código que expuse, se hace referencia a mil funciones que tendría que poner, que entiendo no afectan a la asignación / liberación de memoria.

He trabajado depurando pormenorizadamente, así he podido mejorar la situación. En fin, error no había, simplemente que con listas grandes hay que trabajar todo con cuidado.

Cita:
Empezado por Delphius Ver Mensaje
Por otro lado ¿Porqué utilizar lista de punteros a la vieja escuela? ¿Es un requisito u obligación? Porque Delphi ya cuenta con clases que cumplen perfectamente con las funciones de listas... entre ellas la clase TList.

Con ello te evitas cualquier problema de liberación y asignación... la clase ya cuenta con los métodos necesarios, solo debes hacer uso de la clase.
Utilizo lista de punteros porque este proyecto es mi proyecto de fin de carrera, con el que llevo a cuestas muchos años ya y tiene herencias de un pasado donde tenía menos conocimiento (incluso ) que ahora. Además, por causas del tutor sus requerimientos han variado mucho en los últimos tiempos. (No tienen mas que revisar mis posts para ver que de vez en cuando vuelvo a la carga con cuestiones para este proyecto)

Cita:
Empezado por Delphius Ver Mensaje
Ahora, la segunda pregunta, ¿Qué sentido tiene hacer una conversión de lista a un array? ¿Porqué no directamente operar sobre el array?

Aviso que trabajar con arrays dinámicos como este:


Código Delphi [-]type
TArray = array of integer;




Tiene sus inconvenientes. Por empezar, cuando uno redimensiona con SetLength() lo que hace es copiar el array en un zona temporal, redimensionar y volver a volcar el contenido del array temporal.

Por tanto cuanto más grande sea el array más lento será el acceso a memoria.
Cuando empecé a trabajar las listas de elementos y ordenación, por tiempos de ejecución tuve que hacer esas operaciones sobre listas de punteros, estando el resto de menciones en el proyecto usando arrays. Así que así ha quedado...

He tomado buena nota de tus explicaciones para trabajar con arrays grandes. Gracias por los consejos que espero poner en práctica.

Ahora me he dado cuenta de que tendría que mejorar muchas partes del código que tengo... pero espero que de momento aguante todo, a ver si puedo finalizar ya este tema.

Gracias de nuevo a todos y un saludo.
Responder Con Cita