![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Mas para LEPE
Creo que no entendi muy bien lo que me tratas de decir con lo de destruir mi instancia de Trash... y aprovecho para comentarte un poco mas mi algoritmo de antes.
Hasta ahora eso es loq ue tengo hecho. Pero que sucede.. que una linea logica puede ser dividida en 2 o mas lineas fisicas cuando pasa esto: 1.- Se hace referencia a una instruccion muy larga(ejemplo antes citado, Por ejemplo esto: TClase(MiObjeto.MiFuncion[6].Propiedad1).Elemento[3].Text := TObjeto.Propiedad1.Parametro[Objeto.Propiedad2.Index].Value; ) 2.- Sentencia IF con condiciones muy largas. La solucion que propongo es buscar la palabra THEN y contar todo lo anterior como una sola linea. P.Ej: If (TClase(OBjeto).propiedad1.parametro = valor) and (TClase(Objeto).propiedad2.valor = valor) and (Objeto.propiedad3 = 3) then.... 3.- EN una linea hay parentesis o cualquiero otro signo que tiene igual uncion que el parentesis o "[" con muchos parametros dentro. 4.- un for, while o repeat... until con muchas condicionales y muy largo. 5. - declaracion de USes muy largas. Estos son mi sproblemas!!!!
__________________
Muchas Gracias... |
#2
|
||||
|
||||
En principio, lo que necesitas en un analizador léxico y un analizador
sintáctico. Esto se da en la asignatura de Compiladores. El léxico se encarga de encontrar los tokens, y se los pasa al sintáctico para que vea el orden en el que se ha detectado, en base a eso, y según las expresiones regulares que se hayan proporcionado al sintáctico, se bifurca en una ejecución u otra. No sé que tal andas en estos temas, pero existe el Lex y Yacc para delphi hecho en delphi; es open Source: Cita:
Vamos con el tema del Trash. No sé si ya has trabajado con punteros anteriormente, así que te digo las bases. En realidad Trash es una variable de 32 bits que es un puntero al objeto. ¿Que significa eso?, que Trash guarda la dirección de memoria donde ese objeto reside, en este ejemplo el 100 Código:
Trash Memoria Ram ------- Dirección ----------------------------- | 100 | 0 | | ------- 100 |aqui está el objeto Trash | 200 | y puede que ocupe mucha ram| 300 |Otro objeto Trash empieza aq| |y ocupa el mismo espacio | ----------------------------- Simplemente se reservan 32 bits en la memoria ram ( lo que está en color azul). Cuando haces Trash := TTrash.Create; es cuando se reserva el espacio en memoria ram y se crea el objeto (lo puesto en rojo). y la variable trash, se le asigna la direccion de la ram donde está ese objeto, en este caso 100. Cuando por segunda vez haces Trash := TTrash.Create; Se crea el objeto que he puesto en verde, y a la variable Trash, (el azul) se le pone 300 en este caso. Bien, como ves la variable Trash (en azul) ahora tiene la dirección 300, por tanto, el primero que se creó (el rojo), ya no puedes acceder a él. De ahora en adelante Trash, hace referencia al verde, el rojo se queda en Memoria Ram: - sin poder acceder a él - Sin poder liberar la memoria Es decir, el objeto rojo se queda en el limbo. Esto es lo que te ocurre con los 2 primeros Trash que creas, y solo puedes acceder al último Trash, en concreto: Los 2 Trash anteriores se quedan en el limbo. Por eso decía que pongas 3 variables Trash. Edito: Pon la implementación de FTrashList y como creas FTrashList y como la destruyes. Sin eso no puedo ayudarte. Espero que se entienda.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 15-11-2005 a las 15:30:34. |
#3
|
||||
|
||||
Aunque lo que te he comentado es bueno, realmente no es así, es decir, no
se quedan ninguno en el Limbo, ninguno de los tres. ¿Por qué? Porque una linea de código se me escapó a la vista:
La variable Trash, si se queda apuntando al tercer Trash creado, pero los 2 anteriores, se añaden a FTrashList, realmente no se quedan en el limbo, pero que conste, en esa rutina tienes 3 objetos Trash distintos. ¿hasta ahí de acuerdo? El error que tienes ahora, es que estas Cita:
2º- Como te dije, no debes usar Destroy, usa FreeAnnil(Trash). 3º- Has dejado de usar la variable Trash (el puntero de color azul), pero el objeto realmente (color rojo o verde) sigue en memoria, y puedes acceder a él a traves de FTrashList. 4º- No puedes ni debes usar Trash.Free, porque destruirías el objeto de la memoria RAM. Si liberas el objeto con Trash.Free, y despues intentas acceder desde FTrashList.Items[i] a ese mismo objeto, tendrás un Access Violation. No conozco realmente la implementación de FTrashList; por el nombre parece una lista de objetos, y si es así, en realidad es una lista de punteros. Solo puedes destruir el Trash, desde un sólo sitio, yo lo haría al liberar el FTrashList. Edito: Pon la implementación de FTrashList, cuando lo creas y como lo destruyes. saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 15-11-2005 a las 15:32:27. |
#4
|
|||
|
|||
Waoo!!!
Hola Lepe! me has dejado sin palabras!!! Que demostracion de sabiduria!! jajajaja
Nada, que ya solucione casi todos los problemas. Lo de analizar las lineas.. pues ya solucione los problemas uqe te plantee arriba con el For, If, USES y VAR... y sobre lo del destroy y demas.. pues es cmo dices... Muy buena tu explicacion!! Gracias
__________________
Muchas Gracias... |
#5
|
||||
|
||||
mirsh!..
suerte con tu proyecto, yo estoy haciendo algo parecido, de hecho mi aplicación debe analizar y reconocer el código fuente para VB, c, ProC, y Plsql. Al principio tube unos problemitas como tú, pero ya va bastante avanzado y sin mayores complejidades. si quieres compartir experiencias.. escríbeme. Salu2... ![]() |
#6
|
|||
|
|||
Gracias!!!
Cita:
__________________
Muchas Gracias... |
![]() |
|
|
![]() |
|