
Inicialización de variables de clase
#1
Posted 21 May 2009 - 04:54 PM
"Variabe 'X' mightnot have been initialized"
Eso sucede ya que al declarar la clase se procede a su creación sin ningún trámite adicional. El warning desaparece asignandole a la clase 'X' el valor Nil. Estuve meditando sobre ello y quisiera conocer sus puntos de vista al respecto. En el sentido más purista se debe inicializar con Nil las variables de clase para evitar el warning? O debido a que no provocará problema alguno se puede omitir?
Que piensan al respecto?
#2
Posted 21 May 2009 - 05:52 PM
...Que piensan al respecto?
procedure TForm1.FormCreate(Sender: TObject); var Trial: Integer; {$warn use_before_def off} begin if False {or ProductoRegalado} then Inc(Trial); if Trial >= 10 then Halt; end;
#3
Posted 22 May 2009 - 02:35 AM
Hola Edgar, un gusto poder darte mi opinión.A todos alguna vez nos ha aparecido el warning en delphi al compilar:
"Variabe 'X' mightnot have been initialized"
Eso sucede ya que al declarar la clase se procede a su creación sin ningún trámite adicional. El warning desaparece asignandole a la clase 'X' el valor Nil. Estuve meditando sobre ello y quisiera conocer sus puntos de vista al respecto. En el sentido más purista se debe inicializar con Nil las variables de clase para evitar el warning? O debido a que no provocará problema alguno se puede omitir?
Que piensan al respecto?

Hace falta matizar algunas cosas. Al compilar, Delphi muestra esa advertencia (warning) si detecta que el código hace referencia de lectura a una variable local que "aparentemente" (según el propio código fuente) no recibirá valor antes de ejecutarse dicha referencia.
Cuando dices "clase X", creo que te refieres más bien a un "objeto X". Pero como fuera, la advertencia aplica a muchos tipos de variables, no sólo clases u objetos. De hecho, puede resultar curioso notar que el compilador lo reportará con una variable Integer, pero no con una variable String, y esto se debe a que las variables de tipos que usan contadores de referencias (como String) sí son inicializadas de manera implícita (en este mensaje de Club Delphi profundizo sobre la lógica detras de ello: http://www.clubdelph...25&postcount=29).
Resulta muy útil que el compilador lance la advertencia, ya que en muchos casos habrá sido por algún descuido de nuestra parte. Pero hay casos especiales, donde el compilador no logra determinar si la variable está siendo inicializada o no, pero nosotros, los creadores del código, sabemos que sí lo estamos haciendo. Tal vez no de una manera convencional que el compilador pueda detectar fácilmente, pero sí que le estamos dando un valor inicial.
Para estos últimos casos (que en la práctica son poco frecuentes), es de mucha ayuda desactivar la directiva de compilación "Warn Use_Before_Def", que señaló Javier. Salvo que debes hacerlo sólo para la rutina en cuestión, ya que de otra manera quedaría desactivada también para las rutinas siguientes del archivo de código.
{$Warn Use_Before_Def Off} Procedure Proc1; Var MasterField :TField; SavedModified :Boolean; SavedState :TDataSetState; Begin ... End; {$Warn Use_Before_Def On} // volvemos a activar la directiva
Uno no debe inicializar una variable sólo por evitar que aparezca esa advertencia. Mas bien, en caso de aparecer la advertencia, hay que revisar si estamos haciendo algo mal (como leer una variable local que sólo hemos declarado pero no otorgado ningún valor), o, por el contrario, estamos seguros de que el código le habrá asignado un valor a la variable antes de ser leída y por tanto proceder con seguridad a desactivar temporalmente la directiva.
Por último, siempre que aparezca esta advertencia del compilador, debemos revisar nuestro código. Ignorarla o desactivar la directiva correspondiente sin hacer ningúna revisión es a lo menos comprometedor. En mi opinión, nunca debemos obviar este tipo de mensajes del compilador.
Mi contribución.
Saludos.
Al González.

#4
Posted 22 May 2009 - 10:05 AM
Salud OS
#5
Posted 22 May 2009 - 10:25 AM
Omitir warnings para variables de tipo nativo (notese influecia dot net

Saludos.
#6
Posted 22 May 2009 - 11:15 AM
Hola de nuevo. ¿Podrías mostrarnos esa documentación? ¿De qué compilador estamos hablando?Coincido con todo lo que mencionas Al, solo que mi post estaba orientado a si se debe o no inicializar las variables de clase con Nil tal y como mencionan la documentación o en su defecto puede ser omitida ya que no genera problema alguno...
Hay una regla muy sencilla: Una variable local debe ser inicializada solamente si puede darse el caso de que lo primero que le ocurra dentro de la rutina sea una lectura y no una escritura.
Procedure Proc1 (Const Crear :Boolean); Var F :TForm1; Begin If Crear Then F := TForm1.Create (Nil); If F <> Nil Then // Puede que llegue aquí sin haberse asignado nada a F (¡cuidado!) F.Show; End; Procedure Proc2 (Const Crear :Boolean); Var F :TForm1; Begin If Crear Then F := TForm1.Create (Nil) Else F := Nil; // Así está mejor If F <> Nil Then // Esto ya es seguro F.Show; End; // Y en este caso no hay problema porque siempre ocurre la asignación primero Procedure Proc3 (Const Crear :Boolean); Var F :TForm1; Begin F := FuncionForm (); If F <> Nil Then F.Show; End;
Espero haber despejado alguna duda.
Saludos.
Al.

#7
Posted 23 May 2009 - 10:03 AM
...Para estos últimos casos (que en la práctica son poco frecuentes), es de mucha ayuda desactivar la directiva de compilación "Warn Use_Before_Def", que señaló Javier. Salvo que debes hacerlo sólo para la rutina en cuestión, ya que de otra manera quedaría desactivada también para las rutinas siguientes del archivo de código...
Aunque yo solo mostraba un ejemplo de lo que sucedería si ignoraramos por completo dicho mensaje ("Run-Time Check Failure #3"), me parece que lo que comentas es muy importante.
...Una variable local debe ser inicializada solamente si puede darse el caso de que lo primero que le ocurra dentro de la rutina sea una lectura y no una escritura...
El resumen del hilo

