Объединение как элемент структуры



Объединения часто включаются в структуры, один из элементов которых является ключом, указывающим тип хранимого в памяти элемента объединения.

Например:

//содержит информацию о работающих служащих и пенсионерахstruct mail {        char id; // a - active (), r - retired()        union {               struct {                       char name[30];                       char dept[10];                       char location[3];                      } active;               struct {                       char name[30];                       char street[20];                       char city_state[3];                       char zip[5];                      } retired;              } info;       } person;

Структура типа struct mail используется для хранения почтового адреса работающего служащего или пенсионера ( рис. 1). При заполнении структуры этого типа информацией в нее заносится порция данных, соответствующая элементам active или retired объединения info. Поле id устанавливается равным 'a' или 'r' для указания фактически записанного в объединении элемента. При применении объединения используется меньше памяти, чем в случае применения структуры, которая имела бы идентичные поля, но некоторые из них не использовались бы.


Рис.1. Объединение как элемент структуры

Переменные с изменяемой структурой

Очень часто некоторые объекты программы относятся к одному и тому же классу, отличаясь лишь некоторыми деталями. В таких случаях используются переменные с изменяемой структурой. Рассмотрим, например, представление геометрических фигур. Общая информация о фигурах может включать такие элементы, как площадь, периметр. Однако соответствующая информация о геометрических размерах может оказаться различной в зависимости от их формы.

Пример 2 . Информация о геометрических фигурах представляется на основе комбинированного использования структуры и объединения.

struct figure {          double area,perimetr; // общие компоненты          int type; // признак компонента          union { // перечисление компонент                  double radius; // окружность                  double a[2]; // прямоугольник                  double b[3]; // треугольник                 } geom_fig;         } fig1, fig2;

В общем случае каждый объект типа figure будет состоять из трех компонентов: area, perimetr, type. Компонент type называется меткой активного компонента, так как он используется для указания, какой из компонентов объединения geom_fig является активным в данный момент. Такая структура называется переменной структурой, потому что ее компоненты меняются в зависимости от значения метки активного компонента (значение type ). Отметим, что вместо компоненты type типа int, целесообразно было бы использовать перечисляемый тип. Например, такой

enum figure_chess {CIRCLE, BOX, TRIANGLE};

Константы CIRCLE, BOX, TRIANGLE получат значения соответственно равные 0, 1, 2. Переменная type может быть объявлена как имеющая перечислимый тип:

enum figure_chess type;

В этом случае компилятор С++ предупредит программиста о потенциально ошибочных присваиваниях, таких, например, как figure.type = 40 ;

В общем случае переменная структуры будет состоять из трех частей: набор общих компонент, метки активного компонента и части с меняющимися компонентами. Общая форма переменной структуры, имеет следующий вид:

struct {   ОбщиеКомпоненты; МеткаАктивногоКомпонента;   union {                ОписаниеКомпоненты1;          ОписаниеКомпоненты2;          ...................          ОписаниеКомпонентыN;         } ИдентификаторОбъединения;  } ИдентификаторСтруктуры;

Пример 3 . Определения переменной структуры с именем helth_record

struct { // общая информация         char name[25]; // имя         int age;     // возраст         char sex;    // пол         // метка активного компонента(семейное положение)   enum merital_status ins;   // переменная часть         union { // холост           // нет компонент          struct { // состоит в браке                        char marriage_date[8];                  char spouse_name[25];                  int no_children;                 } marriage_info;           // разведен */          char date_divorced[8];         } marital_info;  } health_record;enum marital_status { SINGLE, // холост                       MARRIGO, // женат                       DIVOREED // разведен                     };

Обращаться к компонентам структуры можно при помощи ссылок:

helth_record.nаme helth_record.ins helth_record.marriage_info.marriage_date

В отличие от других языков программирования С++ имеет структуру, называемую битовыми полями (полями битов), которая позволяет работать с отдельными битами. Битовое поле – это особый компонент структуры, определяющий длину отдельного ее элемента. Битовые поля полезны по нескольким причинам.

· Если ограничено место для хранения информации, можно сохранить несколько логических переменных в одном байте.

· Некоторые интерфейсы устройств передают информацию, закодировав биты в один байт.

· Некоторым процессам кодирования необходимо получить доступ к отдельным битам в байте.

Хотя все эти функции могут выполняться с помощью битовых операторов, битовые поля могут внести большую ясность в программу. Метод использования битовых полей для доступа к битам основан на структурах.

Битовое поле – это элемент структуры, определенный как некоторое число битов, обычно меньшее, чем число битов в целом числе (оно по величине не превосходит машинного слова и зависит от реализации компилятора). Они предназначены для экономного размещения в памяти данных небольшого диапазона, обеспечивают удобный доступ к отдельным битам данных. Кроме того, с помощью битовых полей можно формировать объекты с длиной внутреннего представления, не кратной байту.

Битовые поля обычно применяются в низкоуровневом программировании.

Объявление битовых полей

Элементом структуры может быть битовое поле, обеспечивающее доступ к отдельным битам памяти. Вне структур или объединений битовые поля объявлять нельзя. Нельзя также организовывать массивы битовых полей и нельзя применять к полям операцию определения адреса или получить ссылку на них.

Синтаксис объявления типа структуры с битовыми полями:

struct [ИмяСтруктуры] { Тип1 ИмяПоля1 : ШиринаПоля1                   Тип2 ИмяПоля2 : ШиринаПоля2                   ........................                   ТипN ИмяПоляN : ШиринаПоляN                 } ИмяСтруктуры;

где struct – спецификатор типа;

ИмяСтруктуры – идентификатор;

Тип1, ... ТипN – тип поля, который может быть только int, возможно, со спецификатором unsigned или signed ;

ШиринаПоля (длина) – целое неотрицательное десятичное число, значение которого обычно (в зависимости от реализации компилятора) не должно превышать длины машинного слова.

Например:

struct {   int c1 : 4;         int c2 : 12;        } ab;

Битовые поля длиной 1 должны объявляться как unsigned, поскольку 1 бит не может иметь знака. Битовые поля могут иметь длину от 1 до 16 бит для 16-битных сред и от 1 до 32 бит для 32-битных сред.

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

Например, если нам нужны только биты cts и dsr, то можно объявить структуру status_type следующим образом:

struct status_type {               unsigned : 4;                     unsigned cts :1;                     unsigned dsr :4;                    } status;

В структуре можно смешивать "обычные" элементы с битовыми полями.

Например:

struct emp {       struct addr address;       float pay;       unsigned lay_off: 1; //работает или нет       unsigned hourly: 1;//почасовая оплата или оклад       unsigned deductions : 3; //удержание налога      };

Эта структура определяет запись по каждому служащему, в которой используется только один байт для хранения трех элементов информации: статус служащего, характер оплаты его труда и налоговая ставка. Без использования битовых полей для хранения этой информации пришлось бы занять несколько байтов.

Вместо служебного слова struct можно употреблять union. В этом случае определяется объединение с битовыми полями. Битовые поля в объединениях используются для доступа к нужным битам того или иного объекта, входящего в объединение.

Пример 4 . В программе объединение позволяет сформировать код символа 'D' (равный 68):


Дата добавления: 2021-07-19; просмотров: 84; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!