تعدد الأشكال في C والمخازن المؤقتة
-
28-09-2019 - |
سؤال
لدي هذا الاتحاد:
typedef union Message
{
message_base base;
message_with_parameters parameters;
reply_message reply;
buffer_t *buffer; // can't figure out what to put here
} message;
message_with_parameters
لديه message_base
كمجال أول و reply_message
لديه message_with_parameters
كما هو الحال في الحقل الأول الذي بدوره message_base
كما الحقل الأول.
لذلك يمكنني الوصول إلى أي منها في الأساس ، وسأظل أحصل على جميع البيانات التي أحتاجها ، ومع ذلك أحصل على مخزن مؤقت من سائقتي والآن أريد أن أقوم بتسلسلها في الرسالة.
أعرف بالفعل أن المؤشر إلى المخزن المؤقت خطأ لأنه لن يرتبط بهياكلاتي ، لكن لا يمكنني الحصول على مخزن مؤقت للحجم ثابت.
في مكان ما على طول الطريق أريد أن أفعل هذا:
m->buffer = buff->payload;
وبغض النظر عن نوع البيانات التي لدي ، فسيظل ذلك متسلسلًا.
كيف يمكن أن تتم؟
تعديل:
ها هي بنيتي:
typedef struct MessageBase
{
uint32_t u32DeviceID;
uint32_t u32CoreID;
uint16_t u16Class;
uint16_t u16CRC;
uint8_t u8OpCode;
void (*states [MAX_OPCODES]) (void *);
} message_base;
typedef struct MessageWithParameters
{
message_base base_class;
uint8_t u8Param1;
uint8_t u8Param2;
} message_with_parameters;
typedef message_with_parameters reply_message;
typedef union Message
{
message_base base;
message_with_parameters parameters;
reply_message reply;
} message;
المحلول
لأن البيانات الموجودة في المخزن المؤقت ليست جزءًا من الاتحاد.
Buffer_T* Buffer هو مؤشر ، وبالتالي فإن المؤشر جزء من الاتحاد ، وليس البيانات التي يشير إليها
أنت تريد أن تفعل شيئًا مثل
m = (message*) buff->payload;