C ++ структура с битовыми полями, преобразованными в Delphi 6 - PullRequest
1 голос
/ 07 марта 2019

благодаря статье Руди в Delphi Corner на C ++ -> преобразование Delphi Мне удалось преобразовать более или менее сложные структуры.

Я бы хотел спросить это сообщество, правильно ли то, что я сделал. Кроме того, у меня есть некоторые сомнения, чтобы распутать.

Вот что я сделал:

Из кода C ++:

typedef struct CorrId_t_ {
    unsigned int  size:8;       
    unsigned int  valueType:4; 
    unsigned int  classId:16;  
    unsigned int  reserved:4;  
    unsigned long long  intValue;
    } CorrId_t;

Я перевел на следующий код в Delphi (я написал несколько функций для доступа к битовому полю):

interface

type
   CorrId_t_ = record
      bitfield:Cardinal; //$000000FF=size; $00000F00=valueType; $0FFFF000=classId; $F0000000=reserved;
      intValue:Cardinal; //should be Uint64 but such integer type doesn't exist in Delphi 6
   end;

   CorrId_t = CorrId_t_;
   PCorrId_t = ^CorrId_t;

   procedure CorrID_setSize(var rec:CorrId_t; value:byte);
   procedure CorrID_setValueType(var rec:CorrId_t; value:byte);
   procedure CorrID_setClassId(var rec:CorrId_t; value:Word);

   function CorrID_getSize(rec:CorrId_t):Byte;
   function CorrID_getValueType(rec:CorrId_t):Byte;
   function CorrID_getClassId(rec:CorrId_t):Word;


implementation

procedure CorrID_setSize(var rec:CorrId_t; Value:Byte);
begin
    rec.bitfield := (rec.bitfield and $FFFFFF00) or Value;
end;

procedure CorrID_setValueType(var rec:CorrId_t; Value:Byte);
begin
    rec.bitfield := (rec.bitfield and $FFFFF0FF) or Value;
end;

procedure CorrID_setClassId(var rec:CorrId_t; Value:Word);
begin
    rec.bitfield := (rec.bitfield and $F0000FFF) or Value;
end;


function CorrID_getSize(rec:CorrId_t):Byte;
begin
  Result := rec.bitfield and $000000FF;
end;

function CorrID_getValueType(rec:CorrId_t):Byte;
begin
  Result := rec.bitfield and $00000F00;
end;

function CorrID_getClassId(rec:CorrId_t):Word;
begin
  Result := rec.bitfield and $0FFFF000;
end;

Вот мои вопросы к вам:

1) правильны ли побитовые операции (внутри функций set / get access)?

2) целочисленный тип "unsigned long long" не имеет соответствия в Delphi 6. Я могу выбирать между Int64 (но это подписано ) или 32-разрядным беззнаковым целочисленный тип, такой как кардинал. Какой, по вашему мнению, лучше всего использовать?

Заранее спасибо!

...