-
- Эк вас разбирает. Чувствую, хорошие у меня вопросы. Вон какая куча умников собралась. Это всё код STшных библиотек "STM32L1xx_StdPeriph_Driver" teap0t(727 знак., 17.09.2020 19:33)
- Я конечно не такой спец по сям, как тут присутствуют, но как я
понимаю, !DISABLE будет только в одном случае, который еще, в
добавок ко всему, может зависеть от некоторых сторонних факторов,
которые иногда могут вылезти боком в самых неожиданных случаях.
Согласно булевой парадигмы в сях логично было бы указать, что
ENABLE != DISABLE, тогда ENABLE может иметь любое значение отличное
от DISABLE и в этом случае ваш вопрос по поводу того, что "условие "= !DISABLE" выполняется ir0407(366 знак., 17.09.2020 17:42)
- А вот я тоже инстиктивно не доверяю assert_param, только я бы
написал попроще: enum (DISABLE=0, ENABLE, EN_QTY); #define
IS_VALID_STATE(state) ((uint8_t)state < EN_QTY) - VLLV(17.09.2020 18:01)
- И чему будет равно IS_VALID_STATE(1025)? - йцyкeн(17.09.2020 19:19)
- Ок, unsigned int - VLLV(17.09.2020 20:50)
- Вы все дураки и не лечитесь, один я... #define IS_BOOLEAN(b) ((b)
== !!(b)) - SciFi(17.09.2020 18:06)
- 1) Элегантно-омерзительно 2)boolean это ваще новодел - VLLV(17.09.2020 18:18)
- Boolean -- это слово в английском языке, и оно там было задолго до появления сей. - SciFi(17.09.2020 21:07)
- 1) Элегантно-омерзительно 2)boolean это ваще новодел - VLLV(17.09.2020 18:18)
- И чему будет равно IS_VALID_STATE(1025)? - йцyкeн(17.09.2020 19:19)
- А вот я тоже инстиктивно не доверяю assert_param, только я бы
написал попроще: enum (DISABLE=0, ENABLE, EN_QTY); #define
IS_VALID_STATE(state) ((uint8_t)state < EN_QTY) - VLLV(17.09.2020 18:01)
- Доктор, где вы такие картинки берёте? Сколько лет пишу на C/C++ -
никогда такого не видел. Ну почему не написать {DISABLE = 0, ENABLE
= 1} или {DISABLE = 0, ENABLE}? - йцyкeн(17.09.2020 11:41)
- Это код STшных библиотек "STM32L1xx_StdPeriph_Driver". - teap0t(17.09.2020 19:37)
- Этот код как бы говорит "видишь, не надо меня использовать". - SciFi(17.09.2020 19:49)
- Ну, блин! Это же главное в Си - чужие библиотеки, которые позволяют
всё делать гораздо быстрее. Я в них разбираюсь сейчас, чтобы
привыкнуть к виду сишного текста, оборотам языка, идиомам и т.д. И
положа руку куда-нибудь, а чего плохого-то? Определили базовое
значение и определили условие несоответствия базе, которое будет
работать везде, хотя может отличаться в разных системах. Понятно
как определили, и как проверяют тоже понятно. Нормальный код. Мне
сама идея чужих teap0t(146 знак., 17.09.2020 20:48)
- Давайте отделим мух от котлет. Если библиотека работает, почему бы её не использовать? Но отсюда никак не следует, что полагается учиться языку программирования, глядя в её код. Есть представления о хорошем стиле программирования, которые более-менее совпадают у бывалых товарищей, и эти же бывалые товарищи называют программную продукцию STM индусским говнокодом. - SciFi(17.09.2020 20:58)
- Использовать или нет - тут ещё могут быть разные мнения. Но не зная
бродаязыка Си учиться на примере этих индусов... мазохизм какой-то. - йцyкeн(17.09.2020 20:22)- Выяснение "как неправильно" - это тоже обучение. Этот код работает. Ошибок в нём нет. Предупреждения я исправил (осталось только одно, но там адресная арифметика, которую надо осторожно разбирать). Ошибку в программе исправил. Температуру она теперь кажет правильно. Дальше хочу попробовать без IAR расширений языка. Каждое исправление или ответ на вопрос, закрывающий тему - это шаг вперёд. Приходится же исправлять ошибки. Для этого надо понимать что мне говорит компайлер и т.д teap0t(333 знак., 17.09.2020 20:40)
- Ну, блин! Это же главное в Си - чужие библиотеки, которые позволяют
всё делать гораздо быстрее. Я в них разбираюсь сейчас, чтобы
привыкнуть к виду сишного текста, оборотам языка, идиомам и т.д. И
положа руку куда-нибудь, а чего плохого-то? Определили базовое
значение и определили условие несоответствия базе, которое будет
работать везде, хотя может отличаться в разных системах. Понятно
как определили, и как проверяют тоже понятно. Нормальный код. Мне
сама идея чужих teap0t(146 знак., 17.09.2020 20:48)
- Этот код как бы говорит "видишь, не надо меня использовать". - SciFi(17.09.2020 19:49)
- Я вообще не пойму, зачем DISABLE/ENABLE. Чем не устраивает true/false? "bool megadevice_disabled = true, protection_enabled = false;" - SciFi(17.09.2020 11:58)
- Это код STшных библиотек "STM32L1xx_StdPeriph_Driver". - teap0t(17.09.2020 19:37)
- Лайфхак: !!(что-то) даёт ноль, если (что-то) равно нулю, и единицу в противном случае. - SciFi(17.09.2020 10:58)
- Не правильно. enum - это набор чисел. DISABLE это число 0, !DISABLE
- это тоже какое-то число (компиляторозависимо), предположим (-1).
Тогда проверка превращается в (((STATE) == 0) || ((STATE) ==
(-1))). А тут, очевидно, STATE=2 не пройдет проверку - AlexBi(17.09.2020 10:07)
- Схерали -1? Вообще-то !0 == 1. В остальном справедливо. - SciFi(17.09.2020 10:49)
- (-1) было очень давно, когда еще встроенного типа bool не
существовало, а было только самодельное BOOL. Сейчас согласен,
операция ! применяется к bool, и стандарт требует превращения true
в 1. Т.е. записывая !0 имеем неявное (int)-(bool)-(!)-(int) - AlexBi(17.09.2020 11:14)
- Кстати, операция ! применяется к арифметическим типам (можно и к
float, например) и указателям. Результат этой операции имеет тип
int. Так что не надо нас путать, мы и сами запутаемся. - SciFi(17.09.2020 12:21)
- Мне кажется там идет двойное/тройное преобразование
(что-то)-(int)-(bool)-(! bool)-(int). Т.е. должен подойти любой
тип, умеющий превращаться в int - AlexBi(17.09.2020 12:44)
- Типы преобразовываться могут только один раз. A->B->C...
невозможно. Если А непосредственно не конвертируется в C -- не
заработает. - fk0легенда(17.09.2020 14:58, ссылка)
- Это интересно, но здесь даже нет преобразования. Оператор ! -- это сравнение с нулём, и если аргумент целое, плавучка или указатель, всё это работает немного по-разному. У целого -- простое сравнение с нулём, у плавучки -- сравнение с 0.0 (там уже может играть режим округления и т.п.), у указателя -- сравнение с нулевым указателем (который на какой-нибудь экзотической архитектуре может иметь ненулевое двоичное представление). - SciFi(17.09.2020 18:02)
- Да, я поторопился, встроенный во встроенный должны преобразовываться за один шаг. - AlexBi(17.09.2020 15:56)
- !0.1 == 0, !(int)0.1 == 1. - SciFi(17.09.2020 14:31, ссылка)
- Убедил. Мое представление о bool оказалось не правильным - AlexBi(17.09.2020 16:00)
- Типы преобразовываться могут только один раз. A->B->C...
невозможно. Если А непосредственно не конвертируется в C -- не
заработает. - fk0легенда(17.09.2020 14:58, ссылка)
- Мне кажется там идет двойное/тройное преобразование
(что-то)-(int)-(bool)-(! bool)-(int). Т.е. должен подойти любой
тип, умеющий превращаться в int - AlexBi(17.09.2020 12:44)
- Когда было !0 == -1? Хочу всё знать. - SciFi(17.09.2020 11:22)
- У борланда, из прошлого века. Но могу и ошибаться, давно это было,
почему-то (-1) записалось в моей памяти и всплыло первым. - AlexBi(17.09.2020 12:38)
- (int32t) -1 = 0xFFFFFFFF... - Гyдвинволшебник(17.09.2020 12:45)
- проверил на компиляторе от мелкомягких 89 года !0 == 1. Может еще давнее :) - abivan(17.09.2020 12:14)
- У борланда, из прошлого века. Но могу и ошибаться, давно это было,
почему-то (-1) записалось в моей памяти и всплыло первым. - AlexBi(17.09.2020 12:38)
- Кстати, операция ! применяется к арифметическим типам (можно и к
float, например) и указателям. Результат этой операции имеет тип
int. Так что не надо нас путать, мы и сами запутаемся. - SciFi(17.09.2020 12:21)
- (-1) было очень давно, когда еще встроенного типа bool не
существовало, а было только самодельное BOOL. Сейчас согласен,
операция ! применяется к bool, и стандарт требует превращения true
в 1. Т.е. записывая !0 имеем неявное (int)-(bool)-(!)-(int) - AlexBi(17.09.2020 11:14)
- OK - teap0t(17.09.2020 10:14)
- Схерали -1? Вообще-то !0 == 1. В остальном справедливо. - SciFi(17.09.2020 10:49)