Как правильно объявить структуру - 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д