Ver Mensaje Individual
  #1  
Antiguo 13-11-2013
Avatar de rcarrillom
[rcarrillom] rcarrillom is offline
Miembro Premium
 
Registrado: dic 2004
Ubicación: UK / North Sea / Norway / Golfo de México / Frente a mi Laptop
Posts: 219
Reputación: 20
rcarrillom Va por buen camino
Existe alguna directiva para inicializar variables tipo objeto a Nil?

Un saludo al foro.

Estoy dando mantenimiento y portando código de 32 a 64 bits (D7 a XE3) que supera los dos millones de lineas de código, se complica el asunto de depuración porque un ejecutable hace llamadas a varios DLLs COM al mismo tiempo y son cajas negras, o depuro el EXE o depuro el DLL; tengo el código de todos ellos. Entre los detalles que me han surgido hay uno que da dolores de cabeza y espero que se pueda resolver de manera rápida para no urgar las dos millones de lineas:
  • Como procedimiento de programacion típico de los otros programadores anteriores se declaran variables locales tipo TDataSet dentro de los DLLs que al final del Método se destruyen con FreeAndNil, pero no siempre se crean las instancias, por ejemplo si se cumple un IF se llama al TDataSet.Create(), si no se cumple, la variable no se utiliza nunca.
  • Al terminar el procedimiento se intenta liberar todas las variables con FreeAndNil, hayan sido o no instanciadas.
  • Si no ha sido instanciada, la variable tiene una referencia inválida ya que nunca se le asignó Nil al iniciar (el programador anterior asumió que se inicializaban las variables de manera predeterminada ) y el FreeAndNil falla estrepitosamente con un Access violation read of address ... (con las versiones de 32 bits de los DLLs no ocurre, con las de 64 bits, sí), el mensaje casi nunca dice que address sea 0 o puras FFFs lo que sería indicativo de que es algo no asignado, por lo que nos fuimos a depurar los procesos y tardamos 4 dias la primera vez en localizar la fuente del error... dentro del bloque except end , el principal.
He leido que se inicializan a cero, vacio, nil o lo que aplique las variables de objetos (fields), variables globales, pero no las variables locales.

Pues bien, la solucion fué asignar Nil a todas las variables antes de utilizarlas, pero por la cantidad de código y métodos que tienen el mismo defecto es una tarea titánica y por los calendarios asignados no nos dan tiempo para esta tarea, por lo cual mi duda es saber si existe una directiva de compilación que haga que se inicialicen a Nil de manera automática los punteros y variables de objeto.

Gracias
__________________
eLcHiCoTeMiDo - Rompecorazones profesional
Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos?
Salva a un nylon, usa prendas de piel de foca
Responder Con Cita