Как я могу преобразовать союз C в Delphi? - PullRequest
0 голосов
/ 10 февраля 2019

Я конвертирую библиотеку C в Delphi.У меня проблема с преобразованием кода ниже.Эта структура используется для связи, поэтому порядок должен быть правильным.

Delphi

Tparam_union_params_t = packed record
  case Integer of
    0: (param_float:single);
    1: (param_int32:Int32);
    2: (param_uint32:UInt32);
    ...
    ...
end;

Tparam_union_t = packed record
  param:Tparam_union_params_t // This method requires var name.
  type:UInt8;
end;

C Lang

#ifdef __GNUC__
  #define PACKED( __Declaration__ ) __Declaration__ __attribute__((packed))
#else
  #define PACKED( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
#endif

PACKED(
typedef struct param_union {
    union {
        float param_float;
        int32_t param_int32;
        uint32_t param_uint32;
        int16_t param_int16;
        uint16_t param_uint16;
        int8_t param_int8;
        uint8_t param_uint8;
        uint8_t bytes[4];
    }; // This no-named union. no-named is important.
    uint8_t type;
}) param_union_t;

Мой метод требует имя переменной, но оригинал cКод не назван.Как мне преобразовать анонимный союз или структуру в C в Delphi?

1 Ответ

0 голосов
/ 10 февраля 2019

То, что у вас есть, неплохо, но в моей статье Подводные камни конвертации Я описываю немного более приятную технику для обработки такого объединения без имени:

param_union_p = ^param_union_t;
param_union_t = packed record
  case Integer of
    0: (param_float: Single);
    1: (param_int32: Int32);
    2: (param_uint32: UInt32;    // add the members after the union to the largest branch.
        &type: UInt8);
    3: (param_int16: Int16);
    ...
    ...
end;
PParamUnion = ^TParamUnion;
TParamUnion = param_union_t;

Вместоветвь UInt32 также может быть добавлена ​​к ветке Single или Int32 того же размера.Это все равно приведет к тому же макету памяти, что и структура в C, с &type по смещению 4 и размером записи 5, и это все, что имеет значение.Просто взгляните на диаграмму в статье для уточнения:

enter image description here

Таким образом, нет необходимости присваивать соединительной части свой собственный тип исобственное имя.Если вы не доверяете «уловке», используйте код , который я дал в той же статье , чтобы проверить смещения в C и в Delphi.

Borland и Embarcadero, а также Delphi-JEDI, используйте (d) тот же трюк для перевода анонимных союзов, и записи Delphi TVarRec (для array of const параметров) и TVarType (для вариантов) также создаются таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...