Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вложенные структуры

590
17 июля 2007 года
Gigahard
223 / / 03.04.2006
Имеется структура union содержащая в себе структуру bitfield'ов и переменную short int.
Применяется для быстрого чтения/записи двубайтового регистра.
Код:
union Test
{
struct
{
        unsigned bit0:1;
        unsigned bit1:1;
        unsigned bit2:1;
        unsigned bit3:1;
        unsigned bit4:1;
        unsigned bit5:1;
        unsigned bit6:1;
        unsigned bit7:1;
}bits;
short int value;
}tzt;
tzt.value=0xFA;

Тут возникает вопрос. Так ли уж обязательно указывать тип вложенной структуре, если она существует только в единственном экземпляре в рамках внешней структуры?
В приведенном выше примере, у структуры содержащей битовые поля не объявлено имя типа. Насколько это корректно? С одной стороны, подтверждений правильности подобного написания я не нашел. А с другой стороны, какой смысл плодить лишние имена...

Кстати, насколько гарантировано то, что битовые поля структуры будут храниться в байте в том порядке в котором они объявлены?

Т.е. насколько корректно вообще подобное преобразование данных через union?
350
17 июля 2007 года
cheburator
589 / / 01.06.2006
1. Подобная запись вполне корректна (как использование union, так и использование безымянной структуры). В стандарте предусмотрены как именованные типы, так и безымянные, использование и тех, и других легально.
2. "Преобразование типов" через union также вполне корректно, и часто практикуется (по крайней мере, практиковалось). Правда, есть определенные ограничения на использование объединений, связанных, например, с деструкторами. В данном случае проблем нет.
3. Битовые поля, насколько мне известно, хранятся именно в том порядке, в каком объявлены.
4. В качестве альтернативного варианта можно предложить не объявлять вложенную структуру вообще, сам union заменить, скажем, на структуру или класс, short int value оставить, а для доступа к битам перегрузить оператор [].
Примерный код:
Код:
class Test
{
public:
  const short int get_byte ()
  {
    return value;
  };
  const short int operator [] (size_t index)
  {
    // Можно вставить проверку на то, чтобы index не превышал 7
    return (value >> index) & 1;
  };
private:
  short int value;
}

Для доступа к отдельным битам можно рекомендовать bitset:
#include <bitset>
...
bitset<8> bits; // Восемь бит
Это зависит от используемого языка - С или С++.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог