Перейти к содержанию
    

Union в разных компиляторах.

Столкнулся в апликухе от Микрочипа (в исходнике) с таким моментом. Код написан под 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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Некрасиво, конечно - "масло маслянное", но если компилятор пропускает, то криминального в результате ничего не будет.

Лучше убрать и не использовать впредь лишние дублирующие дефиниции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Некрасиво, конечно - "масло маслянное", но если компилятор пропускает, то криминального в результате ничего не будет.

Лучше убрать и не использовать впредь лишние дублирующие дефиниции.

 

Да мне собственно интересно - это что: особенность 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.

 

Бред какой-то... Бывает такое, что апликухи могут содержать преднамеренные ошибки ? Другой версии я ПОКА не вижу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Да мне собственно интересно - это что: особенность 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бред какой-то... Бывает такое, что апликухи могут содержать преднамеренные ошибки ?

Это скорее всего допустимая (не нужная с моей точки зрения) особеность (излишнее умничание потакающее небрежному стилю ) компилятора.

Откорректируйте - поймет любой.

Преднамерянных ошибок нет, но к сожалению индийско-китайско-студенческий бред в AN совершенно обыденное явление :(. Но что много более тоскливо, как правило, обработка ошибок и нештатных ситуаций отсутствует - типичные паркетные исходники :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Да, действительно. Их же можно просто в одной из структур как два анонимных бита задать и всё.

 

... но к сожалению индийско-китайско-студенческий бред в AN совершенно обыденное явление :(. Но что много более тоскливо, как правило, обработка ошибок и нештатных ситуаций отсутствует - типичные паркетные исходники :(

 

:biggrin:

 

М-даа... Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Их же можно просто в одной из структур как два анонимных бита задать и всё.

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

 

P.S.

Кстати, использование фирменных фишек без всякой надобности тоже особенность - дабы непонимающие подсаживались на конкретный фирменный компилятор. По поводу Microchip - вспомнил, копался в исходниках (ввиду отсутствия нормальной документации) с их ENC28J60, так там заморочек под Microchip было заметно много, правда там лицензия прилагалась с условиями использования только с микрочиповскими продуктами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...