Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Union в разных компиляторах.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
MicroDiP
Столкнулся в апликухе от Микрочипа (в исходнике) с таким моментом. Код написан под MCC18. Я использую IAR-pic18. Вопрос - каким образом они объявили объединение вот таким образом:

Код
typedef union _BD_STAT
{
    byte _byte;
    struct{
        unsigned BC8:1;
        unsigned BC9:1;
        unsigned BSTALL:1;
        unsigned DTSEN:1;
        unsigned INCDIS:1;
        unsigned KEN:1;
        unsigned DTS:1;
        unsigned UOWN:1;
    };
    struct{
        unsigned BC8:1;
        unsigned BC9:1;
        unsigned PID0:1;
        unsigned PID1:1;
        unsigned PID2:1;
        unsigned PID3:1;
        unsigned :1;
        unsigned UOWN:1;
    };
    struct{
        unsigned :2;
        unsigned PID:4;                 //Packet Identifier
        unsigned :2;
    };
} BD_STAT;


Смущает собственно объявления нулевого, первого и седьмого битов в первых двух структурах (BC8, BC9 и UOWN). Ведь имена не должны повторяться ? О чём мне и сообщает IAR. Микрочиповский компилятор позволяет это делать ? 07.gif
zltigo
Некрасиво, конечно - "масло маслянное", но если компилятор пропускает, то криминального в результате ничего не будет.
Лучше убрать и не использовать впредь лишние дублирующие дефиниции.
MicroDiP
Цитата(zltigo @ Dec 23 2007, 01:11) *
Некрасиво, конечно - "масло маслянное", но если компилятор пропускает, то криминального в результате ничего не будет.
Лучше убрать и не использовать впредь лишние дублирующие дефиниции.


Да мне собственно интересно - это что: особенность MCC18 ? Ошибка ? Опечатка ? Просто хотел взять исходник за основу себе в проект, а раз его ИАР не принимает, то прийдётся сейчас все файлы править где эти биты встречаются. Хотя вот что интересно... Ради этого скачал себе MCC18 компилятор, "вынул" от туда C18_User_Guide... Читаю и там написано всё тоже самое:
Цитата
An anonymous structure defines an unnamed object. The names of the members of an anonymous structure must be distinct from other names in the scope in which the structure is declared. The members are used directly in that scope without the usual member access syntax.


Бред какой-то... Бывает такое, что апликухи могут содержать преднамеренные ошибки ? Другой версии я ПОКА не вижу.
Baser
Последние ИАРовские компиляторы вообще очень строго стали проверять все до мелочей. Даже ругаются на несоответствие параметров аргументам с char и unsigned char, хотя стоит галка "char is unsigned char. Приходится давить этот warning.

А в приведенном примере ИАРовцы правы: объявление union некорректное: а что если программист ошибся и назначил одинаковые имена разным битам?

Цитата(МикроДИП @ Dec 22 2007, 19:30) *
Да мне собственно интересно - это что: особенность MCC18 ? Ошибка ? Опечатка ? Просто хотел взять исходник за основу себе в проект, а раз его ИАР не принимает, то прийдётся сейчас все файлы править где эти биты встречаются.

Все править не нужно, уберите только дубликаты объявлений битов:
Код
typedef union _BD_STAT
{
    byte _byte;
    struct{
        unsigned BC8:1;
        unsigned BC9:1;
        unsigned BSTALL:1;
        unsigned DTSEN:1;
        unsigned INCDIS:1;
        unsigned KEN:1;
        unsigned DTS:1;
        unsigned UOWN:1;
    };
    struct{
        unsigned :2;
        unsigned PID0:1;
        unsigned PID1:1;
        unsigned PID2:1;
        unsigned PID3:1;
        unsigned :2;
    };
    struct{
        unsigned :2;
        unsigned PID:4;                 //Packet Identifier
        unsigned :2;
    };
} BD_STAT;
zltigo
Цитата(МикроДИП @ Dec 22 2007, 19:30) *
Бред какой-то... Бывает такое, что апликухи могут содержать преднамеренные ошибки ?

Это скорее всего допустимая (не нужная с моей точки зрения) особеность (излишнее умничание потакающее небрежному стилю ) компилятора.
Откорректируйте - поймет любой.
Преднамерянных ошибок нет, но к сожалению индийско-китайско-студенческий бред в AN совершенно обыденное явление sad.gif. Но что много более тоскливо, как правило, обработка ошибок и нештатных ситуаций отсутствует - типичные паркетные исходники sad.gif
MicroDiP
Спасибо. Да, действительно. Их же можно просто в одной из структур как два анонимных бита задать и всё.

Цитата(zltigo @ Dec 23 2007, 01:45) *
... но к сожалению индийско-китайско-студенческий бред в AN совершенно обыденное явление sad.gif. Но что много более тоскливо, как правило, обработка ошибок и нештатных ситуаций отсутствует - типичные паркетные исходники sad.gif


biggrin.gif

М-даа... Спасибо.
zltigo
Цитата(МикроДИП @ Dec 22 2007, 19:51) *
Их же можно просто в одной из структур как два анонимных бита задать и всё.

Что собственно вполне нормально сделано с этими-же битами в третьей структуре smile.gif.

P.S.
Кстати, использование фирменных фишек без всякой надобности тоже особенность - дабы непонимающие подсаживались на конкретный фирменный компилятор. По поводу Microchip - вспомнил, копался в исходниках (ввиду отсутствия нормальной документации) с их ENC28J60, так там заморочек под Microchip было заметно много, правда там лицензия прилагалась с условиями использования только с микрочиповскими продуктами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.