WiseLord:
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.
на всякий случай, не касаясь собственно структур
[uquote="pokk",url="/forum/viewtopic.php?p=3240362#p3240362"]Допустим как-то так, и надо выявить какая именно авария произошла.[/uquote]
не надо так делать если нужно регистрировать множество различных и возможно одновременных ошибок, удобнее битовые маски
и затем в структуре объявить поле этого типа, в функциях сравнивать значение этого поля с константами, задавать константами его значение и т.п.? ну то есть как обычно все делают?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV, имеете ввиду как-то так ?Да выглядит красивее, но мне дальше надо было проверять, какой либо из параметров в аварии, и не охото было условий 6-7 ставить.
это вот что должно означать? на месте компилятора я бы эту функцию выкинул, как бессмыленно-бесполезную. для обработки состояния лично я бы написал так:
Ну да, я обычно так и делаю все на case, это я так в блокноте накидал для примера, но в любом случае, кучу проверок дальше это не отменяет, что бы перепроверить все эти переменные, для зажигании лампочки авария.
[uquote="ARV",url="/forum/viewtopic.php?p=3241502#p3241502"]как обычно все и делают[/uquote]
для единичных статусов да, а для множественных - таки обычно маски.
[uquote="pokk",url="/forum/viewtopic.php?p=3240450#p3240450"]WiseLord:
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.[/uquote]
Не знаю, берет ли компилятор, но можно ему задать выравнивание перед объявлением структуры:
[uquote="Zat",url="/forum/viewtopic.php?p=3241741#p3241741"]]
И дальше, зная что каждое поле занимает 1 байт обращаемся как к массиву. Даже если будут разные типы, мы же знаем их
размер, но будет чуть сложнее.[/uquote]
не надо так делать. __packed__ и прочее для случаев, когда без них не обойтись (например, для заголовкой сетевых пакетов).
У автора вопроса явно не этот случай.
Не надо никаких union-ов. Зачем запутывать? Если четыре поля ошибок нормально (я не телепат), то
Просто, понятно, переносимо, будет работать, как и задуманно (копировать три нужных поля) если в структуру добавить еще полей (и не важно в каком порядке) и даже, если в будущем поле увеличится (например, uint16_t error2;). А если еще и имена полей и функций будут отражать суть - по мне, так вообще будет хорошо.
Чем не устраивает?
Мммм, у меня затык в вроде бы простом месте. Препроцессор. Есть макрос COMMAPOS, который я могу назвать LEFT, RIGHT или не назвать совсем.
Так вот, если я этот макрос не определяю, то почему-то компилируется условие #if, а не #else:
#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'
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
[uquote="uldemir",url="/forum/viewtopic.php?p=3244433#p3244433"]Есть макрос COMMAPOS, который я могу назвать LEFT, RIGHT или не назвать совсем.[/uquote]
Так определяете?
[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3244521#p3244521"]А LEFT во что определён? Если ни во что - то ваш #if сравнивает ничто с ничем. А они равны. :-D[/uquote]
емнип поведение в #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.
[uquote="pokk",url="/forum/viewtopic.php?p=3240362#p3240362"]Добрый день подскажите в С как нибудь можно в цикле по полям структуры пройтись? и проверить их скажем на больше меньше числа. А в C ++ ?
Допустим как-то так, и надо выявить какая именно авария произошла.
Type_error Err1;
Type_error Err2;
Err1.error1=Err2.error1; // Вот это как сделать по феншую ?
Err1.error2=Err2.error2;
Err1.error3=Err2.error3;
[/uquote]
А обязательно структура нужна ? Если бы это был постоянный ввод с неизвестным размером данных, это одно. Но тут же все
в пределах размера стека. Можно и без структуры обойтись.
[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3244521#p3244521"]А LEFT во что определён? Если ни во что - то ваш #if сравнивает ничто с ничем. А они равны. :-D[/uquote]Ага, тогда если бы я перед этим определил