Объединение как элемент структуры
Объединения часто включаются в структуры, один из элементов которых является ключом, указывающим тип хранимого в памяти элемента объединения.
Например:
//содержит информацию о работающих служащих и пенсионерах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, целесообразно было бы использовать перечисляемый тип. Например, такой
|
|
Константы 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 // разведен };Обращаться к компонентам структуры можно при помощи ссылок:
|
|
В отличие от других языков программирования С++ имеет структуру, называемую битовыми полями (полями битов), которая позволяет работать с отдельными битами. Битовое поле – это особый компонент структуры, определяющий длину отдельного ее элемента. Битовые поля полезны по нескольким причинам.
· Если ограничено место для хранения информации, можно сохранить несколько логических переменных в одном байте.
· Некоторые интерфейсы устройств передают информацию, закодировав биты в один байт.
· Некоторым процессам кодирования необходимо получить доступ к отдельным битам в байте.
Хотя все эти функции могут выполняться с помощью битовых операторов, битовые поля могут внести большую ясность в программу. Метод использования битовых полей для доступа к битам основан на структурах.
Битовое поле – это элемент структуры, определенный как некоторое число битов, обычно меньшее, чем число битов в целом числе (оно по величине не превосходит машинного слова и зависит от реализации компилятора). Они предназначены для экономного размещения в памяти данных небольшого диапазона, обеспечивают удобный доступ к отдельным битам данных. Кроме того, с помощью битовых полей можно формировать объекты с длиной внутреннего представления, не кратной байту.
|
|
Битовые поля обычно применяются в низкоуровневом программировании.
Объявление битовых полей
Элементом структуры может быть битовое поле, обеспечивающее доступ к отдельным битам памяти. Вне структур или объединений битовые поля объявлять нельзя. Нельзя также организовывать массивы битовых полей и нельзя применять к полям операцию определения адреса или получить ссылку на них.
Синтаксис объявления типа структуры с битовыми полями:
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!