Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Me hago cruces!!!!!! (https://www.clubdelphi.com/foros/showthread.php?t=85345)

atani123 05-03-2014 17:29:27

Me hago cruces!!!!!!
 
1 Archivos Adjunto(s)
¿Delphi 2010 no sabe sumar?

Tengo una estructura 2 single y un smallint (4+4+2 bytes) total de la estructura 12 bytes. Tamos tontos!!!!!!!

Que alguien me lo explique. El problema esta en el smallint. Si lo quito de la estructura el total suma 10

juanelo 05-03-2014 17:50:01

Se debe a a la alineacion. (Data Alignment)

ecfisa 05-03-2014 18:43:48

Hola atani123.

Es tál como te indica juanelo, para un acceso mas veloz, Delphi alinea las estructuras a palabra o doble palabra. Podes comprimir el almacenamiento de datos usando la palabra reservada packed sobre el registro o de manera global usando la directiva {$A-}. Pero hace mas lento el acceso y puede traer incompatibilidad en el caso de que los datos sean caracteres.

El efecto se puede comprobar facilmente:
Código Delphi [-]
type
  rec1 = record
    factor: Single;
    offset: Single;
    id    : SmallInt;
  end;
  
  rec2 = packed record
    factor: Single;
    offset: Single;
    id    : SmallInt;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  r1: rec1;
  r2: rec2;
begin
  with ListBox1.Items do
  begin
    Add('rec1 (record)');
    Add('-------------');
    Add(Format('factor: %d',[SizeOf(r1.factor)]));
    Add(Format('factor: %d',[SizeOf(r1.offset)]));
    Add(Format('factor: %d',[SizeOf(r1.id)]));
    Add(Format('Total: %d',[SizeOf(r1)]));
    Add('');
    Add('rec2 (packed record)');
    Add('-------------');
    Add(Format('factor: %d',[SizeOf(r2.factor)]));
    Add(Format('factor: %d',[SizeOf(r2.offset)]));
    Add(Format('factor: %d',[SizeOf(r2.id)]));
    Add(Format('Total: %d',[SizeOf(r2)]));
  end;
end;

Saludos :)

Casimiro Noteví 05-03-2014 18:45:28

Cita:

Empezado por atani123 (Mensaje 473316)
...

Por favor, recuerda poner títulos descriptivos.
Cuando alguien tenga tu misma duda, podrá hacer una búsqueda, pero con ese título que has puesto, a ver quién lo encuentra (este hilo) :confused:

atani123 06-03-2014 10:11:01

Perdona, tienes razon, no lo habia pensado asi. Lo tendre en cuenta para futuras preguntas, gracias.

atani123 06-03-2014 10:13:58

Gracias a los dos por la respuesta, entonces en mi caso no tengo mas remedio que usar packet record ya que trato de leer un fichero (FILE of TRec) que ha sido generado con otro software.

Muchisimas gracias

Casimiro Noteví 06-03-2014 10:29:57

Cita:

Empezado por atani123 (Mensaje 473341)
Perdona, tienes razon, no lo habia pensado asi. Lo tendre en cuenta para futuras preguntas, gracias.

Gracias a ti :)


La franja horaria es GMT +2. Ahora son las 14:06:51.

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