سؤال

لدي هذا الاتحاد:

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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top