Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2014_2015 / LECT7_new1.pptx
Скачиваний:
9
Добавлен:
27.12.2015
Размер:
1.12 Mб
Скачать

Пример объявления битовых полей: unsigned color : 4;

unsigned underline : 1;

Содержимое битового поля может описываться как имеющее знак (signed), так и как беззнаковое (unsigned) - эти ключевые слова записываются в поле тип. Каждому полю выделяется точно столько бит, сколько задается в поле ширина. Ссылка на битовое поле выполняется по имени, указываемому в поле имя. Если имя в этом поле опущено, запрошенные биты все равно выделяются, но доступ к ним невозможен > надо учитывать длину машинного слова при работе с битовыми полями.

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

struct names

{

char * P_Family; char * P_Name; char * P_SecName;

};

typedef struct

{

unsigned lymph_ unsigned : 11; //ровняем names Patient; //

int structure:1; //0 // 1

int cell_sructure:3;

2 – кубическая, 3 – цилиндрическая,

4 – полигональная, 5-столбчатые,

6 – веретеновидная, 7 – есть миот. aктивность */ int cell_membrane:1; //0 – тонкая, 1 - грубая

int cell_membrane_state:2; //0 – ровная, 1 - неровная

При ссылке на поле в выражениях по маске

выделяются нужные биты и при необходимости выполняется сдвиг числа вправо.

В результате это число вступает в операцию в соответствии с типом как число со знаком или без него.

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

ВНИМАНИЕ!!! Используйте, только если очень надо экономить место (на диске, в памяти) !!!

Проблем больше, чем преимуществ

Union - объединение (куча) - подобно структуре в том,

что содержат поля различных типов, но помещаемые в одно и то же место памяти, т. е. доступ к одному и тому же месту памяти, но по-разному.

Как и для структур, различают шаблон объединения и переменную, созданную по шаблону.

Ключевым различием объединения и структурной переменной является то, что все поля объединения начинаются с одной границы.

Длиной объединения является максимальная из длин отдельных полей шаблона.

Тип поля может быть любым, в том числе и структурой.

Доступ к полям объединения выполняется через

селектор поля '.', либо ссылка формируется операцией ->, если для доступа используется указатель на объединение.

Разрешается создание массива объединений.

Объединение может инициализироваться только первым описанным полем.

Применения объединений:

доступ к одной и той же области памяти либо как к целому, либо к отдельным частям;

формирование целого из частей, например, far- указателя по известным значениям смещения и сегмента;…..

экономия динамической памяти.

Не всегда переносится на другие компьютеры и платформы: зависит от соглашения о выравнивании в

памяти типов данных объединения

Пример:

union diagnosis

{

char code; int ID;

char *d_name;

}

ОСТОРОЖНО!!!! ИСПОЛЬЗОВАТЬ ТОЛЬК В КРАЙНЕМ СЛУЧАЕ!!!!

Создает новый тип, но не переменную для даль- нейшего использования надо объявить переменную этого типа. Обращение – как к элементам структуры

. . .

diagnosis diag1, dial2; char * s=‘lymph_node’; diag2. d_name=s; diag1.code=‘N’;

. . .

ВАЖНО!!! Следите, какое значение внесли в кучу последним!!! Если далее сразу написать

int ID=diag1.ID, получите бессмысленное значение, а

Соседние файлы в папке 2014_2015