printf("Цвет фона %s.\n", colors[pb->fill_color]);
Обратите внимание, что массив colors был определен так, чтобы каждое значение индекса соответствовало строковому представлению названия цвета, имеющего значение индекса, которое совпадает с числовым значением цвета. Например, индекс 1 соответствует строке "красный" и константа RED имеет значение 1.
Битовые поля и побитовые операции
Битовые поля и побитовые операции — это два альтернативных подхода к решению задачи программирования одного и того же типа. Это значит, что часто можно применять любой из подходов. В предыдущем примере для хранения информации о графическом окне использовалась структура с размером, как у типа unsigned int. Ту же самую информацию можно было бы сохранить в переменной типа unsigned int. Затем вместо синтаксиса членства в структуре можно было бы применять побитовые операции. Обычно такая методика не очень удобна. Рассмотрим пример, в котором задействованы оба подхода. (Оба подхода здесь применяются для иллюстрации отличий между ними, а вовсе не из-за того, чтобы внушить мысль о целесообразности их одновременного использования!)
В качестве средства комбинирования подхода на основе структуры и подхода на базе побитовых операций можно воспользоваться объединением. Исходя из существующего объявления типа struct box_props, можно объявить следующее объединение:
union Views /* взгляд на данные как на struct или как на unsigned short */
{
struct box_props st_view; unsigned short us_view;
};
В некоторых системах переменная unsigned short и структура box_props занимают 16 битов в памяти. В других системах, таких как наша, unsigned short и box props занимают 32 бита. В любом случае это объединение позволяет применять член st view, чтобы трактовать отведенную память как структуру, или использовать член us_view, чтобы рассматривать тот же самый блок памяти как значение unsigned short. Какие битовые поля структуры соответствуют отдельным битам переменной типа unsigned short? Это зависит от реализации и оборудования. В следующем примере предполагается, что структуры загружены в память, начиная с младших битов и заканчивая старшими битами байта. Другими словами, первое битовое поле в структуре соответствует биту 0 слова. (Для простоты эта идея иллюстрируется на рис. 15.3 для 16-битового единицы.)
В листинге 15.4 объединение Views применяется для сравнения подходов на основе битовых полей и побитовых операций. Здесь box — это объединение Views, поэтому box. st_view представляет собой структуру box props, использующую битовые поля, a box.ui view — те же самые данные, но представленные как значение
unsigned short.
648 Глава 15

Рис. 15.3. Объединение как целое число и как структура
Вспомните, что объединение может иметь инициализированный первый член, поэтому установленные значения соответствуют представлению структуры. Программа отображает свойства окна с помощью функции, основанной на представлении структуры, и также посредством функции, основанной на представлении unsigned short. Любой из подходов обеспечивает доступ к данным, но по-разному. Вдобавок в программе применяется определенная ранее в главе функция itobs(), которая позволяет отобразить данные в виде строки двоичных цифр, чтобы можно было видеть, какие биты включены, а какие выключены.
Листинг 15.4. Программа dual view. с

Манипулирование битами 649 

Ниже приведен вывод.
Исходные настройки окна: Окно непрозрачно.
Цвет фона желтый.
Рамка отображается.
Цвет рамки зеленый.
Стиль рамки штриховой.
Манипулирование битами 651
Настройки окна с использованием представления unsigned short:
Окно непрозрачно.
Цвет фона желтый.
Рамка отображается.
Стиль рамки штриховой.
Цвет рамки зеленый.
Комбинация битов 00000000000000000010010100000111
Измененные настройки окна:
Окно прозрачно.
Цвет фона голубой.
Рамка отображается.
Цвет рамки желтый.
Стиль рамки пунктирный.
Настройки окна с использованием представления unsigned short:
Окно прозрачно.
Цвет фона голубой.
Рамка не отображается.
Стиль рамки пунктирный.
Читать дальше