-
- а нахрена тут юнион? Оставьте одну структуру с полями uint16_t и
без всяких паков. Я давно заметил, что всякие не мейнстримовые коды
не тестируются компиляторастроителями и могут вызывать ошибочное
поведение. - abivan(25.08.2022 18:41)
- юнион, чтобы писать/читать данные по протоколу, насколько я помню,
тип битового поля не приводится. - VLLV(25.08.2022 18:56)
- еще как приводится. abivan(288 знак., 25.08.2022 19:07)
- юнион, чтобы писать/читать данные по протоколу, насколько я помню,
тип битового поля не приводится. - VLLV(25.08.2022 18:56)
- т.к. unsigned [int] - это 32 бита, однако занято из них только 2
байта, то новый компилятор оптимизирует размер структуры. Чтобы
везде было одинаково, я бы написал uint32_t val. тогда точно будет
4 байта. - il-2(25.08.2022 12:48)
- Проверено, не работает, см ниже. - VLLV(25.08.2022 14:04)
- "Вы невнимательны" @Анекдот про патологоанатома. Перечитайте еще
раз. - il-2(26.08.2022 05:40)
- UPD Извините, хотелось бы уточнить. Правильно ли я понимаю, что речь
идёт об изменении unsigned на uint32_t ? Т.е. описание структуры из корня ветки следует переписать с teap0t(257 знак., 26.08.2022 09:56 - 10:14)
- UPD главная фишка здесь в uint32_t val; , остальное не важно - =AlexD=(26.08.2022 10:09)
- Ну, то есть, я правильно в итоге написал ? - teap0t(26.08.2022 10:13)
- правильно - =AlexD=(26.08.2022 10:28)
- Ну, то есть, я правильно в итоге написал ? - teap0t(26.08.2022 10:13)
- UPD главная фишка здесь в uint32_t val; , остальное не важно - =AlexD=(26.08.2022 10:09)
- Да, спасибо. - VLLV(26.08.2022 09:32)
- UPD Извините, хотелось бы уточнить. Правильно ли я понимаю, что речь
идёт об изменении unsigned на uint32_t ? Т.е. описание структуры из корня ветки следует переписать с teap0t(257 знак., 26.08.2022 09:56 - 10:14)
- "Вы невнимательны" @Анекдот про патологоанатома. Перечитайте еще
раз. - il-2(26.08.2022 05:40)
- Проверено, не работает, см ниже. - VLLV(25.08.2022 14:04)
- Кейл51, например, произвольно внутри структуры битовые поля тусовал как ему удобнее. Может и тут то же самое плюс выравнивание до удобной битности... POV(628 знак., 25.08.2022 11:45)
- Может с разными стандартами компилируются файлы? Oman(364 знак., 25.08.2022 11:40)
- смотреть как в памяти раскладывает ) - Aleksey_75(25.08.2022 11:21)
- joint и disjoint стратегии не должны влиять, т.к. типы битфилдов одинаковые - Oman(25.08.2022 11:41)
- unsigned — это сокращение от unsigned int, то есть 4 байта.
Странно, что там 2 байта вообще возникало. Но вообще pragma pack —
нестандартная фича, стоит ли удивляться, что в таких мелких
заморочках могут происходить изменения между версиями? - SciFi(25.08.2022 11:15)
- Замена на uint16_t в старой версии уменьшает размер до 2 байт.
Замена на uint32_t в новой версии не увеличивает размер до 4 байт. Добавление поля с суммарным количеством бит 21
делает 3 байта. Хреново, это данные конфигурации, при обновлении ПО
она будет слетать, нужно специально отслеживать. - VLLV(25.08.2022 11:44)
- Я редко такое использую, но уж если использую, то стараюсь до
желаемого размера добить uint32_t rezerved:17 или сколько надо. А
тут еще и #pragma pack(push,1) - вот и пакует до байта. - Andreas(25.08.2022 12:06)
- +100500 Компилятору нужно говорить всё конкретно, если хочешь зарезервировать 32 бита для параметров, так и зарезервируй их ЯВНО, а не занимайся изучением багофич отдельных версий оптимизатора. - =AlexD=(25.08.2022 14:43)
- Я в свое время отказался от упаковки, но тут "просочилось". К сожалению, формат хранения некоторых данных должен совпадать с форматом в протоколе. - VLLV(25.08.2022 12:11)
- какие свойства компилятора стоят на файлах в 8ке и 9ке? В 8ке
скорее всего Standart C или Strict C (мб С89?). В 9ке Standart C
with IAR extensions или C++ - Oman(25.08.2022 12:00)
- Одинаковые, Standart C with IAR extensions - VLLV(25.08.2022 12:05)
- Такие вещи можно отслеживать через assert(). А если повезёт, можно сконструировать подходящий static_assert(). - SciFi(25.08.2022 11:46)
- Я редко такое использую, но уж если использую, то стараюсь до
желаемого размера добить uint32_t rezerved:17 или сколько надо. А
тут еще и #pragma pack(push,1) - вот и пакует до байта. - Andreas(25.08.2022 12:06)
- Замена на uint16_t в старой версии уменьшает размер до 2 байт.
Замена на uint32_t в новой версии не увеличивает размер до 4 байт. Добавление поля с суммарным количеством бит 21
делает 3 байта. Хреново, это данные конфигурации, при обновлении ПО
она будет слетать, нужно специально отслеживать. - VLLV(25.08.2022 11:44)
- а нахрена тут юнион? Оставьте одну структуру с полями uint16_t и
без всяких паков. Я давно заметил, что всякие не мейнстримовые коды
не тестируются компиляторастроителями и могут вызывать ошибочное
поведение. - abivan(25.08.2022 18:41)