Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 3.2 (ч.1). Команды и данные. Абстракция да...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
624.15 Кб
Скачать

3.2.2.7 Объединения

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

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

объявление шаблона объединения ::= union, [ идентификатор ],

«{», объявление переменных | объявление массивов «}», «;»;

объявление объединений ::= идентификатор шаблона объединения,

идентификатор, [ «[», размерность, «]» ],

{ идентификатор, [ «[», размерность, «]» ] }, «;»;

Например:

union Key { // объявление шаблона объединения переменной Press и массива Codes

int Press; // переменная Press длиной 2 байта

char Codes [2]; // массив Codes длиной 2 байта

};

Key Touch; // объявление объединения Touch типа Key

Пусть, например, требуется определить, какая именно клавиша клавиатуры была нажата пользователем. Нажатие некоторой клавиши клавиатуры приводит к тому, что в буфер клавиатуры заносятся: ASCII-код нажатого символа (в младший байт) и расширенный Scan-код нажатой клавиши (в старший байт). Тогда инструкция Touch.Press = bioskey (0) при нажатии клавиши <Enter> занесет в Touch.Press значение 7181 (рисунок 3.2.4).

Рисунок 3.2.4

Поэтому: Touch.Codes[0] = 13 (ASCII-код 1101(2) 13(10)), а Touch.Codes[1] = 28 (Scan-код 11100(2) 28(10)).

Длина объединения определяется длиной элемента с максимальным размером. Элементом шаблона объединения может быть иное объединение или структура. К тому же и объединение может быть элементом какой-либо структуры.

С помощью объединения можно, например, трактовать многомерный массив как одномерный:

union Datеs { // объявление шаблона объединения двухмерного массива Y

// и одномерного массива X

int Y [2][5]; // двухмерный массив Y длиной 20 байтов

int X [10]; // одномерный массив X длиной 20 байтов

}; Datеs Symbols;

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

Масив X:

Адреса элементу:

Масив y:

Рисунок 3.2.5

И если, например, в X2 занести значение 25, то Y0,2 тоже станет равным 25. Пользуясь этим, можно, например, отсортировать элементы двухмерного массива Y, сортируя элементы одномерного массива X (что сделать значительно проще); это приведет к тому, что элементы массива Y тоже будут представлены в отсортированном виде.

К элементу объединения обращаются согласно образцу: идентификатор объединения.идентификатор элемента.

Если объединение объявлено как анонимное (безымянное), то обращаться к его элементу можно просто по имени элемента.

3.2.2.8 Перечисления

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

Перечисление объявляется в соответствии с правилами:

объявление шаблона перечисления ::= enum, [ идентификатор ],

«{», идентификатор, =, целое, {«,», идентификатор, =, целое }, «}», «;»;

объявление перечислений ::= идентификатор шаблона перечисления,

идентификатор, [ «[», размерность, «]» ],

{ идентификатор, [ «[», размерность, «]» ] }, «;»;

Пер­вый элемент перечисления по умолчанию инициализируется нулем, каждый последующий – значением, на единицу большим, чем предыдущий. Однако любой элемент перечисления можно явно инициализировать целой константой и это, естественно, оказывает влияние на все последующие элементы перечисления. Например:

enum Colors { // объявление шаблона перечисления Colors

Red(=0), Green = 4, Yellow(=5), Cyan = 8, Brown(=9);

};

Colors Palette1, Palette2; // объявление перечислений Palette1, Palette2 типа Colors

К элементу перечисления обращаются согласно образцу: идентификатор перечисления.идентификатор элемента, например: Palette1.Red (т.е. 0).

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

Colors XPal [20]; // каждый элемент массива XPal может принимать только

// значения из перечисления Colors

XPal [8] = Red; // XPal [8] = 0

XPal [3] = Yellow; // XPal [3] = 5

XPal [1] = 1; // неверно, поскольку 1 не является элементом перечисления Colors