Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KL_PrJAVU230200.doc
Скачиваний:
32
Добавлен:
17.03.2015
Размер:
702 Кб
Скачать
☆

4.2. Объединения

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

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

Объединение описывается также, как и структура, со служебным словом union. Размер объединения определяется размером максимального поля.

Объединение может использоваться для:

  • Экономии памяти, если известно, что больше одного поля одновременно в программе не используется;

  • Создания неоднородных массивов данных;

  • Разной интерпретации одного и того же битового представления.

Продемонстрируем эти возможности на примерах.

Пример 1. Разместим в одной и той же области памяти целое число, дробное число и символ.

Union A

{

int a1;

double a2;

char a3;

} a;

Размер объединения a – 8 байт и в памяти может храниться либо целое, либо дробное, либо символ. Доступ к полям объединения осуществляется как у структур. Например:

a.a1=2;

a.a2=4.567;

a.a3=’r’;

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

Пример 2. Создать массив, содержащий три вида документов.

Опишем структуры A, B, C содержащие характеристики документов.

struct A

{

…

};

struct B

{

…

};

struct C

{

…

};

union Docum

{

struct A a;

struct B b;

struct C c;

};

Объявим массив из 10 документов различного вида:

struct Data

{

char flag; //для распознания вида документа

union Docum docum; //документ одного из трех видов

} data[10];

Пример 3. При работе системной функции поиска файла на диске findfirst, информация о найденном файле заносится в структуру ffblk, где дата и время создания файла находятся в упакованном виде (в виде данного типа unsigned).

Определить имя, размер и время создания какого-либо файла из текущего каталога.

#include<iostream.h>

#include<dir.h>

struct Time

{

unsigned sec : 5;

unsigned min : 6;

unsigned hour : 5;

};

union

{

unsigned PressTime; //время в упакованном виде

struct Time time;

} t;

void main (void)

{

struct ffblk ffblk;

if( findfirst(“*.*”, &ffblk, 0)!= -1)

{

cout<<“\nИмя файла - “<< ffblk.ff_name<<endl;

cout<<” размер - ”<< ffblk.ff_fsize<<endl;

t.PressTime=ffblk.ff_ftime;

cout<<“\nВремя создания (час.мин.сек)-”<<t.time.hour<<’.’<<, t.time.min<<’.’ <<t.time.sec*2<<endl<<endl;

}

}

4.3. Перечисления

Перечисления служат для улучшения читаемости программ, и позволяет естественным образом описывать объекты.

Перечислимый тип задается перечислением набора констант. Каждой константе ставится в соответствие целое число явно или по умолчанию от 0 с шагом 1.

Характерным примером может служить перечисление COLORS, описанное в conio.h:

enum COLORS

{

BLACK,

BLUE,

GREEN,

…

YELLOW,

WHITE

};

Можно создать переменную перечислимого типа

enum COLORS colors;

Присвоить ей конкретное значение

colors=RED;

И использовать ее в программе

textcolor (colors);

Или использовать непосредственно константу перечислимого типа

textbackground (WHITE);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]