Стандарт C ++ гласит:
Единицы распределения битовых полей на некоторых машинах, а не на других.
Так что, если мы посмотрим на
, то это очевидно
struct
{
uint8_t content : 4; // Depends on Group Type and Version codes.
uint8_t textABFlag : 1; // Do something if it chanhes from binary "0" to binary "1" or vice-versa
uint8_t programType : 5; // PTY (Program Type) code
uint8_t trafficProgramCode : 1; // (TP) => 0 = No Traffic Alerts; 1 = Station gives Traffic Alerts
uint8_t versionCode : 1; // (B0) => 0=A; 1=B
uint8_t groupType : 4; // Group Type code.
} refined;
что на машинах, где битовые поля не единицы размещения с перестановкой , content
и textABFlag
упакованы в первый октет, programType
(не умещается полностью в первом ) вместе с trafficProgramCode
и versionCode
, упакованными во второй, и groupType
в третий октет. Учитывая это,
uint8_t SI4735::getRdsGroupType(void)
{
si47x_rds_blockb blkb;
blkb.raw.lowValue = currentRdsStatus.resp.BLOCKBL;
blkb.raw.highValue = currentRdsStatus.resp.BLOCKBH;
return blkb.refined.groupType;
}
локальной переменной blkb
эта функция устанавливает только первые два октета (lowValue
и highValue
), но возвращает groupType
из неинициализированного третьего октета.
Чтобы надежно поместить все эти битовые поля в два октета, мы должны использовать uint16_t
вместо uint8_t
- но имейте в виду, что:
Битовые поля назначается справа налево на некоторых машинах, слева направо на других.