Как правильно объявить структуру - C (СИ)
Формулировка задачи:
Есть вот такая вот структурка:
проблема в том что она занимет, от 12 до 24 байт в зависимости от компилятора, вместо ожидаемых шести.
Смысл её в том, что есть некоторые события
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;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)