![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Tu codigo tiene muchos errores por varios lados.
Para eliminar varios al mismo tiempo te aconsejo utilizar la clase TList en vez de array dinámico. Por otro lado al asignar los elementos tienes:
aca lo que estas haciendo es crear el objeto TColumnaDict asignarle valores y agregarlo a FColMant, hasta aca todo bien, pero luego lo destruyes !!! Tienes que entender que Delphi al pasar objetos como parametros no crea una nueva instacia (copia) de ellos, sino solamente pasa el puntero, por lo que el objeto sigue siendo el mismo, asi que al destruirlo, destruiste el objeto que pasaste. Donde obtienes el error es porque intentas de volver a destruir el objeto ya destruido
__________________
[Crandel] |
|
#2
|
||||
|
||||
|
Cita:
Agradecería, no obstante, saber cuales son esos errores. ![]() Cita:
FColMant.AddColumna(Value); Este paso, copia la Colección a la nueva colección que se crea internamente, dentro de la clase. Cita:
Pero debo insistir, el "truco" de esta clase está en:
Donde la segunda forma de crear el objeto TColumnaDict, realiza una copia del objeto Value. Si fuese de otro modo, en el test, el método:
No funcionaría. Y si habeís pasado el test, todos ellos funcionan con normalidad (y he comprobado que sin ningún Memory Leak), excepto el método del TestCase: y por tanto, el método de la clase:
Gracias por la respuesta.. ![]() Un saludo. Última edición por yapt fecha: 17-01-2011 a las 08:58:18. Razón: Aclaración y corrección |
|
#3
|
|||
|
|||
|
Cierto, pense lo de mover los valores unicamente como si fuese un array simple. Gracias por la correcion.
Entonces deberia ser algo asi no?
esto es, sin tener que recrear todo el array dentro del bucle, sino unicamente moviendo los ya existentes. Creo que ahora si es correcto... PD: remirando tu codigo y habiendo leido lo que dices del create de TDictionary, creo que el error lo tienes en la linea del mismo. No se bien bien como va, pero me extraña que esta expresion (Columna[x].Create( Columna[x+1] )) funcione. No estas asignando nada a nada, solo llamando al create 'al aire', digamos, sin que se recoja su resultado (de todas maneras le echare un vistazo a la clase TDictionary). Si pruebas Columna[x] := TColumna.Create(Columna[x+1]) te falla tambien? Saludos. Última edición por coso fecha: 17-01-2011 a las 13:14:11. |
|
#4
|
||||
|
||||
|
Cita:
Debería ser mucho más eficiente. Pero no explica el problema (todavía)... ![]() Cita:
Es decir, poniendo un ejemplo en "pseudocódigo":
Por tanto:
Lo que hace es llamar al método create de TDictionary, pasandole como parámetro otro TDictionary que ya existe, con lo que el objeto se crea y los valores, se copian. Como digo, ya no es importante, pues está funcionando (con un TList) y veo que se está complicando en exceso. Me gustaría saber por qué sucedía el problema y seguiré respondiendo cualquier pregunta al respecto. Pero no hay prisa. :-) Gracias coso. |
|
#5
|
|||
|
|||
|
Pero, aun ser un TDictionary (ya mire un poquillo la documentacion al respecto, es no mas que un TList doblemente referenciado), el create que haces no lo asignas a absolutamente nada. Es como hacer, por ejemplo:
En verdad creas un form, pero al no estar asignado a nada, no puedes referenciarlo. Usando Columnas[x].Create(Columnas[x+1]) (tal como si usaras FColumnas, el ser propiedad es irrelevante) llamas al metodo Create de Columnas, te crea un objeto TColumnDict con los valores de Columnas[x+1], pero no lo asignas a Columnas[x]. Llamas al create del objeto, que te devuelve un TColumnDict, pero se queda perdido, no se guarda en el objeto que ha llamado a create. A eso voy, que me da que el fallo es precisamente la falta de asignacion. Probaste asignandolo? Seria algo asi :
Prueba y nos cuentas. Mas que nada para que quede el hilo cerrado si es lo correcto. Un saludo. Última edición por coso fecha: 17-01-2011 a las 15:11:25. |
|
#6
|
||||
|
||||
|
Hummmm.....
pues me da que has dado con el asunto. Mañana y pasado estoy de curso. Supongo que el jueves tendré la mesa con 20 temas..... pero lo pruebo antes del domingo. Ya remito aquí los resultados. Saludos y muchas gracias.. |
|
#7
|
||||
|
||||
|
Coso ya encontró tu error asi que no hay mucho mas para dar vuelta, pero igual intento de explicar mejor a lo que me refería.
Cita:
El proceso de creación de un objeto aunque es muy fácil para nosotros implementarlo es preferible no abusar de él. Ya que no solo consume mayor tiempo de ejecución sino que también el hecho de crear/borrar puede provocarte fragmentación de la memoria. Es por eso que te recomendaba el uso la clase TList, hace exactamente lo que necesitas hacer pero ya optimizado por la gente de Delphi.
__________________
[Crandel] |
|
#8
|
||||
|
||||
|
Cita:
Cita:
Gracias a los tests de unidad, el error se mostró pefectamente. Si no, el código hubiera ido a producción con un error de bulto. Lastima que el desarrollo de DUnit parece que se ha detenido hace mucho tiempo. Iniciaré otro hilo para comentar esto. El código ha quedado así (la fila con el error la pongo comentada):
Y los tests de unidad pasan de forma perfecta. Gracias. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Invalid Pointer Operation | FerCastro | Varios | 3 | 23-02-2010 21:47:26 |
| Invalid Pointer operation Dll | mcarazas | Varios | 2 | 15-10-2008 21:45:14 |
| Invalid Pointer operation Dll | mcarazas | Varios | 0 | 15-10-2008 16:42:23 |
| invalid pointer operation | muppett | Varios | 1 | 05-03-2008 00:17:55 |
| QR - Invalid Pointer Operation | alapaco | OOP | 6 | 07-06-2006 22:43:31 |
|