Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Reto Delphi 2011 (https://www.clubdelphi.com/foros/showthread.php?t=72418)

rgstuamigo 21-02-2011 15:27:42

Dale de una ves con la segunda pista...:D:D

roman 24-02-2011 19:34:03

¿Y bien? ¿Qué ha sido de esto?

Creo saber cómo resolverlo aunque me desconcierta lo del GetMem pues con mi "solución" bastaría cualquier función/método que no altere el valor de X.

// Saludos

Al González 24-02-2011 20:03:56

Cita:

Empezado por roman (Mensaje 391918)
Creo saber cómo resolverlo aunque me desconcierta lo del GetMem pues con mi "solución" bastaría cualquier función/método que no altere el valor de X.

Hola Román. Como sucede con cualquier problema de programación, estoy seguro que debe haber más de una solución a esto, pero algunas funciones nativas son algo maleables.

Cita:

Empezado por rgstuamigo (Mensaje 391532)
Dale de una vez con la segunda pista...:D:D

Ya lo hice, la segunda pista fue:
Cita:

Empezado por Al González (Mensaje 391530)
Esto no tiene mucha ciencia, creo que en cualquier momento alguien nos sorprenderá con la solución. Pero está bien, les daré una segunda pista sólo porque estamos a la mitad del camino. :)

Tercera pista: Tu mensaje, rgstuamigo, está en otra mitad de la primera pista, la cual aparece, por supuesto, antes de la segunda. ;)

roman 24-02-2011 20:17:13

Ya suponía yo que en el aviso en sí de la segunda pista estaba la pista. Sólo que a mi no me dice nada ni la primera, ni la segunda, ni la tercera, por lo que supongo que son caminos distintos. La solución que vislumbro consiste sencillamente en acceder al campo privado X. Cosa que es posible si se conoce el código fuente de la clase, que me parece es una de las premisas. Aunque no es una solución elegante y no la usaría en un programa :)

Agrego: Pensándolo bien, quizá sí esté en el mismo camino pues algo de lo que mencionas sí lo uso.

// Saludos

Ñuño Martínez 25-02-2011 10:21:11

Pues coincido con Roman al decir que "consiste sencillamente en acceder al campo privado X". Y aquí se me encendió la lucecita y pregunto:

¿Se ha compilado con información de depuración o sin ella?

¡Zasca! Seguro que no se lo esperaba, maestro González. :D

Al González 25-02-2011 17:39:11

Cita:

Empezado por Al González (Mensaje 391237)
No vale el uso de moldes de acceso tipo:

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

...Ni algún otro truco inseguro y poco recomendable de "calcado" de campos o instrucciones máquina.

No hay información de depuración porque el programa ha sido compilado para producción, y un campo como X no genera RTTI. :)

Mejor sigan la pista #1, si bien esto es prescindible para llegar a lo que esa sigla significa. ;)

roman 25-02-2011 18:01:46

Ja, ja, Pero eso ya es demasiado. Es como si un profesor te impidiera usar una solución aún siendo válida :)

Para mi que Ñuño y yo ya lo resolvimos, lero, lero. :)

// Saludos

Delphius 25-02-2011 18:21:59

Yo por algo preguntaba sobre cierta sigla de 4 letras :rolleyes: :D

Y estoy re perdido. Esas pistas para mi ni Arthur Conan Doyle se las imagina para las aventuras que ha escrito; que me han resultado complicadas de sacarle algo :o

Yo de este reto mejor paso, que tengo mi cabeza pensando en mis propios retos... y en los del mecánico que me ajusta los tornillos :(

Saludos,

roman 25-02-2011 18:25:22

Yo no sé ni a que sigla se refiere. Es más, ni siquiera sé cuál es la primera pista, y la tercera mejor ni releerla porque da dolor de cabeza :p

// Saludos

Delphius 25-02-2011 18:33:16

Cita:

Empezado por roman (Mensaje 392020)
Yo no sé ni a que sigla se refiere. Es más, ni siquiera sé cuál es la primera pista, y la tercera mejor ni releerla porque da dolor de cabeza :p

// Saludos

Pues esto es una chunga amigo... yo me quedé pensando ¿a que sigla apunta Al? Yo al comienzo del hilo ya había dicho sobre una sigla, 4 letras... a lo que apuntaba en ese entonces es a RTTI pero si de plano no es la vía entonces... :confused:

Más que reto, se me hace una adivinanza :D

Y si a ti te da dolor de cabeza, entonces ¿a mi? :( :eek:

Saludos,

Al González 25-02-2011 19:12:08

Cita:

Empezado por Al González (Mensaje 391922)
Hola Román. Como sucede con cualquier problema de programación, estoy seguro que debe haber más de una solución a esto, pero algunas funciones nativas son algo maleables.

Y la idea es aprovechar esa flexibilidad de la función en cuestión. :)

Cita:

Empezado por roman (Mensaje 391923)
Ya suponía yo que en el aviso en sí de la segunda pista estaba la pista. Sólo que a mi no me dice nada ni la primera, ni la segunda, ni la tercera, por lo que supongo que son caminos distintos.

No, las tres pistas se dirigen por el mismo camino.

Cita:

Empezado por roman (Mensaje 391923)
La solución que vislumbro consiste sencillamente en acceder al campo privado X. Cosa que es posible si se conoce el código fuente de la clase, que me parece es una de las premisas. Aunque no es una solución elegante y no la usaría en un programa :)

