function END_OF.PAGE (FILE: in FILE_TYPE) return BOOLEAN;
function END_OF_PAGE return BOOLEAN;
function END.OFFILE (FILE: in FILE.TYPE) return BOOLEAN;
function END.OFFILE return BOOLEAN;
procedure SET_COL (FILE: in FILE-TYPE; TO: in POSITIVE_COUNT);
procedure SET.COL (TO: in POSITIVE_COUNT);
procedure SET.LINE (FILE: in FILE.TYPE; TO: in POSITIVE-COUNT);
procedure SET_LINE (TO: in POSITIVE-COUNT);
function COL (FILE: in FILE.TYPE) return POSITIVE-COUNT;
function COL return POSITIVE-COUNT;
function LINE (FILE: in FILE.TYPE) return POSITIVE-COUNT;
function LINE return POSITIVE .COUNT;
function PAGE (FILE: in FILE.TYPE) return POSITIVE-COUNT;
function PAGE return POSITIVE-COUNT;
- символьный ввод-вывод
procedure GET (FILE: in FILE.TYPE; ITEM: out CHARACTER);
procedure GET (ITEM: out CHARACTER);
procedure PUT (FILE: in FILE.TYPE; ITEM: in CHARACTER);
procedure PUT (ITEM: in CHARACTER);
- строковый ввод-вывод
procedure GET (FILE: in FILE.TYPE; ITEM: out STRING);
procedure GET (ITEM: out STRING);
procedure PUT (FILE: in FILE.TYPE; ITEM: in STRING);
procedure PUT (ITEM: in STRING);
procedure GET.LINE (FILE: in FILE.TYPE;
ITEM: out STRING;
LAST: out NATURAL);
procedure GET.LINE (ITEM: out STRING; LAST: out NATURAL);
procedure PUT.LINE (FILE: in FILE.TYPE; ITEM: in STRING);
procedure PUT.LINE (ITEM: in STRING);
- настраиваемый пакет для ввода-вывода целых типов
generic
type NUM is range < >;
package INTEGER _I0 is
DEFAULT-WIDTH: FIELD: = NUM'WIDTH;
DEFAULT.BASE: NUMBER-BASE: = 10;
procedure GET (FILE: in FILE-TYPE; ITEM: out NUM; WIDTH: in FIELD: = 0);
procedure GET (ITEM: out NUM; WIDTH: in FIELD: = 0);
procedure PUT (FILE: in FILE TYPE;
ITEM: in NUM;
WIDTH: in FIELD: - DEFAULT-WIDTH;
BASE: in NUMBER_BASE: = DEFAULT.BASE);
procedure PUT (ITEM: in NUM;
WIDTH: in FIELD: = DEFAULT-WIDTH;
BASE: in NUMBER-BASE: = DEFAULT-BASE);
procedure GET (FROM: in STRING; ITEM: out NUM; LAST: out POSITIVE);
procedure PUT (TO: out STRING;
ITEM: in NUM;
BASE: in NUMBER-BASE: = DEFAULT-BASE);
end INTEGER_IO;-
- настраиваемый пакет для ввода-вывода вещественных типов
generic
type NUM is digits < >;
package FLOAT_IO is
DEFAULT_FORE: FIELD: = 2;
DEFAULT_AFT: FIELD: = NUM'DIGITS -1;
DEFAULT EXP: FIELD: = 3;
procedure GET (FILE: in FILE_TYPE; ITEM: out NUM; WIDTH: in FIELD: = 0);
procedure GET (ITEM: out NUM; WIDTH: in FIELD: = 0) ;
procedure PUT (FILE: in FILE TYPE;
ITEM: in NUM;
FORE: in FIELD: = DEFAULT_FORE;
AFT: in FIELD: = DEFAULT, AFT;
EXP: in FIELD: = DEF AULT _EXP);
procedure PUT (ITEM: in NUM;
FORE: in FIELD: = DEF AULT-FORE;
AFT: in FIELD: = DEFAULT_AFT;
EXP: FIELD: = DEFAULT_EXP);
procedure GET (FROM: in STRING; ITEM: out NUM; LAST: out POSITIVE);
procedure PUT (TO: out STRING;
ITEM: in NUM;
AFT: in FIELD: = DEFAULT_AFT;
EXP: in FIELD: = DEFAULT,EXP);
end FLOAT IO;
generic
type NUM is delta < >;
package FIXED _IO is
DEFAULT_FORE: FIELD: = NUM'FORE;
DEFAULT,AFT: FIELD: = NUM'AFT;
DEFAULT_EXP: FIELD: = 0;
procedure GET (FILE: in FILE,TYPE; ITEM: out NUM; WIDTH: in FIELD: = 0);
procedure GET (ITEM: out NUM; WIDTH: in FIELD: = 0);
procedure PUT (FILE: in FILE_TYPE;
ITEM: in NUM;
FORE: in FIELD: = DEFAULT-FORE;
AFT: in FIELD: = DEFAULT_AFT;
EXP: ш FIELD: = DEFAULT-EXP);
procedure PUT (ITEM: in NUM;
FORE: in FIELD: = DEFAULT_FORE;
AFT: in FIELD: = DEFAULT_AFT;
EXP: in FIELD: = DEFAULT_EXP);
procedure GET (FROM: in STRING; ITEM: out NUM; LAST: out POSITIVE);
procedure PUT (TO: out STRING; ITEM: in NUM;
AFT: in FIELD: = DEFAULT_AFT;
EXP: in FIELD: = DEFAULT_EXP);
end FIXED_IO;
- - настраиваемый ракет для ввода-вывода перечислимых типов
generic
type ENUM is (О);
package ENUMERATION _IO is
DEF AULT —WIDTH: FIELD: = 0;
DEFAULT, SETTING: TYPE SET: = UPPERCASE;
procedure GET (FILE: in FILE TYPE; ITEM: out ENUM);
procedure GET (ITEM: out ENUM);
procedure PUT (FILE: in FILE-TYPE; ITEM: in ENUM;
WIDTH: in FIELD: = DEFAULT-WIDTH;
SET: in TYPE_SET: = DEFAULT-SETTING);
procedure PUT (ITEM: in ENUM;
WIDTH: in FIELD: = DEFAULT-WIDTH;
SET: in TYPE_SET: = DEFAULT-SETTING);
procedure GET (FROM: in STRING; ITEM: out ENUM;
LAST: out POSITIVE);
procedure PUT (TO: out STRING, ITEM: in ENUM;
SET: in TYPE_SET: = DEFAULT-SETTING);
end ENUMERATION _IO;
- - исключения
STATUS „ERROR: exception renames IO-EXCEPTIONS.STATUS_ERROR, MODE—ERROR: exception renames IO_EXCEPTIONS.MODE_ERROR;
NAME_ERROR: exception renames IO_EXCEPTIONS.NAME_ERROR; USE_ERROR: exception renames IO_EXCEPTIONS.USE_ERROR;
DEVICE-ERROR: exception renames IO-EXCEPTIONS.DEVICE_ERROR;
END_ERROR: exception renames IO_EXCEPTIONS.END_ERROR;
DATA—ERROR: exception renames I0_EXCEPTIONS.DATA_ERROR;
LAYOUT-ERROR: exception renames I0_EXCEPTIONS.LAYOUT_ERROR;
private
- определяется реализацией
end TEXT-IO;
Исключения при вводе-выводе
В этом разделе описаны исключения, которые могут быть возбуждены при выполнении операций ввода-вывода. Они описаны в пакете IO-EXCEPTIONS; определение этого пакета приведено в разд. 14.5. Этот пакет упоминается в спецификаторах контекста каждого из трех описанных пакетов ввода-вывода. Для исключений NAME-ERROR, USE—ERROR и DEVICE-ERROR описаны лишь общие характеристики условий возбуждения этих исключений; детальное описание должно быть приведено в руководстве по реализации в соответствии с обязательным приложением 4. Если существует более чем одно ошибочное условие, соответствующее одному исключению, то возбуждается то из них, которое раньше описано в данном ниже списке исключений.
Исключение STATUS_ERROR возбуждается при попытке выполнить действия над еще не открытым файлом или при попытке открыть уже открытый файл.
Исключение MODE_ ERROR возбуждается при попытке чтения или проверке конца файла с текущим видом OUT_FILE, а также при попытке записи в файл с текущим видом IN_FILE. Для пакета ТЕХТ_Ю исключение MODE—ERROR возбуждается также при использовании файла с текущим видом OUT—FILE в качестве параметра подпрограмм SET—INPUT, SKIP-LINE, END_OF_LINE, SKIP-PAGE и END_OF_PAGE и при использовании файла с текущим видом IN_FILE в качестве параметра подпрограмм SET-OUTPUT, SET_LINE_LENGTH, SET_P AGE-LENGTH, LINE-LENGTH, PAGE-LENGTH, NEW-LINE или NEW-PAGE.
Исключение NAME-ERROR возбуждается при вызове процедур CREATE и OPEN, если строка, заданная параметром NAME, не позволяет идентифицировать внешний файл. Например, это исключение возбуждается, если такая строка вообще недопустима или если ей либо не соответствует ни один внешний файл, либо соответствует несколько внешних файлов.
Исключение USE—ERROR возбуждается при попытке выполнить операцию, не разрешенную по причинам, зависящим от характеристик внешнего файла. Например, процедурой CREATE такое исключение может быть возбуждено при задании параметром MODE вида OUT_FILE, а параметром FROM устройства, допускающего только ввод, либо лри задании.парамет- ром FORM неверных прав доступа, либо, если внешний файл с данным именем уже существует и перезапись недопустима.
Исключение DEVICE-ERROR возбуждается при невозможности завершения операции ввода-вывода из-за неисправностей в используемой системе.
Исключение END_ERROR возбуждается при попытке пропустить признак конца файла (чтение за концом файла).
Исключение DATA—ERROR может быть возбуждено процедурой READ, если читаемый элемент нельзя интерпретировать как значение требуемого типа. Это же исключение возбуждается процедурой GET (определенной в пакете TEXT—Ю), если введенная последовательность символов не соответствует требуемому синтаксису или если введенное значение не принадлежит диапазону требуемого типа или подтипа.
Исключение LAYOUT—ERROR возбуждается (в текстовом вводе-выводе) при вызове функции COL, LINE или PAGE, если возвращаемое значение превышает COUNT'LAST. Это же исключение возбуждается при выводе: при попытке установить номер столбца или строчки, превышающий заданную максимальную длину строчки или страницы (кроме случая неограниченной длины строчки или страницы). Оно также возбуждается процедурой PUT при попытке вывести в строку ■слишком большое количество символов.
Спецификация пакета исключений ввода-вывода
В этом пакете определены исключения, необходимые для работы пакетов SEQUENTIAL_IO, DIRECT_IO и ТЕХТ_Ю.
package IO_EXCEPTIONS is
STATUS-ERROR: exception;
MODE ERROR: exception;
NAME_ERROR: exception;
USE_ERROR: exception;
DEVICE-ERROR, exception;
END_ERROR: exception;
DATA-ERROR: exception;
LAYOUT-ERROR: exception;
end IO_EXCEPTIONS;
Ввод-вывод низкого уровня
Операция ввода-вывода низкого уровня — это операция, выполняющаяся на физическом устройстве. Для выполнения таких операций используется одна из (совмещенных) предопределенных процедур SEND-CONTROL и RECEIVE-CONTROL.
Процедура SEND-CONTROL может быть использована для посылки управляющей информации физическому устройству. Процедура RECEIVE-CONTROL может быть использована для организации выполнения операции ввода-вывода, связанной с запросом информации от физического устройства.
Эти процедуры описаны в стандартном пакете LOW_LEVEL_IO. Каждая из них имеет два параметра, задающие устройство и .данные. Однако сорт и формат управляющей информации зависит от физических характеристик машины и устройств; поэтому типы параметров зависят от реализации. Возможно определение совмещенных, подпрограмм, управляющих различными устройствами.
Видимый раздел пакета, определяющего такие процедуры, имеет следующую структуру:
package LOW_LEVEL_IO is
- описания возможных типов параметров DEVICE и DATA
- описания совмещенных процедур над такими типами:
procedure SEND_CONTROL (DEVICE: тип_устройства;
DATA: in out тип-данных) ;
procedure RECEIVE_CONTROL (DEVICE: тип устройства-,
DATA: in out тип_данных);
end;
Тела процедур SEND_CONTROL и RECEIVE-CONTROL для различных устройств могут быть размещены в теле пакета LOW_LEVEL_IO. Эти тела процедур могут быть записаны операторами кода.
Пример ввода-вывода
В примере показано использование некоторых средств ввода-вывода текстов в режиме диалога с пользователем за терминалом. Пользователю предлагается выбрать цвет; программа в соответствии с описью выдает число предметов этого цвета на складе. Используются файлы ввода и .вывода по умолчанию. Для простоты все необходимые конкретизации настройки заданы в одной подпрограмме; на практике для этого мог бы использоваться самостоятельный пакет.
with TEXT_IO; use ТЕХТ_Ю;
procedure ДИАЛОГ is
type ЦВЕТ is (БЕЛЫЙ, КРАСНЫЙ, ОРАНЖЕВЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ, СИНИЙ, КОРИЧНЕВЫЙ);
package ВВ_ЦВЕТА is new ENUMERATION_IO (ENUM => ЦВЕТ);
package ВВ_ЧИСЛА is new INTEGER_IO (INTEGER);
use ВВ_ЦВЕТА, вв_числа;
ОПИСЬ: array (ЦВЕТ) of INTEGER: = (20, 17, 43, 10, 28, 173, 87);
ВАРИАНТ: ЦВЕТ;
procedure ВЫБОР_ЦВЕТА (ВЫБОР: out ЦВЕТ) js
begin
loop
begin
PUT (’’ВЫБРАННЫЙ ЦВЕТ: ”); - - обращение к пользователю
GET (ВЫБОР) ; - - вводит набранный цвет или возбуждает исключение return;
exception
when DATA_ERROR =>
PUT (’’ОШИБОЧНЫЙ ЦВЕТ, ПОВТОРИТЕ НАБОР”);
- пользователь должен набрать новую строчку
NEW_LINE (2);
- завершение выполнения оператора блока
end;
end loop, - - повторение оператора блока, пока не будет получен правильный цвет end;
begin - - операторы процедуры ДИАЛОГ;
BB_4MCHA.DEFAULT_WIDTH: = 5;
loop
ВЫБОР_ЦВЕТА (ВАРИАНТ);
- - пользователь набирает цвет и начинает новую строчку
SET_COL (5); PUT (ВАРИАНТ); PUT ("ВСЕГО ПРЕДМЕТОВ: ” );
SET_COL (40); PUT (ОПИСЬ (ВАРИАНТ)); - - ширина по умолчанию равна 5 NEW_LINE;
end loop;
end ДИАЛОГ ;
Пример диалога (набранное пользователем выделено курсивом):
ВЫБРАННЫЙ ЦВЕТ: ЧЕРНЫЙ
ОШИБОЧНЫЙ ЦВЕТ, ПОВТОРИТЕ НАБОР
ВЫБРАННЫЙ ЦВЕТ: СИНИЙ
СИНИЙ ВСЕГО ПРЕДМЕТОВ: 173
ВЫБРАННЫЙ ЦВЕТ: ЖЕЛТЫЙ
ЖЕЛТЫЙ ВСЕГО ПРЕДМЕТОВ: 10ПРИЛОЖЕНИЕ 1
Обязательное
АТРИБУТЫ, ПРЕДОПРЕДЕЛЕННЫЕ В ЯЗЫКЕ
Ниже представлена сводка определений предопределенных атрибутов, которые рассматривались в описании языка. (В скобках указан пояснительный перевод.)
Р’ADDRESS (Р'АДРЕС). Префикс Р обозначает объект, программый модуль, метку или вход. Вырабатывает адрес первого кванта памяти, отведенной под Р. Для подпрограммы, пакета, задачи или метки это значение ссылается на машинный код, связанный с соответствующим телом или оператором. Для входа с заданным спецификатором адреса это значение ссылается на соответствующее аппаратное прерывание. Значение этого атрибута имеет предопределенный в пакете SYSTEM тип ADDRESS (см. разд. 13.7.2).
P'AFT (Р'ЦИФР_ ДРОБИ). Префикс Р обозначает фиксированный подтип. Вырабатывает число десятичных цифр после точки, необходимых для обеспечения точности подтипа Р, если только атрибут DELTA подтипа Р не превышает значения 0.1, для которого атрибут вырабатывает значение единицы. (P'AFT - это наименьшее положительное число К, для которого (10 ** К) * P'DELTA больше или равно 1). Значение этого атрибута имеетуниверсальный-целый тип (см. разд. 3.5.10).
P'BASE (Р'Б АЗОВЫЙ). Префикс Р обозначает тип или подтип. Этот атрибут обозначает базовый тип Р и может быть только префиксом имени другого атрибута, например, P'BASE'FIRST (см. разд. 3.3.3).
P'CALLABLE (Р'ВЫЗЫВАЕМА). Префикс Р - это объект задачного типа. Вырабатывает значение FALSE, когда выполнение задачи Р либо закончено, либо завершено, либо задача находится в аварийном состоянии. В остальных случаях вырабатывает значение TRUE. Значение этого атрибута имеет предопределенный тип BOOLEAN (см. разд. 9.9).
P'CONSTRAINED (Р'ОГРАНИЧЕН). Префикс Р обозначает объект некоторого типа с дискриминантами. Вырабатывает значение TRUE, если ограничение дискриминантов наложено на объект Р или если объект - константа (включая формальный параметр или формальный параметр настройки вида in ). В остальных случаях вырабатывает значение FALSE. Если Р формальный параметр настройки вида in out или если Р - формальный параметр вида in out или out, а обозначение типа, заданное в соответствующей спецификации параметра, обозначает неограниченный тип с дискриминантами, то значение этого атрибута получается из значения атрибута соответствующего фактического параметра. Значение атрибута имеет предопределенный тип BOOLEAN (см. разд. 3.7.4).
P CONSTRAINED (Р'ОГРАНИЧЕН). Префикс Р обозначает личный тип или подтип. Вырабатывает значение FALSE, если Р обозначает неограниченный неформальный личный тип с дискриминантами, вырабатывает это же значение, если Р обозначает настраиваемый формальный личный тип, а соответствующий фактический подтип - это либо неограниченный тип с дискриминантами, либо неограниченный индексируемый тип. В остальных случаях вырабатывает значение TRUE. Значение этого атрибута имеет предопределенный тип BOOLEAN (см. разд. 7.4.2).
P’COUNT (Р'ЧИСЛО-ВЫЗОВОВ). Префикс Р обозначает вход задачи. Вырабатывает число вызовов входа, присутствующих в очереди этого входа (если атрибут вычисляется внутри оператора принятия входа Р, то в это число не входит вызывающая задача). Значение этого атрибута имеет универсальный-целый тип (см. разд. 9.9).
P'DELTA (Р'ДЕЛЬТА). Префикс Р обозначает фиксированный подтип. Вырабатывает значение дельты, заданной определением точности фиксированного типа для подтипа Р. Значение этого атрибута имеет универсальный-вещественный тип (см. разд. 3.5.10).
P'DIGITS (Р'ЦИФР). Префикс Р обозначает плавающий подтип. Вырабатывает число десятичных цифр в десятичной мантиссе модельных чисел подтипа Р. (Этот атрибут вырабатывает число Д, определенное в разд. 3.5.7). Значение этого атрибута имеетуниверсальный-целый тип (см. разд. 3.5.8).