МенюФорумДрузьяКабинет
/ GameDev.ru / Программирование / Подсказки /

Универсальный вспомогательный тип для 32-битных переменных в Delphi.

Автор: main

Для упрощения и оптимизации некоторых операций с 32-битными переменными в Delphi, могу посоветовать определить вот такой тип.

 PVar32 = ^TVar32;
 TVar32 = record
  case Integer of
   00:( AsCardinal              :Cardinal  );
   01:( AsInteger               :Integer   );
   02:( AsSingle                :Single    );
   03:( AsFloat                 :Single    );
   04:( AsPointer               :Pointer   );
   05:( AsTObject               :TObject   );
   06:( AsLongBool              :LongBool  );
   07:( AsProcedure             :procedure );
   08:( Byte0,Byte1,Byte2,Byte3 :Byte      );
   09:( ShortInt0,ShortInt1,
        ShortInt2,ShortInt3     :Shortint  );
   10:( Word0,Word1             :Word      );
   11:( SmallInt0,SmallInt1     :SmallInt  );
   12:( AsPByte                 :^Byte     );
   13:( AsPWord                 :^Word     );
   14:( AsPCardinal             :^Cardinal );
   15:( AsPChar                 :PChar     );
   16:( AsPInteger              :^Integer  );
   17:( AsPSingle               :^Single   );
   18:( AsPFloat                :^Single   );
   19:( AsPDouble               :^Double   );
   20:( Next                    :PVar32    );
   21:( AsPVar32                :PVar32    );
   // и т.д. ...
   // 22:( AsStek               :TStek     );
   99:( _Byte0  :Byte; 
         Word12 :Word;
        _Byte3  :Byte                      );
 end;

Вот некоторые примеры использования:

1) например, если нужно проверить равенство двух Single-переменных, и при этом никакие другие операции с ними не планируются, то их не обязательно загружать и сравнивать в FPU, а можно просто сравнить как целочисленные переменные:

 if TVar32(Var1).AsInteger=TVar32(Var2).AsInteger then Exit;

2) можно напрямую обратиться к конкретному байту:

 with TVar32(Color) do Byte3 := ( Byte0 + Byte1 + Byte2 ) div 3;

3) можно даже напрямую обратиться к среднему слову(Word):

var
 w :Word;
 i :integer;
begin
 i := ...
 w := TVar32(i).Word12;

и т.д. ...

15 октября 2009

Категории: Delphi, переменные


Обновление: 9 декабря 2009

2010 © GameDev.ru
не PDA версия