Ver Mensaje Individual
  #1  
Antiguo 17-02-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Reto Delphi 2011

Hola a todos.

Ahora propongo este reto Delphi que me parece será más fácil de resolver que el anterior (esta vez no será necesario meternos con los registros de la CPU).

Tenemos una rutina de la cual sabemos que su última sentencia es una llamada a la función nativa GetMem:

Código Delphi [-]
Procedure T1.Proc1;
Begin
  ...
  GetMem (P, X);
End;

Como es de esperarse P es una variable puntero y X un entero que indica el tamaño del bloque de memoria que GetMem deberá reservar y asignar a la variable P.

T1 es una clase de la VCL de Delphi, cuyo código fuente podemos ver sin problemas. Proc1 es uno de los métodos públicos de T1. X es uno de sus campos privados (un miembro declarado en la sección Private de la clase), para el cual la clase no tiene propiedad o método alguno que nos permita conocer su valor.

En nuestra aplicación tenemos una instancia de clase T1 (variable Obj), y desde algún lugar realizamos esta llamada:

Código Delphi [-]
Begin
  Obj.Proc1;

Pero justo después de esa sentencia, necesitamos conocer el valor de X con el que Proc1 llamó a GetMem, es decir:

Código Delphi [-]
Begin
  Obj.Proc1;
  ShowMessage ('El valor de Obj.X es: ' + IntToStr (*));

La pregunta es: ¿Qué podemos colocar en lugar de ese asterisco para que el mensaje mostrado por ShowMessage diga la verdad, y qué código habría que escribir para lograrlo? Desde luego, sin modificar los fuentes de la VCL.

Recordemos que X es un campo privado de T1 y nuestro código de prueba (en mi caso hecho en Delphi 7), no forma parte de la misma unidad .pas que T1. Por lo tanto el compilador no admitirá un referencia explícita al campo Obj.X, ni siquiera derivando una clase de T1 (razón que me hace cuestionar de cuando en cuando la valía del nivel de visibilidad Private).

No vale el uso de moldes de acceso tipo:

Código Delphi [-]
T1Acceso = Class (MismoPadreQueT1)
  ...
  X :Integer;
End;

Estoy seguro que más de uno lo resolverá muy pronto. Cuando lo hagan, mencionen alguna pista si lo desean, pero por favor esperen un poco antes de publicar la solución completa. De esta forma la incógnita se mantendrá vigente por un tiempo considerable.

Un abrazo en privado.

Al González.
Responder Con Cita