Bueno, si aún así la consideras válida, no tiene por qué ser rechazada. Puedes publicarla si gustas. :)

Cita:

Empezado por Delphius (Mensaje 392019)
Yo por algo preguntaba sobre cierta sigla de 4 letras :rolleyes: :D

Es de tres letras, pero no está escrita con letras. :p

roman 25-02-2011 19:43:32

Cita:

Empezado por Al González (Mensaje 392029)
Y la idea es aprovechar esa flexibilidad de la función en cuestión. :)

Ja, ja, ja. Y mira que mis ojos pasaron por la solución más de una vez. Gracias Al, estuvo interesante :)

// Saludos

Delphius 25-02-2011 20:05:03

Cita:

Empezado por Al González (Mensaje 392029)
Es de tres letras, pero no está escrita con letras.

Me dejaste pior :o :D

Cita:

Empezado por roman (Mensaje 392033)
Ja, ja, ja. Y mira que mis ojos pasaron por la solución más de una vez. Gracias Al, estuvo interesante :)

// Saludos

¿Ustedes son humanos? :rolleyes:
Voy a tener que llamar al área 51 porque parece que se fugaron de allí. ¿Cómo le hacen para saber tantas cosas? :D

Evidentemente hay cosas que mi cabeza no logra entender y captar porque no tiene la preparación... pero esto... ¡se me hace que es más fácil encontrar la teoría unificadora de la física! :D :p

Supongo que en una semana van a dar conocer la solución ¿no? ;) Porque me han dejado intrigado.

Saludos,

roman 25-02-2011 20:30:10

He de decir que lo de las siglas sigo sin entenderlo, aunque el término maleable tampoco me convence mucho.

Lo que es cierto es que la respuesta es mucho más sencilla de lo que parece, tal como lo comentó Al desde un principio. También es elegante y segura de usar, no como mi segunda solución, que voy a esbozar para que los demás no tomen el camino equivocado:

Los campos en un objeto se acomodan de manera similar a un registro con un primer campo oculto que es la referencia a la clase a la que pertenece el objeto. Los campos aparecen en el orden en que están declarados y cada objeto guarda los campos de su clase y los de todas sus ancestras.

Así pues, el método "sucio" de acceder al campo X pasa por saber el offset o desplazamiento del campo en el objeto y acceder libremente:

Código Delphi [-]
ShowMessage(PInteger(Integer(Obj) + Offset)^);

Calcular dicho offset no es tan sencillo pues hay que tomar en cuenta el alineamiento que menciona Al. Sin embargo, puede hacerse examinando el código fuente de la clase. Si la clase tiene ancestros nos podemos ayudar con AncestroDeClaseDeObj.InstanceSize, ya que InstanceSize sí toma en cuenta el alineamiento. Aún así, hay que examinar los campos de la clase final hasta llegar a X.

// Saludos

Casimiro Noteví 25-02-2011 20:31:36

¡¡¡ ¿¿¿Ya lo han descubierto??? !!! :eek:

Yo es que no he entendido las pistas, que parecen encriptadas :confused:

Casimiro Noteví 25-02-2011 20:35:39

Ahora que leo lo comentado por Román veo que mi idea estaba bien encaminada, por eso dije:
Cita:

Empezado por Casimiro Notevi
No estoy muy seguro, pero creo que en lenguaje C sería más fácil

Lo dije porque en lenguaje C conozco en profundidad cómo manejar los punteros, pero en Delphi todavía no me he enterado, de verdad :o:o:o

roman 25-02-2011 20:39:13

Pero ojo, la solución que esbocé no es la que busca Al.

// Saludos

Al González 25-02-2011 21:11:35

Román, me alegra mucho tener la certeza de que has llegado a la misma solución que yo. :)

Cita:

Empezado por Casimiro Notevi (Mensaje 392041)
Lo dije porque en lenguaje C conozco en profundidad cómo manejar los punteros [...]

Ah, perdón Casi, yo creí que eso había sido un intento de provocación. :D :p :o

Amigos, reitero lo dicho. La cosa no requiere de meterse a las entrañas de la memoria o hacer desplazamientos de punteros y cosas de tan profundo nivel.





Marcelo, no será necesario practicarle ningún exorcismo a ecfisa para encontrar las tres letras que te ayudarán a resolver...








:p

roman 25-02-2011 21:15:02

Cita:

Empezado por Al González (Mensaje 392043)
La cosa no requiere [...] hacer desplazamientos de punteros

Je, je. Cuidado con lo que dices :)

// Saludos

roman 25-02-2011 21:49:59

1 Archivos Adjunto(s)
Bueno, aunque sabía la solución, no me decidía por la forma de implementarla. Aquí pongo una opción.

Contestando a

Cita:

Empezado por Al González
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.

En lugar del asterisco colocamos

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

y el código que hay que escribir está en el archivo adjunto.

La contraseña, para quien quiera ver la solución, es el tipo de datos (todo en minúsculas) involucrado :)

Por cierto, del primer intento (fallido) de solución, que tenía que ver con las funciones del Heap, sale este koan:

Cita:

No es lo mismo el último tamaño de bloque solicitado que el tamaño del último bloque solicitado.
// Saludos


La franja horaria es GMT +2. Ahora son las 07:25:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi