Delphi - ¿SizeOf loco?

 
Vista:

¿SizeOf loco?

Publicado por M@rceloL (213 intervenciones) el 18/02/2007 01:15:51
Hola gente. Tengo un problema de lo más "loco". A ver si ustedes tienen alguna idea.

Estaba haciendo una clase que implementa un buffer. Uno le pasa alguna variable y el buffer descompone la variable en bytes y la almacena en su propio espacio de almacenamiento para después poder escribirla en disco.

De repente empecé a encontrar alguna cosa mal guardada y al investigar me encontré con esto:

Supongamos que tengo:

type r= record
b: byte;
i: longword;
end;

var reg: r;

Y hago algo como Buffer.Escribir(reg,SizeOf(reg));

El buffer va a usar un ^byte que toma el valor de @reg y va a ir recorriendo los bytes independientes (incrementando con Inc)hasta recorrer la cantidad indicada por SizeOf.

Pero, resulta que SizeOf ¡devuelve 8!

Entonces el buffer se manda flor de "macana" al tratar de recorrer los bytes, ya que trata de recorrer 8 bytes cuando tendría que recorrer 5. Lo más increíble es que ¡encuentra los 8 bytes! Entre el primer byte (correspondiente al campo b) y el "segundo" (correspondiente al campo i) encuentra 3 bytes que no se sabe de dónde salieron.

Por ejemplo, siendo:

b=3
i=15

Aparecen los bytes:

03,F5,12,00,0F,00,00,00

Los primeros 4 bytes se deben al campo b (¡de 8 bits!), que sólo debería ser 03. Los bytes F5,12,00 parecen ser aleatorios, como si fueran basura.

Después están los 0F,00,00,00 del campo i, que están bien.

Si yo, deliberadamente, hago Buffer.Escribir(reg,5); Entonces el bufer escribe:

03,F5,12,00,0F

Es decir, sigue recibiendo una variable de 8 bytes.

Con cualquier tipo de dato menor que 32 bits, simplemente devuelve 8, como si el campo fuera de 32 bits...

Si cambio b:byte, por algo como b:string[10], SizeOf devuelve 16, que tampoco está bien.

Los SizeOf de variables independientes (que no están en un registro) son devueltos correctamente. El SizeOf(reg.b) es 1, efectivamente correcto. Incluso usándolo sobre un arreglo, devuelve correctamente su tamaño.

Tanto SizeOf sobre el tipo de dato o sobre la variable funcionan igual.

Algo más increíble todavía, es que cuando leo de disco de nuevo en el buffer y finalmente en la variable, todo queda perfecto. Ahora, ¿Cómo no sobreescribo memoria? Un misterio.

En la ayuda dice que suele usarse word o double-word para almacenar números en tipos de datos complejos, aunque esto no pasa con los arreglos... En fn.

Algo de locos.

¿Ideas? Sí, ya sé, que me tire de un puente. Y que abajo del puente haya una cama de clavos bien afilados, oxidados, e impregnados con veneno de cobra real... y también electrificados. Pero no es una opción :( Aunque lo haría si pudiera conseguir el veneno...

Saludos y gracias.

PD: Por si sirve de algo, es un Delphi 7 corriendo sobre WinXP SP2 en una Pentium IV.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder