] И дальше, зная что каждое поле занимает 1 байт обращаемся как к массиву. Даже если будут разные типы, мы же знаем их размер, но будет чуть сложнее.
не надо так делать. __packed__ и прочее для случаев, когда без них не обойтись (например, для заголовкой сетевых пакетов). У автора вопроса явно не этот случай.
Не надо никаких union-ов. Зачем запутывать? Если четыре поля ошибок нормально (я не телепат), то
Просто, понятно, переносимо, будет работать, как и задуманно (копировать три нужных поля) если в структуру добавить еще полей (и не важно в каком порядке) и даже, если в будущем поле увеличится (например, uint16_t error2;). А если еще и имена полей и функций будут отражать суть - по мне, так вообще будет хорошо. Чем не устраивает?
Мммм, у меня затык в вроде бы простом месте. Препроцессор. Есть макрос COMMAPOS, который я могу назвать LEFT, RIGHT или не назвать совсем. Так вот, если я этот макрос не определяю, то почему-то компилируется условие #if, а не #else:
Код:
#if COMMAPOS == LEFT #warning Left #else #warning Not LEFT #endif
#if COMMAPOS == RIGHT #warning Right #else #warning Not right #endif
Так что если макрос не определён, я получаю:
Цитата:
main.c:498: warning: (162) #warning: Left main.c:505: warning: (162) #warning: Right
Хотя ожидал получить в обоих случаях "not".
Что я не понимаю?
Чёрт, да ему до фонаря на значение этого макроса!
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Например, следующий фрагмент использует значение ACTIVE_COUNTRY для определения денежного знака:
Код:
#define US 0 #define ENGLAND 1 #define FRANCE 2 #define ACTIVE_COUNTRY US #if ACTIVE_COUNTRY==US char currency[] = "dollar"; #elif ACTIVE_COUNTRY==ENGLAND char currency[] = "pound"; #else char currency[] = "franc"; #endif
С цифрами, конечно, работает.
Хм. вот еще нагуглил: •Expressions must have integral type and can include only integer constants, character constants, and the defined operator Как понять character constant? это один символ?
Добавлено after 39 minutes 10 seconds: Ага. Этот фокус работает: #define COMMAPOS 'L' #if COMMAPOS == 'L'
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
А LEFT во что определён? Если ни во что - то ваш #if сравнивает ничто с ничем. А они равны. :-D
емнип поведение в #if при сравнении с идентификатором, не определенным как макрос, в стандарте не описано и дано на откуп компилятору. GCC, к примеру, приводит их к числовому нулю
Цитата:
expression is a C expression of integer type, subject to stringent restrictions. It may contain: ... - Identifiers that are not macros, which are all considered to be the number zero. This allows you to write #if MACRO instead of #ifdef MACRO, if you know that MACRO, when defined, will always have a nonzero value. Function-like macros used without their function call parentheses are also treated as zero.
Или перекопировать из одной переменной Type_error в другую с таким же типом , только несколько полей скажем все кроме одного.
Код:
Type_error Err1; Type_error Err2; Err1.error1=Err2.error1; // Вот это как сделать по феншую ? Err1.error2=Err2.error2; Err1.error3=Err2.error3;
А обязательно структура нужна ? Если бы это был постоянный ввод с неизвестным размером данных, это одно. Но тут же все в пределах размера стека. Можно и без структуры обойтись.
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:3 Медали: 1
Может заработало бы, а может и нет. Вообще, негоже сравнивать что-то неопределённое, хоть в макросе, хоть в коде. Странно, что компилятор на это не матерится. Правильней было бы сделать через :
Код:
#if !defined( COMMAPOS ) // или #ifndef .... // Тут действия, при неопределённом "COMMAPOS" #else .... // Тут действия, при определённом "COMMAPOS" #endif
PORTB=LED[0]; // вывод A. (вместе с точной) ... PORTB=LED[1]; // вывод B. (вместе с точной) ... PORTB=LED[2]; // вывод C. (вместе с точной) ... и т.д. ))
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
dm211 писал(а):
вот остаток кода,связанный с этим-
Что-то у Вас какая-то путаница в коде. Маски какие-то, массив символов из 3-х рядов (причём одинаковых), ... Зачем это всё ? Создали одномерный массив для символов и выбираем из него нужный символ, записывая в порт. Всё.
Маски какие-то, массив символов из 3-х рядов (причём одинаковых), ... Зачем это всё ? Создали одномерный массив для символов и выбираем из него нужный символ, записывая в порт. Всё.
Угу, при нынешней дешивезне изготовления pcb, "кулибинство" в разводке пинов под 7сегментник -лишний геморрой в софте. Это было оправдано ещё лет так 5 назад, при рассово-верном лутЪ.
Сейчас и софтовый ногодрыг для LED -лишь блажь и УГ. В юзаемых тобой 32пЫк есть же DMA?
Угу, при нынешней дешивезне изготовления pcb, "кулибинство" в разводке пинов под 7сегментник -лишний геморрой в софте.
ну я например извращался для stm8s103f3 - там тупо нет ни одного целого порта gpio, физически разведенного на ноги) максимум порт D, от него есть 6 пинов Спойлер
Код:
.... typedef struct { GPIO_TypeDef* port; GPIO_Pin_TypeDef pin; }segment_t; ... segment_t seg[8]={ {GPIOD, GPIO_PIN_1}, // A {GPIOD, GPIO_PIN_2}, // B {GPIOD, GPIO_PIN_3}, // C {GPIOD, GPIO_PIN_4}, // D {GPIOC, GPIO_PIN_4}, // E {GPIOC, GPIO_PIN_5}, // F {GPIOC, GPIO_PIN_7}, // G {GPIOC, GPIO_PIN_6} // DP };
#define SEG_DP_MASK 0b10000000
// set bit represents live segments: DP G F E D C B A // 0b 0 0 0 0 0 1 1 0 uint8_t digit_mask[10]={ 0b00111111, // 0 0b00000110, // 1 0b01011011, // 2 0b01001111, // 3 0b01100110, // 4 0b01101101, // 5 0b01111101, // 6 0b00000111, // 7 0b01111111, // 8 0b01101111 // 9 }; ... #define writeHigh(port,pins) port->ODR |= (pins) #define writeLow(port,pins) port->ODR &= ~(pins) #define ValBit(VAR,Place) ((uint8_t)(VAR) & (uint8_t)((uint8_t)1<<(uint8_t)(Place))) ... void led_setbuf(uint16_t newval){ buf[0]=digit_mask[newval%10]; newval/=10; buf[1]=digit_mask[newval%10]; newval/=10; buf[2]=digit_mask[newval%10]|SEG_DP_MASK; } ... void led_display_digit(uint8_t seg_mask) { uint8_t i; for (i = 0; i < 8; i++) { if (ValBit(seg_mask,i) == 0) { writeLow(seg[i].port, seg[i].pin); } else { writeHigh(seg[i].port, seg[i].pin); } } } ...
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения