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

4. Пример программы

Устройство сообщает о своем состоянии с помощью нескольких чисел.

Например, пусть состояние устройства представляется в виде:

C – код состояния (число в диапазоне от 0 до 31);

F – признак ошибки (1/0) ;

B – признак занятости (0/1);

N – количество байт, переданных в последней операции (число в диапазоне от 0 до 255).

Эти числа объединяются в одно слово состояния устройства, формируемое таким образом:

№ разряда

15

14

13

12

11

10

09

08

07

06

05

04

03

02

01

00

Значение

C

C

C

C

C

0

F

B

N

N

N

N

N

N

N

N

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

Программа должна вызывать функцию упаковки при указании опции -р в командной строке, а функцию распаковки – при указании опции -u.

Полный текст программы приведен в приложении.

4.1. Функция упаковки

Нам будут нужны переменные, в которых будут храниться составные части кода. Для сохранения всех составных частей будет будем использовать тип unsigned . Диапазоны возможных значений этих переменных:

c - код состояния - 0 ...31

f - признак ошибки - 0, 1

b - признак занятости - 0, 1

n - количество байт - 0 ... 255

Нужна также переменная для сохранения результирующего кода слова состояния устройства UnitStateWord. Это 2-байтная переменная, у которой старший разряд используется как кодовый, а не как знаковый. Так что, эта переменная должна быть типа unsigned .

Алгоритм функции состоит из таких шагов:

1. Ввод значений составных частей слова состояния устройства. Для каждой составной части нужно вывести приглашение на ввод и ввести данные.

2. Занесение в слово состояния устройства кода состояния. У переменной, которая хранит значение кода состояния, нужно выделить 5 младших разрядов - это можно сделать, выполнив операцию "побитовое логическое И" между значением переменной и двоичной константой 00011111 (16-ричной константой 1F). Потом полученное значения следует сдвинуть на 11 разрядов влево.

UnitStateWord=(c&0x1F)<<11;

3. Занесение в слово состояния устройства признака ошибки. В переменной - признаке ошибки выделить один младший разряд - операция "побитовое логическое И" с константой 1. Полученное значение сдвинуть на 9 разрядов влево. Чтобы добавить полученный код к тому коду, который уже получен на предыдущем шаге, нужно выполнить операцию "побитовое логическое ИЛИ" между предыдущим значением слова состояния устройства и полученным кодом.

UnitStateWord|=(f&1)<<9;

4. Занесение в слово состояния устройства признака занятости. В переменной - признаке занятости выделить один младший разряд. Полученное значение сдвинуть на 8 разрядов влево и добавить к тому коду, который получен на предыдущем шаге .

UnitStateWord|=(b&1)<<8;

5. Занесение в слово состояния устройства количества байт. В переменной - количестве байт выделить 8 младших разрядов - "побитовое логическое И" с константой FF16. Полученное значение добавить к тому коду, который уже есть.

UnitStateWord|=n&0xFF;

Отметим, что если значения составных частей кода, введенные оператором, не выходят за диапазон допустимых для них значений, то операция выделения младших байтов излишня. Но мы предусматриваем ее на случай ошибок оператора.

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