Как правильно объявить структуру - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть вот такая вот структурка:
typedef struct {
    
    // 1st byte (event code)
    union {
        struct {
            unsigned char kind   : 1;  /* 0 - info, 1 - fault        */
            unsigned char source : 1;  /* 0 - irrigation, 1 - diesel */
            unsigned char is_new : 1;  /* 0 - was read, 1 - not read */
            unsigned char ev_num : 5;  /* event ordinal number       */
        };
        unsigned char code;            /* full event code with falgs */
        unsigned char byte0;           /* byte 0 of event struct     */
    };
    
    // 2nd, 3rd, 4th, 5th bytes (date and time)
    union {
        struct {
            unsigned int year    : 6;  /* year (x - 2014)            */
            unsigned int month   : 4;  /* month (1-12)               */
            unsigned int day     : 5;  /* day (0-31)                 */
            unsigned int hour    : 5;  /* hours (0-23)               */
            unsigned int minute  : 6;  /* minutes (0-60)             */
            unsigned int second  : 6;  /* seconds (0-60)             */
        };
        struct {
            unsigned int byte1   : 8;  /* byte 1 of event struct     */
            unsigned int byte2   : 8;  /* byte 2 of event struct     */
            unsigned int byte3   : 8;  /* byte 3 of event struct     */
            unsigned int byte4   : 8;  /* byte 4 of event struct     */
        };
    };
    
    // 6th byte (checksum)
    union {
        unsigned char cs;              /* checksum                   */
        unsigned char byte5;           /* byte 5 of event struct     */
    };
    
} ext_event_t;
проблема в том что она занимет, от 12 до 24 байт в зависимости от компилятора, вместо ожидаемых шести. Смысл её в том, что есть некоторые события

ext_event_t

, ктороые необходимо считывать побайтово, для этого используются элементы

byte0

-

byte5

, а далее доставать фактические данные с помощю остальных полей. Проблема: структура не работает так как надо и занимет выше ожидаемого размера, объясните что не так я написал? Основная реализация должна работать под Keil (

ARM C/C++ Compiler, 5.03 [Build 76] [MDK-ARM Lite]

) Если, возможно, есть другая идея как это можно реализовать, тоже буду благодарен.

Решение задачи: «Как правильно объявить структуру»

textual
Листинг программы
#pragma pack(push, 1)
описание структуры
#pragma pack(pop)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы