Вопрос в том, не является ли использование таких структур признаком дурного тона что-ли... К работоспособности вопросов нет. Может в каких- то случаях их использование может привести к труднообнаруживаемым глюкам или еще чего?...
Вопрос в том, не является ли использование таких структур признаком дурного тона что-ли... К работоспособности вопросов нет. Может в каких- то случаях их использование может привести к труднообнаруживаемым глюкам или еще чего?...
Измерения датчиком HC-SR04 медленно растущего расстояния. Наблюдаются внезапные выбросы. Аналогичная картина на 3х разных... Читать далее
всем привет, немного повторюсь, есть 2 айфона 7 на интеле, у обоих периодически не работает разговорный микрофон, закономерности... Читать далее
В любом случае я видел и знаю юмж, и форвард никак не хуже юмж . Я проверял . Плюс Серёга даёт разъяснения если есть вопросы.поддержка... Читать далее
да, но чтобы зафиксировать такое официально дофига надо подпрыгиваний и если это не стабильно.. я не сдюжил у себя решить... Читать далее
Это попытка инициализации дисплея WH1602 в режиме 4 Бита, питание 5В сигналы подписаны соответственно может кто глянуть или... Читать далее
Нива 1.7 инжектор с регулятором давления топлива на рампе. Какое должно быть давление на входе в рампу на ХХ? 2 с хвостиком... Читать далее
Комментарии: 13
Boris
Любые non-local без должного оборачивания это прям bad-guy way
Anton
Где про это читать? Хочу мануал как правильно и почему так не правильно)
Boris
Любую книгу по программной архитектуре читаете, там обычно достаточно чётко приводится почему глобальные переменные это тот ещё троянский конь Такого манула нет, это наживное. Т.е. общее описание есть, а вот прям конкретного разбора кода конкретного продукта нет
Anton
1) Битовые поля - да их лучше не использовать т.к. их расположение в памяти сильно зависит от компилятора и иногда даже его версии. Например может возникнуть ситуация, когда такая структура передается по какому - то каналу связи на другую машину и там она будет интерпретирована неправильно. Также есть ряд случаев приводящих неопределенному поведению, например взятие указателя на битовое поле. 2) Глобальные переменные - зло, т.к. нарушают главный принцип разработки ПО - инкапсуляцию. Правильное ПО должно максимально состоять из самостоятельных компонентов, которые должны быть связаны между собой минимально насколько это возможно. Глобальные же переменные особенно те, которые расшариваются на всю программу в целом, могут быть изменены в любом месте этой программы и тем самым приводить к трудноотлаживаемым ошибкам. А так же сильно запутывают логику программы и тем самым усложняют её понимание.
Anton
спасибо
Artem
Спасибо, полезно, теперь ясно, как делать не надо:)
Igor
Спорное утверждение про битовые поля. Особенно если учесть, что как правило для одного проекта используют один компилятор. По крайней мере читабельность, на мой взгляд, упрощается.
Anton
Читабельность упрощается, но представьте себе ситуацию, вы начали записывать такие структуры на флешку, прошло время изделия уже в серии и вам потребовалось обновить прошивку, компилятор так же обновился и структуры стали не совместимы.
Dmitry
А можно по подробнее, что именно там зависит от компилятора? В стандартах 98-х и 11-х плюсов про "зависит от компилятора" я ничего не увидел.
Anton
Это скорее связано с реализацией выравнивания структур в памяти. Разные компиляторы и их версии могут делать это по разному.
Dmitry
ну так выравнивание имеет отношение ко всем структурам, независимо от битовых полей. Имхо attribute ((packed)) - must have для всех протокольных вещей. В таком комплекте(packed и битовые поля) никаких неожиданностей не будет. Единственный минус битовых полей связан с работой со многими потоками - но это отдельная история(на хабре была статья - если надо - найду)
Anton
https://en.cppreference.com/w/cpp/language/bit_field Multiple adjacent bit fields are usually packed together (although this behavior is implementation-defined) Ключевое слово - implementation-defined
Igor
typedef struct { uint64_t engineTemp: 8; uint64_t engineRPM: 8; uint64_t unused2: 8; uint64_t unused3: 8; uint64_t unused4: 8; uint64_t unused5: 8; uint64_t unused6: 8; uint64_t unused7: 8; } map_0x380_t; В зависимости от пришедшего пакета я просто обращаюсь к значению через union Мне показалось это довольно удобным.