Помогите n00b!Перевести C union to pascal вариант записи
Я пишу привязки для библиотеки C, и я наткнулся на декларацию о союзе/вариант записи. Я пытался заставить его работать, но не повезло.
Оригинальный код C:
struct _PurpleConversation
{
PurpleConversationType type;
PurpleAccount *account;
char *name;
char *title;
gboolean logging;
GList *logs;
union
{
PurpleConvIm *im;
PurpleConvChat *chat;
void *misc;
} u;
PurpleConversationUiOps *ui_ops;
void *ui_data;
GHashTable *data;
PurpleConnectionFlags features;
GList *message_history;
};
Мой перевод:
TPurpleConversation = record
convtype : TPurpleConversationType;
account: PPurpleAccount;
name : PChar;
title: PChar;
logging: Boolean32;
logs: PGlist;
ui_ops: TPurpleConversationUiOps;
ui_data : Pointer;
data: PGHashTable;
features : TPurpleMessageFlags;
message_history : PGList;
case u : integer of
0:(
im: PPurpleConversationIm;
chat: PPurpleConversationChat;
misc: Pointer;
);
end;
То, что я думаю, что это неправильно с этим:
- Первое, что является неправильно с ним заключается в том, что запись varayant находится в другом месте, но в Pascal ее можно разместить только в конце записи.
- Вариант записи ложно объявлен.
Я попросил некоторую помощь от канала #fpc, и два возможных варианта, на которые они указывали, состоят в том, чтобы сделать две записи (одну с только записью варианта), а вторая - использовать этот оператор case. Последний вариант должен быть наиболее совместимым.
У меня нет предыдущего опыта с этим заявлением в Паскале, так что кто-нибудь может объяснить, как это работает?
Спасибо!
Вы читали описание с типичными примерами (http://docwiki.embarcadero.com/RADStudio/XE3/en/Structured_Types#Variant_Parts_in_Records)? Если да, можете ли вы добавить более подробную информацию о проблеме? – Ilya
Это не работает и выдает сбой хост-приложение, и, на мой взгляд, проблема в том, что запись не является тем, что ожидает библиотека C. – Klamberext