![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Es que así es casi imposible poder ayudarte, por ejemplo:
SetLength(listaArray,0); ¿cero?, entonces no ingresarás nada aquí, supongo for i:=o to n do ¿qué es 'o' y 'n'? listaPunteros := generaLista(); ni idea de lo que hace esa función etc. O sea, ni idea de por dónde ayudarte ![]() |
#2
|
|||
|
|||
OK (Gracias por la ayuda). Voy a responderte a algunas de tus dudas e intentaré ponerlo más claro, pero ya verás que al ahorrarme poner todo el codigo lo que hago es simplificar la exposición.
Cita:
for i:=o to n do ¿qué es 'o' y 'n'? perdón '0' y 'n', no es relevante, simplemente el proceso se repite. en el proceso real i es un año de una lista de [añoInicio..añoFin]. listaPunteros := generaLista(T); ni idea de lo que hace esa función etc. a partir de una tabla 'T': 3x14, cada celda tiene un valor de probabilidad 'p'. Bien pues la función genera todas las combinaciones de combinar 1 columna de las 14 filas. Lo importante es que devuelve 3 elevado a 14 elementos enlazados en una lista de punteros con esos valores de probabilidad. Luego esa lista es ordenada, para tener toda la lista de valores de probabilidad ordenados de mayor a menor, por último se pasa de la lista de punteros a array (con la susodicha función lista2Array()). No sé si comentar el código mucho mejor... pero creo que poniendo todo el tocho, al ser un tema de cálculo, va a ser más dificil de entender. La clave está en ver como liberar la memoria en la lista de punteros y array en cada iteración... Que me da la sensación que aunque haga el 'Dispose' a la lista de punteros, el recolector de memoria o gestor no hace uso de la memoria (no sé hasta cuando).. Saludos. Última edición por Bauhaus1975 fecha: 22-12-2010 a las 19:04:47. |
#3
|
||||
|
||||
Entonces se supone que redimensionas listaArray en otro sitio, no?
SetLength(listaArray,0); |
#4
|
|||
|
|||
Cita:
se recorre la lista de punteros y se van añadiendo, en ese proceso va creciendo, y por tanto redimensionándose. Luego a comienzo de la siguiente iteración hay que resetear las listas, tanto listaArray como listaPunteros.
|
#5
|
||||
|
||||
Y si sabes cuántos valores vas a poner en el array, ¿por qué no lo haces de primera hora?, ejemplo: SetLength(listaArray,16384); y luego liberas la memoria.
No sé cómo lo hace delphi en estos casos, pero si tienes un array de n elementos y lo vas a redimensionar... puede que simplemente lo aumente de tamaño o puede ser que cree uno nuevo con el nuevo tamaño, pase los valores del viejo al nuevo, borre el viejo y ya tienes todo en el nuevo. En este último caso todo el proceso será mucho más lento que en el primer caso y necesitarás el doble de memoria, que lo enlentecerá mucho más todavía. |
#6
|
|||
|
|||
Cita:
Así que voy a tratar de definir una vez la longitud, y revisar el uso de la lista de Arrays. Por otra parte voy a implementar una función para recorrer la lista de punteros y liberar uno a uno los nodos, pues he leido que de no ser así no voy a estar haciendo bien las cosas. Cuando haya probado estos cambios os cuento como fue. Gracias de nuevo y un saludo. |
#7
|
||||
|
||||
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. 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. 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:
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. En lo posible debe evitarse estar redimensionando los arrays, en todo caso se puede ganar algo de eficiencia volcando los contenidos en un array auxiliar del tamaño indicado y luego al finalizar o a medida que los cálculos se van ejecutando ir liberando memoria. Si bien internamente SetLength() trabaja con llamadas a GetMem y FreeMem, si se está trabajando con arreglos muy grandes es mejor trabajar directamente con GetMem y FreeMem y reservar un espacio de memoria y operarla como si se tratase de un arreglo. Se gana más, aunque es un poco más lioso en términos de código. Saludos, |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Problema con punteros | waremovil | C++ Builder | 2 | 18-08-2007 18:47:19 |
Liberación de memoria de punteros Data de un Tree. | afxe | Varios | 5 | 20-06-2007 17:12:34 |
Memoria virtual para grandes matrices | JF Sebastian | OOP | 2 | 30-01-2007 20:11:41 |
Problema con matrices que no logro resolver | galmacland | Varios | 11 | 20-06-2006 19:03:45 |
sobre punteros... y memoria ¿Como perder su valor, sin hacerlo? | Delphius | Varios | 8 | 19-04-2006 10:55:06 |
![]() |
|