2011-07-23 8 views
6

Hoy en día uno de mi amigo me pregunta acerca de por debajo de código:resultado en código simple cuando las variables están sin inicializar

var 
    a: Integer; 
begin 
    ShowMessage(IntToStr(a)); 
end; 

Esta es variable local y no se ha inicializado, ok?

Coloque código en el OnClick caso de un componente de botón y luego ejecutar código de tres maneras diffrent siguientes:

  1. Haga clic en el botón y ver resultado, resultado = 1635841
  2. Pulse la tecla Enter y vea consecuencia, resultado = 1
  3. Pulse la tecla de espacio y ver resultado, reuslt = 1636097

pruebo código en la computadora dos diversa & ver mismo resultado, ninguna idea acerca de t su ?

+0

En mi máquina, obtengo resultados diferentes. También obtengo resultados diferentes cada vez que ejecuto el programa. (Sin embargo, no veo diferencia dependiendo de cómo se hace clic en el botón.) –

+0

Lo que obtengo en la PC es 5734816, que es el valor almacenado en el registro EBX)) –

+8

Voto porcentual porque obviamente esta es una nueva persona que acaba de aprender Delphi. ¿No estás seguro de por qué los votos a favor? Bienvenido a SO, Geek. –

Respuesta

10

Dado que la variable no se inicializa, su valor puede ser cualquier cosa. Como su resultado es 'algo', aquí no pasa nada inusual.

+1

+1 Una cosa interesante es que a veces incluso va a cadenas http://stackoverflow.com/questions/3250827/initialise-string-function-result –

+0

No @Boris, el problema de resultado de cadena es un problema diferente. Los resultados de cadena son en realidad inicializados por las funciones de llamada, no por la función llamada, es por eso que parecen retener su valor. –

+1

@Cosmin Los resultados de cadena se instalan, no se inicializan mediante la función de llamada.Si llama varias veces a una función con una cadena de resultados que no está asignada dentro de la función, si cambia el contenido entre dos llamadas, el contenido permanecerá intacto: la instancia de cadena se instanciará, primero se rellenará con '', pero no se restablecer a '' para cada llamada de función. Solo el parámetro 'out aText: string;' borrará la cadena antes de cada llamada. –

1

Ver similares Stackoverflow question.

En Delphi, las variables locales no se inicializan de forma predeterminada. El programador es responsable de eso y siempre debe establecer un valor antes de leerlo. El valor de una variable unitaria depende del contenido de las celdas de memoria asignadas reales utilizadas para esa variable. Entonces cualquier valor es posible aquí.

+0

¡lo sé! y digo en mi primera publicación que @ "¡Esta es una variable local y no se ha inicializado"! –

+1

Entonces, ¿cuál es la pregunta aquí? En el nivel de lenguaje Delphi, todo lo que debes saber es que el valor de una variable no inicializada no está definido. Si realmente quieres saber qué está pasando exactamente, tienes que mirar el nivel del código de la máquina. Pero el código generado depende en gran medida de la versión del compilador y de los indicadores del compilador (modo de depuración, nivel de optimización, etc.). Por lo general, la memoria para las variables locales se asigna desde la pila. Y la pila crece y se reduce de forma permanente durante la ejecución del programa, por lo que las variables locales nuevas pueden contener cualquier valor, tal vez una dirección de devolución utilizada anteriormente, pero ¿a quién le importa? – vanje

2
procedure TForm1.Button1Click(Sender: TObject); 
var 
    a: Integer; 
begin 
    ShowMessage(IntToStr(Integer(a))); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
ShowMessage(IntToStr(Integer(Pointer(TButtonControl(Button1))))); 
end; 

en mi máquina de este código produce mismo mensaje que compilador utiliza EBX registro de una variable, mientras TButtonControl.WndProc utiliza EBX para almacenar puntero a Auto (como EAX será sobreescrito después de llamadas a la función WinAPI desde TbuttonControl.WndProc) que es button1 antes de llamar al controlador real Button1Click. Así que, por desgracia, en el texto del mensaje Delphi 2007 es demasiado predecible.

[editado] Se puede ver lo que está sucediendo dentro de VCL durante la depuración si se activa la opción Usar depuración DCU en sus opciones de compilación del proyecto Compiler-> Debugging-> Uso de depuración DCU.

+2

No agregue el directorio fuente Delphi a la ruta de búsqueda del compilador. Corre el riesgo de que Delphi vuelva a compilar esas unidades. Para depurar a través de las unidades VCL, active la opción "debug DCUs", que agrega la carpeta debug-DCU a la ruta de búsqueda; esa carpeta no contiene ningún código fuente. –

+0

@Rob gracias por la corrección –

+0

corregido - parece que pisar el mismo rastrillo de vez en cuando –

Cuestiones relacionadas