Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
933.3 Кб
Скачать

10.7.3. Поля битов (с)

До сих пор минимальными адресуемыми элементами программы являлись объекты размером в 1 байт. Примерами таких объектов являлись данные типа char в языке C и типа Byte в языке Basic. Однако байт содержит 8 битов (двоичных цифр). Язык C позволяет манипулировать с отдельными битами информации. Такая необходимость возникает, в основном, при программировании аппаратуры, входящей в состав ПК, или программно-аппаратного комплекса. Средством реализации такой возможности является особый вид структуры, имеющий в качестве элементов так называемые поля битов.

Записываются такие структуры следующим образом:

struct{

unsigned [<имя>]: <число битов>;

..........................

}

Пример. Формат регистра состояния ГД RX211.

struct{

unsigned error :1;

unsigned initialize :1;

unsigned addr :2;

unsigned rx02 :1;

unsigned :2;/* Hе используются */

unsigned density :1;

unsigned trreg :1;

unsigned enable :1;

unsigned done :1;

unsigned select :1;

unsigned funct :3;

unsigned go :1;

}save_211;

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

10.7.4. Объединения (смеси) (с)

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

union [<тип>]{

описание элемента 1;

описание элемента 2;

...................;

описание элемента n;

}[<список>];

Пример.

union{

float radius; // Окружность

float side[2]; // Прямоугольник

float triangle[3]; // Треугольник

float point[2]; // Точка

}GeomFig;

В каждый момент времени в памяти, отведенной объединению, может находиться только один элемент, т.е. память используется элементами поочередно. Размер отводимой памяти определяется размером наиболее "длинного" элемента. В примере это "треугольник" – 12 байтов.

Заметим, что обобщением понятия объединения является тип данных Object в языке Basic.

10.7.5. Переменные структуры

Переменной называют структуру, в состав которой входит хотя бы 1 смесь.

Общая схема построения такой структуры следующая:

struct{

общие компоненты,

признак активной компоненты (тэг),

union{

переменные компоненты

}<имя>;

........................................................

}<имя структуры>;

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

Пример.

Паспортные данные:

- фамилия имя отчество,

- серия,номер,

- дата рождения,

- место рождения,

- национальность,

- прописка,

- семейное положение:холост|женат|разведен,

- переменная часть,

- военнообязанный:да|нет.

enum sem_pol{holost, genat, razveden};

struct pasport{

char fio[30];

char nomer[12];

data birthdate;

char mesto[15];

char nation[15];

char propis[40];

enum sem_pol pr;

union{

/* холост - пусто */

/* женат */

struct{

data svadba;

char wife_fio[30];

unsigned chislo_children;

struct{

char name[15];

char pol;

struct data birthdate;

}children[PAZMEP];

}sostav;

/* разведен */

data razvod_day;

}sem_sost;

unsigned char priziv;

};

Весьма вероятно, что подобные структуры можно реализовать и в языке Basic, используя вместо union тип Object.

10.8. Тип object (B)

Данные типа Object могут содержать значения других типов данных во время выполнения одной программы. Переменные этого типа или, вообще, не имеют определения (неявное объявление) или объявляются с ключевым словом Object: Dim <имя_переменной> As Oblect.

Переменная такого типа содержит адрес объекта, который был ей присвоен. Этот адрес всегда занимает 4 байта памяти, однако надо иметь в виду, что под само значение также выделяется память.Таким образом можно считать, что переменная типа Object занимает 4 байта+объем под значение. В выражениях переменные типа Object ведут себя в соответствии с типом присвоенного значения. Если было присвоено значение типа Integer, то переменная работает как целая, если – типа String, то – как строка. Транслятор сам распознает внутренний тип переменной.

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

- данные занимают, в общем случае, больше памяти, чем переменные обычных типов;

- их употребление может привести к труднообнаруживаемым ошибкам.

Например, оператор "+" применим и к числовым, и к строковым данным. В первом случае он выполняет операцию сложения, во втором – сцепление.

Пример.

a="10"

b="11"

a+b "1011"

b=11

a+b 21

Если один операнд типа Object содержит числовое значение, а второй – строковое, то второй операнд будет преобразован в число, если это возможно, если нет, то возникнет ошибка Type mismatch (Несогласование типов). При необходимости получения строкового результата нужно использовать оператор "&".

Рекомендация. По возможности не следует использовать данные типа Object. По крайней мере, это надо делать при достаточном опыте программирования.

10.9. Тип delegate (B)

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

Формат объявления:

Delegate {Function | Sub} <имя> ([<список параметров>]) [As <тип>]

Для подпрограммы тип возвращаемого значения отсутствует.

Пример. Объявление типа UndInteg для вызова любой функции (метода), принимающей 1 параметр типа Double и возвращающей значение типа Double. См. интегрирование методом трапеций в разделе 7.3.2.

Delegate Function UndInteg(ByVal x As Double) As Double

Для функций, имеющих другой список параметров и тип возвращаемого значения (или его не имеющего для Sub) надо объявлять другой тип делегата.

Пример. Для обычного и максиминного умножения матриц.

Delegate Sub MultMatrix(ByVal m As Short, ByVal n As Short, _

ByVal p As Short, ByRef a(,) As Single, _

ByRef b(,) As Single, ByRef c(,) As Single)

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

Пример.

Dim DelF1 As UndInteg ' Переменная типа делегата

…………………………..

DelF1=AddressOf F1 ‘ Задание адреса функции F1

………………………….

' Передача адреса подинтегральной функции в процедуру интегрирования

y = Integr(0.15, alfa, 200, DelF1)

Функция Integr имеет следующий заголовок:

Function Integr(ByVal a As Double, ByVal b As Double, ByVal k As Short, _

ByRef F As UndInteg)

Параметр F имеет тип делегата UndInteg и может принимать адрес любой подинтегральной функции, что делает процедуру интегрирования универсальной.

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