Цель лекции: изучить понятие, объявление и размещение в памяти
В отличие от других языков программирования С++ имеет структуру, называемую
Хотя все эти функции могут выполняться с помощью
Битовое поле – это элемент структуры, определенный как некоторое число битов, обычно меньшее, чем число битов в целом числе (оно по величине не превосходит машинного слова и зависит от реализации компилятора). Они предназначены для экономного размещения в памяти данных небольшого диапазона, обеспечивают удобный доступ к отдельным битам данных. Кроме того, с помощью
Элементом структуры может быть
struct [ИмяСтруктуры] { Тип1 ИмяПоля1 : ШиринаПоля1
Тип2 ИмяПоля2 : ШиринаПоля2
........................
ТипN ИмяПоляN : ШиринаПоляN
} ИмяСтруктуры;
где struct –
ИмяСтруктуры – идентификатор;
Тип1, ... ТипN – тип поля, который может быть только int, возможно, со спецификатором или ;
ШиринаПоля (длина) – целое неотрицательное десятичное число, значение которого обычно (в зависимости от реализации компилятора) не должно превышать длины машинного слова.
Например:
struct {
int c1 : 4;
int c2 : 12;
} ab;
Разрешается поле без имени (для этого надо указать только двоеточие и ширину), с помощью которого в структуру вводятся неиспользуемые биты (промежуток между значимыми полями). Нулевая ширина поля вводится, когда необходимо, чтобы следующее в данной структуре поле разместилось с начала очередного машинного слова.
Например, если нам нужны только биты и , то можно объявить структуру 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 можно употреблять . В этом случае определяется объединение с
Пример 1. В программе объединение позволяет сформировать код символа 'D' (равный 68):
#include "stdafx.h"
#include <iostream>
using namespace std;
union { char simb;
struct { int x:5;
int y:3;
} hh;
} cod;
int _tmain(int argc, _TCHAR* argv[]) {
cod.hh.x = 4;
cod.hh.y = 2;
cout << cod.simb; // выводит на экран символ 'D'
system("pause");
return 0;
}
Для обращения к
ИмяСтруктуры.ИмяПоля (* УказательНаСтруктуру). ИмяПоля УказательНаСтруктуру -> ИмяПоля
Например, для структуры с
struct {
int a : 10;
int b : 14;
} xx;
правомочны следующие операторы:
xx.a=1; xx.b=48; xx.a=xx.b=0;
От реализации зависит порядок размещения в памяти полей одной структуры. Поля могут размещаться как слева направо, так и справа налево. Любой код программ, использующий
Пример 2.
#include "stdafx.h"
#include <iostream>
using namespace std;
struct expl {
int i:2;
unsigned j:2;
int :2;
int k:2;
int dummy: 8;
} my;
int _tmain(int argc, _TCHAR* argv[]) {
my.dummy = 0;
my.i = 1;
my.j = 3;
my.k = -1;
printf("%d\n", my);
printf("Поля: %d\t%d\t%d", my.i, my.j, my.k);
system("pause");
return 0;
}
На рис 18.1 показывается, как выглядит переменная my в памяти.
(рис 18.1) Побитовое представление структурыПример 3. Иллюстрация возможностей объединений и структур с
В программе вводятся значения двух целых переменных m и n, и остатки от их деления на 16 заносятся соответственно в четыре младших и в четыре старших разряда одного байта. Таким образом, выполняется некоторая кодировка введенных значений переменных m и n. Затем печатается изображение содержимого сформированного байта.
Обратите внимание на использование объединения. В функции запись данных производиться в элементы (hh, входящей в объединение un, а результат выбирается из того же объединения un в виде одного байта. В функции происходит , входящей в объединение .
//Структуры, объединения и битовые поля
#include "stdafx.h"
#include <iostream>
using namespace std;
void binar (unsigned char); //прототип функции
unsigned char cod (int, int); // прототип функции
int _tmain(int argc, _TCHAR* argv[]) {
unsigned char k;
int m, n;
printf("m="); scanf("%d", m);
printf("n="); scanf("%d", n);
k=cod(m,n);
printf("cod=%u\n", k);
binar(k);
system("pause");
return 0;
}
/*Упаковка в один байт остатков от деления на 16 двух целых чисел*/
unsigned char cod (int a, int b) {
union {
unsigned char z;
struct {
unsigned int x : 4;//младшие биты
unsigned int y : 4;//старшие биты
} hh;
} un;
un.hh.x=a%16;
un.hh.y=b%16;
return un.z;
}
//двоичное представление байта
void binar (unsigned char ch) {
union {
unsigned char ss;
struct {
unsigned a0 : 1;
unsigned a1 : 1;
unsigned a2 : 1;
unsigned a3 : 1;
unsigned a4 : 1;
unsigned a5 : 1;
unsigned a6 : 1;
unsigned a7 : 1;
} byte;
} cod;
cod.ss=ch;
printf("Номер битов: 7 6 5 4 3 2 1 0\n");
printf("Значение битов: %d %d %d %d %d %d %d %d\n",
cod.byte.a7, cod.byte.a6, cod.byte.a5, cod.byte.a4,
cod.byte.a3, cod.byte.a2, cod.byte.a1, cod.byte.a0);
}
Результат выполнения программы:
Первый вариант
m=1 n=3 cod=49 Номер битов: 7 6 5 4 3 2 1 0 Значение битов: 0 0 1 1 0 0 0 1
Второй вариант
m=0 n=1 cod=16 Номер битов: 7 6 5 4 3 2 1 0 Значение битов: 0 0 0 1 0 0 0 0
Битовое поле – это элемент структуры, определенный как некоторое число битов, обычно меньшее, чем длина машинного слова.
Размещение битовых полей – это порядок следования битов в машинных словах.
Ширина битового поля – это количество битов, занимаемых полем.
Цель работы: изучить понятие, объявление и размещение в памяти
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, в которой выполнена разработка структуры с
Теоретические сведения.
Ознакомьтесь с материалом лекции 18.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными методами объявления и обработки структур с
Следует реализовать каждое задание в соответствии с приведенными этапами:
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
Контрольные вопросы
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.