2013-09-15 1 views
-2

Delphi может выровнять записи на словах, словах с двойным словом и четырех словах в зависимости от настройки {$A} и версии Delphi.Как определить, на каком смещении Delphi выравнивает поля моей записи

Если я должен следующий (плохой) код:

ofSize = $00;  <<-- hardcoded will break if I unpack the record.  
    ofMSB = $01; 
    ofPtrDigits = $02; 
    ofSign = $06;     

    MinSizeBigint: Byte = 10; 

type 
    TBigint = packed record 
    Size: Byte; 
    MSB: Byte; 
    PtrDigits: Pointer; 
    Sign: TSignValue; 

Как превратить его в это:

type 
    TBigint = record 
    PtrDigits: Pointer; (*should be `array of cardinal`, but never mind that*) 
    Size: Byte; 
    MSB: Byte; 
    Sign: TSignValue; 

ofSize = OffsetOf(TBigInt.Size); <<-- does a function like this exist?  
ofMSB = OffsetOf(TBigInt.Size); 
ofPtrDigits = OffsetOf(TBigInt.Size); 
ofSign = OffsetOf(TBigInt.Size); 

Есть ли функция, которая будет заполнять коррекций для меня, используя какая-то магия компилятора?

+1

Совсем недавно обсуждали здесь: http://stackoverflow.com/вопросы/18786986/может, мы орудию-ANSI-CS-offsetof-в-Дельфы –

ответ

-1

Обход, но не реальный ответ ...

Заменить этот код:

.... 
@Exit: 
    mov byte ptr [ebx+ofMsb], cl <<-- hardcoded offset, only works with 
    mov dword ptr [edi+edx*4], 1  `packed record` 
.... 

С этим

@Exit: 
    mov byte ptr [ebx+TBigint.MSB], cl <<-- Delphi will put the correct offset 
    mov dword ptr [edi+edx*4], 1 
Смежные вопросы