Скалярные типы
Под скалярными типами подразумеваются перечислимые, целые и вещественные типы. Перечислимые и целые типы называются
дискретными
типами; каждое значение дискретного типа имеет номер позиции — целое значение. Целые и вещественные типы называются
числовыми
типами. Все скалярные типы упорядочены, т.е. для их значений предопределены все операции отношения.
ограничение-диапазона ::= range диапазон диапазон ::= атрибут-диапазона |простое-выражение .. простое-выражение
Диапазон определяет подмножество значений скалярного типа. Диапазон L. .R определяет значения от L до R включительно, если истинно отношение L < = R. Значения L и R называются соответственно
нижней границей
и
верхней границей
диапазона. Значение V удовлетворяет ограничению диапазона, если оно принадлежит диапазону; говорят, что значение V
принадлежит
диапазону, если одновременно истинны отношения L<=V и V<=R.
Пустой диапазон —
это диапазон, для которого истинно отношение R < L; пустому диапазону не принадлежит никакое значение. Операции < = и < в вышеприведенных определениях являются предопределенными операциями над скалярными типами.
Если ограничение диапазона используется в указании подтипа либо непосредственно, либо как часть ограничения плавающего или фиксированного типа, тип простых выражений (а также границ атрибута диапазона) должен быть тем же, что и базовый тип в обозначении типа указания подтипа. Ограничение диапазона совместимо с подтипом, если каждая граница диапазона принадлежит подтипу или если ограничение диапазона определяет пустой диапазон; иначе ограничение диапазона не совместимо с подтипом.
Предвыполнение ограничения диапазона состоит из вычисления диапазона. Вычисление диапазона определяет его нижнюю и верхнюю границы. Если границы заданы простыми выражениями, вычисление диапазона вычисляет эти выражения в порядке, который не определен в языке.
Атрибуты
Для любого скалярного типа Т или для любого подтипа Т скалярного типа определены следующие атрибуты:
Т'FIRST |
Вырабатывает значение нижней границы Т. Значение этого атрибута имеет тип Т. |
Т'LAST |
Вырабатывает значение верхней границы Т. Значение этого атрибута имеет тип Т. |
Примечание.
Индексирование и правила итерации используют значения дискретных типов.
Ссылки:
атрибут 4.1.4, атрибут диапазона 3.6.2, вещественный тип 3.5.6, вычисление 4.5, индекс 3.6, обозначение типа 3.3.2, ограничение 3.3, ограничение плавающего типа 3.5.7, ограничение фиксированного типа 3.5.9, оператор цикла 5.5, операция отношения 4.5, 4.5.2, ошибочный 1.6, перечислимый тип 3.5.1, простое выражение 4.4, удовлетворяет ограничению 3.3, указание подтипа 3.3.2, целый тип 3.5.4.
3.5.1. ПЕРЕЧИСЛИМЫЕ ТИПЫ
Определение перечислимого типа задает перечислимый тип
определение - перечислимого - типа:: =
(спецификация -литерала-перечисления (, спецификация - литерала - перечисления))
спецификация-литерала-перечисления ::= литерал-перечисления литерал-перечисления ::= идентификатор|символьный-литерал
Идентификаторы и символьные литералы, перечисленные в определении перечислимого типа, должны быть различными. Каждая спецификация литерала перечисления является его описанием; это описание эквивалентно описанию функции без параметров, обозначение которой — литерал перечисления, а тип результата — перечислимый тип. Предвыполнение определения перечислимого типа создает перечислимый тип; это Предвыполнение включает пред-выполнение каждой спецификации литерала перечисления.
Каждый литерал перечисления вырабатывает отличное от других перечислимое значение. Предопределенные операции отношения упорядоченности между перечислимыми значениями следуют порядку, соответствующему номерам позиций; номер позиции первого значения в списке литералов перечисления равен нулю; номер каждого следующего литерала перечисления на единицу больше номера предыдущего литерала в списке.
Если один и тот же идентификатор или символьный литерал задан в нескольких определениях перечислимого типа, соответствующие литералы называются
совмещенными. В
тексте программы тип совмещенного литерала перечисления должен быть определимым из контекста (см. 8.7).
Примеры:
type DAY is (MON, TUE, WED, THU, FRI, SAT, SUN); type SUIT is (CLUBS, DIAMONDS, HEARTS, SPADES); type GENDER is (M, F); type LEVEL is (LOW, MEDIUM, URGENT); type COLOR is (WHITE, RED, YELLOW, GREEN, BLUE, BROWN, BLACK); type LIGHT is (RED, AMBER, GREEN); -- RED И GREEN совмещены
type HEXA is ('A', 'B', 'C', '0', 'E', 'F'); type MIXED is ('A', 'B', '*', B, NONE, '?', '%');
subtype WEEKDAY is DAY range MON .. FRI; subtype MAJOR is SUIT range HEARTS .. SPADES: subtype RAINBOW is COLOR range RED .. BLUE; -- цвет, НО не свет
Примечание.
Если литерал перечисления встречается в контексте, недостаточном для определения типа литерала, то один из путей разрешения неоднозначности — это применение квалифицированного выражения с именем перечислимого типа (см. 4.7).
Ссылки:
идентификатор 2.3, имя 4.1, квалифицированное выражение 4.7, номер позиции 3.5, обозначение 6.1, операция отношения 4.5, 4.5.2, описание 3.1, определение типа 3.3.1, пред-выполнение 3.9, 6.1, символьный литерал 2.5, совмещение 6.6, 8.7, тип 3.3, функция 6.5.
3.5.2. СИМВОЛЬНЫЕ ТИПЫ
Перечислимый тип называется
символьным,
если хотя бы один из его Питералов перечисления является символьным литералом. Предопределенный тип CHARACTER — символьный тип, значения которого представляют собой 128 символов стандартного набора ASCII. Каждый из 95 графических символов этого символьного набора обозначен соответствующим символьным литералом.
Пример:
type
ROMAN_DIGIT
is
(Т, 'V. 'X', 'L', 'С', 'D', 'М');
Примечание.
Предопределенный пакет ASCII включает описания констант, обозначающих управляющие символы, а также констант, обозначающих графические символы, не входящие в основной набор символов.
Другой символьный набор, например EBCDIC, можно описать как символьный тип; внутренние коды символов можно задать спецификатором представления перечислимых, как пояснено в разд. 13.3.
Ссыпки:
графический символ 2.1, идентификатор 2.8, константа 3.2.1, литерал 4.2, описание 3.1, основной символ 2.1, перечислимый тип 3.5.1, предопределенный пакет С, предопределенный тип С, символьный литерал 2.5, тип 3.3.
3.5.3. ЛОГИЧЕСКИЕ ТИПЫ
Существует предопределенный перечислимый тип, именуемый BOOLEAN. Он содержит два литерала FALSE и TRUE, упорядоченные соотношением FALSE < TRUE. Логический тип — это тип BOOLEAN или производный непосредственно или косвенно от логического типа.
Ссылки:
литерал перечисления 3.5.1, операция отношения 4.5, 4.5.2, перечислимый тип 3.5.1, производный тип 3.4, тип 3.3.
3.5.4. ЦЕЛЫЕ ТИПЫ
Определение целого типа задает целый тип, набор значений которого включает значения заданного диапазона.
определение-целого-типа ::= ограничение-диапазона
Границы диапазона должны определяться статическими выражениями некоторого, не обязательно одного и того же, целого типа. (Допускаются отрицательные границы.) Описание типа в форме
type
Т
is range
L .. R
;
по определению эквивалентно следующим описаниям:
type
целый- тип
is new
предопределенный-целый-тип;
subtype
Т
is
целый-тип
range
целый- тип
(L) ..
целый-тип
(R);
где целый-тип — это анонимный тип, а предопределенный целый тип выбран реализацией и содержит значения от L до R включительно. Описание целого типа неправильно, если ни один из предопределенных целых типов не удовлетворяет этому требованию, за исключением типа
универсальный-целый.
Предвыполнение описания целого типа состоит из предвыполне-ния эквивалентных описаний типа и подтипа.
Предопределенные целые типы включают тип INTEGER. Реализация может также иметь предопределенные типы SHORT-INTEGER и LONG-INTEGER, диапазоны которых соответственно (существенно) уже и шире, чем у типа INTEGER. Диапазон этих типов должен быть симметричным относительно нуля, кроме наименьшего из отрицательных значений, которое может существовать в некоторых реализациях. Базовым для каждого из этих типов является он сам.
Целые литералы — это литералы анонимного предопределенного целого типа, который в данном руководстве называется
универсальным-целым.
Другие целые типы не имеют литералов. Однако для каждого целого типа существует неявное преобразование
универсального-целого
значения в соответствующее значение (если оно есть) целого типа. Обстоятельства, в которых применяются такие неявные преобразования, описаны в разд. 4.6.
Номер позиции целого значения — это соответствующее значение типа
универсальный-цепый.
Для всех целых типов предопределены одни и те же арифметические операции (см. 4.5). Исключение NUMERIC-ERROR возбуждается при выполнении операции (в частности, неявного преобразования), которая не может передать корректный результат (т.е. значение, соответствующее математическому результату, не является значением целого типа). Однако от реализации не требуется возбуждения исключения NUMERIC_ERROR, если операция является частью большего выражения, результат которого может быть вычислен корректно, как пояснено в разд. 11.6.
Примеры:
type PAGE_NUM is range 1 .. 2_000; type LINE_SIZE is range 1 .. MAX_LINE_SIZE;
subtype SMAL_IINT is INTEGER range -10 .. 10; subtype COLUMN_PTR is LINESIZE range 1 .. 10: subtype BUFFER_SIZE is INTEGER range 0 .. МАХ;
Примечание.
Имя в описании целого типа — это имя подтипа. С другой стороны, предопределенные операции над целым типом определяют результат, который принадлежит диапазону, определяемому родительским предопределенным типом; такой результат не обязательно принадлежит описанному подтипу, и попытка присвоить такой результат переменной целого подтипа возбуждает исключение CONSTRAINT_ERROR. Наименьшее (наибольшее по модулю отрицательное) значение, поддержанное реализацией для предопределенных целых типов, есть именованное число SYSTEM.MIN_INT, а наибольшее (из положительных) значение — SYSTEM.MAX_INT (см. 13.7).
Ссылки:
анонимный тип 3.3.1, граница диапазона 3.5, идентификатор 2.3, исключение CONSTRAINT_ERROR 11.1, исключение NUMERIC-ERROR 11.1, литерал 4.2, ограничение диапазона 3.5, описание подтипа 3.3.2, описание типа 3.3.1, определение типа 3.3.1, предопределенная операция 4.5, предопределенный пакет системы 13.7, преобразование 4.6, принадлежит подтипу 3.3, родительский тип 3.4, статическое выражение 4.9, тип 3.3, универсальный тип 4.10, целый литерал 2.4.
3.5.5. ОПЕРАЦИИ НАД ДИСКРЕТНЫМИ ТИПАМИ
Базовые операции над дискретными типами включают присваивание, проверку на принадлежность и квалификацию; для логических типов — управление с промежуточной проверкой;
для целого типа — явное преобразование значений других числовых типов к целому типу и неявное преобразование значения типа
универсальный-целый
к значению заданного типа.
Для каждого дискретного типа или подтипа Т базовые операции включают перечисленные ниже атрибуты. В этом перечислении Т ссылается на подтип (подтип Т) для любого свойства, зависящего от ограничений для Т; другие свойства установлены в терминах базового типа Т.
Первая группа атрибутов вырабатывает характеристики подтипа Т. Эта группа включает атрибут ВАЗЕ (см. 3.3.3), атрибуты FIRST и LAST (см. 3.5), атрибут представления SIZE (см. 13.7.2) и атрибут WIDTH, определенный следующим образом:
T'WIDTH |
Вырабатывает максимальную длину образа по всем значениям подтипа Т {образ — это последовательность символов, вырабатываемая атрибутом IMAGE, см. ниже). Вырабатывает нуль для пустого диапазона. Значения этого атрибута имеют тип универсальный-целый. |
Т'РОS |
Параметр Х должен быть значением базового типа Т. Тип результата — универсальный-целый. Результат — номер позиции для значения параметра. |
T'VAL |
Параметр Х может быть любого целого типа. Тип результата — базовый тип Т. По заданному значению Х — номеру позиции — функция вырабатывает значение в этой позиции. Если соответствующее Х — универсальное-целое значение — не принадлежит диапазону T'POS(T'BASE'FIRST). .T'POS(T'BASE'LAST), то возбуждается исключение CONSTRAINT_ERROR. |
T'SUCC |
Параметр X должен быть значением базового типа Т. Тип результата — базовый тип Т. Результат — значение с номером позиции, на единицу большим номера позиции для значения X. Если Х равен T'BASE'LAST, то возбуждается исключениеCONSTRAINT_ERROR. |
T'PRED |
Параметр Х должен быть значением базового типа Т. Тип результата — базовый тип Т. Результат — значение с номером позиции, на единицу меньшим номера позиции для значения X. Если Х равно T'BASE'FIRST, то возбуждается исключение CONSTRAINT - ERROR. |
T'IMAGE |
Параметр Х должен быть значением базового типа Т. Тип результата — предопределенный тип STRING. Результат — образ значения X, т.е. последовательность символов, представляющих изображение значения. Образу целого значения соответствует десятичный литерал без подчеркиваний, предшествующих нулей, порядка и пробелов справа, но с одним символом минус или пробелом слева. Нижняя граница образа есть единица. Образ литерала перечисления — это либо соответствующий идентификатор из прописных букв, либо соответствующий символьный литерал (включая два апострофа); пробелы не включаются ни слева, ни справа. Образ символа С, отличного от графического символа, зависит от реализации; должно выполняться равенство СНАRАСТЕR'VАLUЕ(СНАRАСТЕR'IМАGЕ(С))=С. |
T'VALUE |
Параметр Х должен быть значением предопределенного типа STRING. Тип результата — базовый тип Т. Игнорируются любые пробелы слева и справа от последовательности символов, соответствующих параметру. Если для перечислимого типа последовательность символов имеет синтаксис литерала перечисления и если этот литерал существует для базового типа Т, то результат — соответствующее значение перечислимого типа. Если для целого типа последовательность символов имеет синтаксис целого литерала с возможным знаком минус или плюс слева и если существует соответствующее значение базового типа Т, то результат есть это значение. Во всех остальных случаях возбуждается исключение CONSTRAINT_ERROR. |
/p>
Кроме того, для объекта А дискретного типа определены атрибуты A'SIZE и A'ADDRESS
(см. 13.7.2).
Кроме базовых операции над дискретными типами включают предопределенные операции отношения. Для перечислимых типов операции включают литералы перечисления. Для логических типов операции включают предопределенную унарную логическую операцию отрицания
not
и предопределенные логические операции. Для целых типов операции включают предопределенные
арифметические
операции: унарные и бинарные аддитивные операции - и +, все мультипликативные операции, унарную операцию
abs
и операцию возведения в
степень.
Операции над подтипом — это операции над его базовым типом, кроме следующих: присваивания, проверки принадлежности, квалификации, явного преобразования типа и атрибутов первой группы; результат каждой из этих операций зависит от подтипа (присваивание, проверка принадлежности, квалификация и преобразование включают проверку подтипа; атрибуты первой группы вырабатывают характеристику подтипа).
Примечание.
Для подтипа дискретного типа переданные атрибутами SUCC, PRED, VAL и VALUE результаты не обязательно принадлежат подтипу; аналогично фактические параметры атрибутов POS, SUCC, PRED и IMAGE не обязаны принадлежать подтипу. Эти атрибуты удовлетворяют (при отсутствии исключения) следующим соотношениям:
T'POS(T'SUCC(X)) = T'POSfX) + 1 T'POS(T'PRED(X)) = T'POS(X) - 1
T'VAL(T'POS(X)) = X T'POS(T'VAL(N)) = N
Примеры:
-- для типов и подтипов, описанных в 3.5.1
-- COLOR'FIRST = WHITE, COLOR'LAST = BLACK -- RAINBOW'FIRST = RED, RAINBOW'LAST = BLUE
-- COLOR'SUCC(BLUE) = RAINBOW'SUCC(BLUE) = BROWN -- COLOR'POS(BLUE) = RAINBOW'POS(BLUE) = 4 -- COLOR'VAL(O) = RAINBOW'VAL(O) = WHITE
Ссылки:
атрибут 4.1.4, базовая операция 3.3.3, базовый тип 3.3, бинарная аддитивная операция 4.5, 4.5.3, граница диапазона 3.5, графический символ 2.1, дискретный тип 3.5, идентификатор 2.3, исключение CONSTRAINT_ERROR 11.1, квалифицированное выражение 4.7, литерал перечисления 3.5.1, логическая операция 4.5, 4.5.1, логический тип 3.5.3, мультипликативная операция 4.5, 4.5.5, номер позиции 3.5, объект 3.2, ограничение 3.3, операция 3.3, операция возведения в степень 4.5, 4.5.6, операция отношения 4.5, 4.5.2, операция отрицания 4.5, 4.5.6, операция управления с промежуточной проверкой 4.5, 4.5.1, подтип 3.3, предопределенная операция 4.5, предопределенный тип С, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, символьный литерал 2.5, строковый тип 3.6.3, тип 3.3, тип универсальный целый 3.5.4, унарная аддитивная операция 4.5, 4.5.4, универсальный тип 4.10, функция 6.5, целый тип 3.5.4, числовой литерал 2.4, числовой тип 3.3.
3.5.6. ВЕЩЕСТВЕННЫЕ ТИПЫ
Вещественные типы обеспечивают приближение вещественных чисел с относительной погрешностью для плавающих типов и с абсолютной погрешностью для фиксированных типов.
определение-вещественного-типа :: =
ограничение - плавающего - типа [ограничение - фиксированного - типа
С каждым вещественным типом связан набор чисел, называемых модельными числами. Границы ошибок в предопределенных операциях даны в терминах модельных чисел. Реализация типа должна включать по крайней мере эти модельные числа и представлять их точно.
С каждым вещественным типом связан зависящий от реализации набор чисел, называемых хранимыми числами. Набор хранимых чисел вещественного типа должен включать по крайней мере набор модельных чисел типа. Допустимо, чтобы диапазон хранимых чисел был больше диапазона модельных чисел, но границы ошибок предопределенных операций над хранимыми числами определены теми же правилами, что и для модельных чисел. Хранимые числа по этой причине обеспечивают гарантированные границы ошибок для операций над зависящим от реализации диапазоном чисел; напротив, диапазон модельных чисел зависит только от определения вещественного типа и поэтому не зависит от реализации.
Вещественные литералы — это литералы анонимного предопределенного вещественного типа, называемого в этом руководстве
универсальным-вещественным.
Другие вещественные типы не имеют литералов. Для каждого вещественного типа существует неявное преобразование, которое преобразует
универсальное-вещественное
значение в значение этого вещественного типа. Условия, в которых вызываются эти преобразования, описаны в разд. 4.6. Если
универсальное-вещественное
значение — хранимое число, то неявное преобразование вырабатывает соответствующее значение; если оно принадлежит диапазону хранимых чисел, но не является хранимым числом, то преобразуемое значение может быть любым значением в диапазоне, определенном ближайшими хранимыми предыдущим и последующим числами
универсального-вещественного
значения.
Выполнение операции типа вырабатывает значение вещественного типа и может возбудить исключение NUMERIC_ERROR, как поясняется в разд. 4.5.7, если она не может вырабатывать корректный результат (т.е. соответствующее одному из возможных математических результатов значение не принадлежит диапазону хранимых чисел); в частности, это исключение может быть возбуждено неявным преобразованием. Однако от реализации не требуется возбуждать исключение NUMERIC_ERROR, если операция — часть большего выражения, которое может быть корректно вычислено (см. 11.6).
Предвыполнение определения вещественного типа включает предвыполнение ограничения плавающего или фиксированного типа и создает вещественный тип.
Примечание.
Алгоритм, использующий только минимальные свойства чисел, которые гарантированы определением типа для модельных чисел, будет переносимым без каких-либо предосторожностей.
Ссылки:
вещественный литерал 2.4, исключение NUMERIC_ERROR 11.1, литерал 4.2, ограничение плавающего типа 3.5.7, ограничение фиксированного типа 3.5,7, определение типа 3.3.1, предопределенная операция 3.3.3, предвыполнение 3.9, преобразование 4.6, тип 3.3, универсальный тип 4.10.
3.5.7. ПЛАВАЮЩИЕ ТИПЫ
Для плавающих типов граница ошибки определяется заданием относительной погрешности в виде требуемого минимального числа значащих десятичных цифр.
ограничение-плавающего-типа ::=
определение - точности - плавающего - типа [ограничение - диапазона] определение - точности - плавающего - типа:: =
digits
статическое-
простое - выражение
Минимальное число значащих десятичных цифр определяется значением статического простого выражения в определении точности плавающего типа. Это значение должно быть некоторым целым типом и должно быть положительным (ненулевым); в дальнейшем оно обозначено буквой D. Если ограничение плавающего типа использовано как определение вещественного типа и включает ограничение диапазона, то каждая граница диапазона должна быть определена статическим выражением некоторого вещественного типа, но две границы не обязаны иметь один и тот же вещественный тип.
Для данного
основания
определена следующая каноническая форма отличного от нуля модельного числа плавающего типа:
знак *мантисса *(основание**порядок)
В этой форме:
знак —
либо +1, либо -1;
мантисса
выражена в системе счисления, заданной основанием;
порядок —
целое число (возможно, отрицательное), такое, что целая часть мантиссы равна нулю, а первая цифра ее дробной части не равна нулю.
Число D — минимальное требуемое число десятичных цифр после точки в десятичной мантиссе (т.е.' если основание равно десяти). Значение D в свою очередь определяет число В — минимальное требуемое число двоичных цифр после точки в двоичной мантиссе (т.е. если
основание
равно двум). Число В связано с D и равно такому минимальному значению, что относительная точность двоичной формы не меньше точности для десятичной формы. (Число В равно ближайшему целому, превышающему (D*log(10)/log(2)) +1.)
Модельные числа, заданные определением точности плавающего типа, включают нуль и все числа, у которых двоичная каноническая форма имеет точно В цифр после точки в мантиссе и порядок в диапазоне -4*В.. +4*В. Гарантированная минимальная точность операций над плавающим типом определена в терминах его модельных чисел с ограничением плавающего типа, которое формирует соответствующее определение вещественного типа (см. 4.5.7).
Предопределенные плавающие типы включают тип FLOAT. Реализация может иметь также предопределенные типы SHORT_FLOAT и LONG_FLOAT с точностью (существенно) меньшей и большей соответственно, чем у FLOAT. Базовым типом каждого предопределенного плавающего типа является он сам. Модельные числа каждого предопределенного плавающего типа определены числом D десятичных цифр, вырабатываемых атрибутом DIQITS (см. 3.5.8).
Для каждого предопределенного плавающего типа (а следовательно, и для каждого производного от него типа) набор хранимых чисел определен следующим образом. Хранимые числа имеют то же самое число цифр В мантиссы, что и модельные числа типа, а порядок — в диапазоне -Е.. +Е, где Е зависит от реализации и равно по крайней мере 4*В для модельных чисел. (Следовательно, хранимые числа включают модельные числа.) Правила определения точности операций над модельными и хранимыми числами Даны в разд. 4.5.7.
Хранимые числа подтипа те же, что и для его базового типа.
Описание плавающего типа, представленное в одной из двух форм (т.е. с возможным ограничением диапазона, обозначенным квадратными скобками, или без него):
type Т is digits D [range L .. R];
по определению эквивалентно следующим описаниям:
type плавающий - тип is new предопределенный-плавающий-тип; subtype T is плавающий-тип digits D [range плавающий-тип (L). .плавающий -тип (R)];
где
плавающий-тип
является анонимным, а предопределенный плавающий тип неявно выбран реализацией так, что его модельные числа определяются значением D; кроме того, если добавлен диапазон L.-R, то L и R должны принадлежать диапазону хранимых чисел. Описание плавающего типа неправильно, если ни один из предопределенных плавающих типов не удовлетворяет этим требованиям, кроме типа
универсальный-вещественный.
Максимальное число цифр, которое может быть задано определением точности плавающего типа, определяется именованным числом SYSTEM.MAX_DIGITS (см. 13.7.1).
Предвыполнение описания плавающего типа состоит из предвыполнения эквивалентных описаний типа и подтипа.
Если ограничение плавающего типа следует за обозначением типа в указании подтипа, то обозначение типа должно задавать плавающий тип или подтип. Ограничение плавающего типа
совместимо с
обозначением типа, только если число D в определении точности плавающего типа не больше соответствующего числа D для типа или подтипа в обозначении типа. Кроме того, если ограничение плавающего типа включает ограничение диапазона, то ограничение плавающего типа совместимо с обозначением типа, только если ограничение диапазона совместимо с обозначением типа.
Предвыполнение такого указания подтипа включает Предвыполнение ограничения диапазона, если оно есть; оно создает подтип плавающего типа, модельные числа которого определены соответствующим определением точности плавающего типа. Значение плавающего типа принадлежит плавающему подтипу тогда
у
только тогда, когда оно принадлежит диапазону подтипа.
Одни и те же арифметические операции предопределены для всех плавающих типов (см. 4.5).
Примечание.
Ограничение диапазона допустимо в указании плавающего подтипа непосредственно после обозначения типа либо как часть ограничения плавающего типа. В обоих случаях границы диапазона должны принадлежать базовому типу обозначения типа (см. 35). Наложение ограничения плавающего типа на обозначение типа в указании подтипа не может уменьшить допустимый диапазон значений, если оно не включает ограничение диапазона (диапазон модельных чисел, которые соответствуют заданному числу цифр, может быть меньше, чем диапазон чисел обозначения типа). Принадлежащее плавающему подтипу значение не обязательно является модельным числом подтипа.
Примеры:
type COEFFICIENT is digits 10 range -1.0 .. 1.0;
type REAL is digits 8; type MASS is digits 7 range 0.0 .. 1.0Е35;
subtype SHORTCOEFF is COEFFICIENT digits 5; -- подтип с меньшей точностью subtype PROBABILITY is REAL range 0.0 .. 1.0; -- подтип с меньшим диапазоном
Примечание к примерам.
Реализованная точность для типа COEFFICIENT — это точность предопределенного типа, имеющего по меньшей мере 10 цифр мантиссы. Следовательно, спецификация пяти цифр точности для подтипа SHORT_COEFF допустима. Наибольшее модельное число для типа MASS равно приблизительно 1.ОЕ21 и, следовательно, меньше, чем заданная верхняя граница, (1.0Е35). Следовательно, описание этого типа правильно, только если эта верхняя граница принадлежит диапазону хранимых чисел предопределенного плавающего типа, имеющего по меньшей мере 7 цифр точности.
Ссылки:
анонимный тип 3.3.1, арифметическая операция 3.5.5, 4.5, вещественный тип 3.5.6, граница диапазона 3.5, граница ошибки 3.5.6, литерал с основанием 2.4.2, модельное число 3.5.6, обозначение типа 3.3.2, ограничение диапазона 3.5, операция 3.3., описание подтипа 3.3.2, описание типа 3,3.1, определение вещественного типа 3.5.6, принадлежит подтипу 3.3, подтип 3.3, порядок 2.4.1, Предвыполнение 3.1, 3.9, предопределенная операция 4.5, предопределенный тип С, производный тип 3.4, простое выражение 4.4, совместимый 3.3.2, статическое выражение 4.9, тип 3.3, указание подтипа 3.3.2, хранимое число 3.5.6, целый тип 3.5.4, цифра 2.1.
3.5.8. ОПЕРАЦИИ НАД ПЛАВАЮЩИМИ ТИПАМИ
Базовые операции над плавающим типом включают присваивание, проверку принадлежности, квалификацию, явное преобразование значений других числовых типов в значения этого плавающего типа и неявное преобразование значений типа
универсальный-вещественный
в значения этого типа.
Кроме того, для каждого плавающего типа или подтипа Т базовые операции включают перечисленные ниже атрибуты. В этом представлении Т — это подтип (подтип Т) для любого свойства, зависящего от наложенных на Т ограничений; другие свойства формулируются через базовый тип Т.
Первая группа атрибутов вырабатывает характеристики подтипа Т. К атрибутам этой группы относятся атрибут ВАSЕ (см. 3.3.3), атрибуты FIRST и LAST (см. 3.5), атрибут представления SIZE (см. 13.7.2), а также следующие атрибуты:
T'DIGITS |
Вырабатывает число десятичных цифр в десятичной мантиссе модельных чисел подтипа Т. (Этот атрибут вырабатывает число D, см. разд. 3.5.7.) Значение этого атрибута имеет тип универсальный-целый. |
T'MANTISSA |
Вырабатывает число двоичных цифр в двоичной мантиссе модельных чисел подтипа Т. (Этот атрибут вырабатывает число В, см. разд. 3.5.7.) Значение этого атрибута имеет тип универсальный-целый. |
T'EPSILON |
Вырабатывает абсолютное значение разности между модельным числом 1.0 и следующим модельным числом подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'EMAX |
Вырабатывает наибольшее значение порядка двоичной канонической формы модельных чисел подтипа Т. (Этот атрибут вырабатывает произведение 4*В, см. разд. 3.5.7.) Значение этого атрибута имеет тип универсальный-целый. |
T'SMALL |
Вырабатывает наименьшее положительное (ненулевое) модельное число подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'LARGE |
Вырабатывает наибольшее положительное модельное - число подтипа Т. Значение этого атрибута имеет тип универсальный- вещественный. |
Атрибуты второй группы вырабатывают характеристики хранимых чисел и включают следующие атрибуты:
T'SAFE-EMAX |
Вырабатывает наибольшее значение порядка двоичной канонической формы хранимых чисел базового типа Т. (Этот атрибут вырабатывает число Е, см. разд. 3.5.7.) Значение этого атрибута имеет тип универсальный-целый. |
T'SAFE-SMALL |
Вырабатывает наименьшее положительное (ненулевое) хранимое число базового типа Т. Значение этого атрибута имеет тип унивеосальный- вещественный. |
T'SAFE_LARGE |
Вырабатывает наибольшее положительное хранимое число базового типа Т. Значение этого атрибута имеет тип универсальный - вещественный. |
Кроме этого, для объекта А плавающего типа определены атрибуты A'SIZE и A'ADDRESS (см. 13.7.2). Для каждого плавающего типа существуют машинно-зависимые атрибуты, которые не относятся к модельным и хранимым числам. Они соответсвуют обозначениям атрибутовMACHINE_EMAX, MACHINE_EMIN, MACHINE_RADIX, MACHINE_MANTISSA,
MACHINE_ROUNDS и MACHINE_OVERFLOWS (см. 13.7.3).
Кроме базовых операций над плавающим типом определены операции отношения и следующие предопределенные арифметические операции: унарные и бинарные аддитивные операции - и +, мультипликативные операции » и /, унарная операция abc и операция возведения в степень.
Операции над подтипом соответствуют операциям над типом, кроме следующих: присваивания, проверки принадлежности, квалификации, явного преобразования и атрибутов первой группы; результаты этих операций переопределены в терминах подтипа.
Примечание.
Атрибуты ЕМАХ, SMALL, LARGE и EPSILON связаны с атрибутом MANTISSA следующими формулами:
Т'ЕМАХ = 4*T'MANTISSA
T'EPSILON = 2.0**(1 - T'MANTISSA)
T'SMALL = 2.0**(-Т'ЕМАХ - 1)
T'LARGE
=
2.0**Т'ЕМАХ * (1.0 - 2.0**(-T'MANTISSA))
Атрибут MANTISSA, дающий число двоичных цифр в мантиссе, сам связан с атрибутом DIGITS.
Между характеристиками модельных и хранимых чисел справедливы следующие соотношения:
T'BASE_EMAX <= T'SAFE_EMAX T'BASE_SMALL >= T'SAFE_SMALL T'BASE_LARGE <= T'SAFE_LARGE
Атрибуты T'FIRST и T'LAST не обязательно вырабатывают модельные или хранимые числа.
Если некоторое число цифр определено описанием типа или подтипа Т, то атрибут DIGITS вырабатывает это число.
Ссылки:
арифметическая операция 3.5.5, 4.5, атрибут 4.1.4, базовая операция 3.3.3, базовый тип 3.3, бинарная аддитивная операция 4.5, 4.5.3, границы диапазона 3.5, квалифицированное выражение 4.7, модельное число 3.5.6, мультипликативная операция 4.5, 4.5.5, объект 3.2, ограничение 3.3, операция 3.3, операция возведения в степень 4.5, 4.5.6, операция отношения 4.5, 4.5.2, плавающий тип 3.5.7, подтип 3.3, предопределенная операция 4.5, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, тип 3.3, тип универсальный вещественный 3.5.6, тип универсальный целый 3.5.4, унарная аддитивная операция 4.5, 4.5.4, универсальный тип 4.10, хранимое число 3.5.6, цифра 2.1, числовой тип 3.5.
3.5.9. ФИКСИРОВАННЫЕ ТИПЫ
Для фиксированных типов граница ошибки определяется абсолютной погрешностью, называемой
дельтой
фиксированного типа.
ограничение-фиксированного-типа :: =
определение - точности - фиксированного - типа [ограничение - диапазона]
определение - точности - фиксированного - типа:: =
delta
статическое-
простое - выражение
Дельта определяется значением статического простого выражения в определении точности фиксированного типа. Это значение должно принадлежать некоторому вещественному типу и быть положительным (ненулевым). Если ограничение для фиксированного типа использовано как опеределение вещественного типа, то оно должно включать ограничение диапазона;
каждая граница диапазона должна быть определена статическим выражением некоторого вещественного типа, но эти две границы не обязаны иметь один и тот же тип. Если ограничение
для фиксированного типа использовано в указании подтипа, то ограничение диапазона необязательно.
Для любого ненулевого модельного числа фиксированного типа определена каноническая форма. В этой форме: знак — это либо +1, либо -1;
мантисса —
положительное (ненулевое) целое; любое модельное число кратно некоторому положительному вещественному числу, называемому
дискретом,
определенному следующим образом:
знак*мантисса*дискрет
Для модельных чисел фиксированного типа
дискрет
выбран как наибольшая степень двух, которая не превышает дельту определения точности фиксированного типа.
Дискрет
можно также задать спецификатором длины (см. 13.2), в этом случае модельные числа кратны заданному значению. Гарантированная минимальная точность операций над фиксированным типом определена в терминах модельных чисел из ограничения для фиксированного типа, которое образует соответствующее определение вещественного типа (см. 4.5.7).
Для ограничения фиксированного типа с ограничением диапазона модельные числа включают нуль и все числа, кратные
дискрету, мантисса
которых может быть выражена точно В двоичными цифрами, а значение В выбрано как наименьшее целое число, для которого каждая граница заданного диапазона — либо модельное число, либо отличается не более чем на
дискрет
от модельного числа. Если ограничение для фиксированного типа не включает ограничение диапазона (это допустимо только после обозначения типа в указании подтипа), модельные числа определены дельтой определения точности фиксированного типа и диапазоном подтипа, заданного обозначением типа.
Реализация должна иметь по крайней мере один анонимный предопределенный фиксированный тип. Базовый тип каждого такого фиксированного типа — это сам этот тип. Модельные числа каждого предопределенного фиксированного типа включают нуль и все числа, для которых
мантисса
(в канонической форме) имеет число двоичных цифр, вырабатываемое атрибутом MANTISSA, и для которых
дискрет
имеет значение, возвращаемое атрибутом SMALL
Описание фиксированного типа в форме
type T is delta D range L .. R
по определению эквивалентно следующим описаниям:
type
фиксированный-тип
is new
предопределенный - фиксированный - тип;
subtype T is
фиксированный-тип
delta D range
фиксированный-тип
(L) ..
фиксированный-тип
(R);
В этих описаниях
фиксированный-тип —
это анонимный тип, а предопределенный фиксированный тип неявно выбран реализацией так, чтобы его модельные числа включали описанные ограничением для фиксированного типа модельные числа (т. е. с помощью D, L и R, а возможно и спецификатора длины, определяющего
дискрет).
Описание фиксированного типа неправильно, если не существует предопределенного типа, удовлетворяющего этим требованиям. Хранимые числа фиксированного типа — это модельные числа его базового типа.
Предвыполнение описания фиксированного типа состоит из предвыполнения эквивалентных описаний типа и подтипа.
Если ограничение для фиксированного типа следует за обозначением типа в указании подтипа, то обозначение типа должно задавать фиксированный тип или подтип. Ограничение для фиксированного типа
совместимо с
обозначением типа, только если дельта из определения точности фиксированного типа не меньше дельты для типа или подтипа, заданного обозначением типа. Более того, если ограничение для фиксированного типа включает ограничение диапазона, то ограничение для фиксированного типа совместимо с обозначением типа, только если само ограничение совместимо с обозначением типа.
Предвыполнение такого указания подтипа включает Предвыполнение ограничения диапазона, если оно есть; оно создает фиксированный подтип, модельные числа которого определены соответствующим ограничением для фиксированного типа, а также спецификатором длины, задающим дискрет, если он есть. Значение фиксированного типа принадлежит фиксированному подтипу тогда и только тогда, когда оно принадлежит диапазону, определенному подтипом.
Для всех фиксированных типов предопределены одни и те же арифметические операции (см. 4.5). Умножение и деление значений фиксированного типа дают результаты анонимного предопределенного фиксированного типа, который в данном стандарте называется
универсальный-фиксированный;
точность этого типа произвольна. Значения этого типа должны быть явно преобразованы в значения некоторого числового типа.
Примечание.
Если S — подтип фиксированного типа или подтипа Т, то набор модельных чисел S — это подмножество модельных чисел Т. Если для Т был задан спецификатор длины, то Т и S имеют одно и то же значение
дискрета. В
противном случае поскольку
дискрет
равен степени двух, то
дискрет
для S равен
дискрету
для Т, умноженному на неотрицательную степень двух.
Ограничение диапазона допустимо в указании фиксированного подтипа либо непосредственно за обозначением типа, либо как часть ограничения для фиксированного типа. В обоих случаях границы диапазона должны принадлежать базовому типу обозначения типа (см. 3.5).
Примеры:
type VOLT is delta 0.125 range 0.0 .. 255.0; subtype ROUGH_VOLTAGE is VOLT delta 1.0; — диапазон, как у VOLT
-- Правильная дробь, требующая полного машинного слова в -- дополнительном коде, может быть описана как тип FRACTION:
DEL : constant := 1.0/2**(WORD_LENGTH - 1); type FRACTION is delta DEL range -1.0 .. 1.0 - DEL;
Ссылки:
анонимный тип 3.3.1, арифметическая операция 3.5.5, 4.5, базовый тип 3.3, вещественный тип 3.5.6, граница диапазона 3.5, граница ошибки 3.5.6, модельное число 3.5.6, обозначение типа 3.3.2, ограничение диапазона 3.5, операция 3.3, описание подтипа 3.3.2, описание типа 3.3.1, определение вещественного типа 3.5.6, подтип 3.3, предвыполнение 3.9, предопределенная операция 4.5, преобразование 4.6, принадлежит подтипу 3.3, простое выражение 4.4, совместимо 3.3.2, спецификатор длины 13.2, статическое выражение 4.9, тип 3.3, указание подтипа 3.3.2, хранимое число 3.5.6, числовой тип 3.
3.5.10. ОПЕРАЦИИ НАД ФИКСИРОВАННЫМИ ТИПАМИ
Базовые операции над фиксированным типом включают присваивание, проверку принадлежности, квалификацию, явное преобразование значений других числовых типов в значения этого фиксированного типа и неявное преобразование значений типа
универсальный-вещественный в
значение этого типа.
Кроме того, для каждого фиксированного типа или подтипа Т базовые операции включают перечисленные ниже атрибуты.
В этом представлении атрибутов Т ссылается на подтип ( подтип Т) для любого свойства, зависящего от ограничений, наложенных Т; другие свойства установлены в терминах базового типа Т.
Первая группа атрибутов вырабатывает характеристики подтипа Т. К этой группе относятся атрибуты ВАЗЕ (см. 3.3.3), FIRST и LAST (см. 3.5), атрибут представления SIZE (см. 13.7.2) и следующие атрибуты:
T'DELTA |
Вырабатывает значение дельты, заданной в определении точности фиксированного типа для подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'MANTISSA |
Вырабатывает число двоичных цифр в мантиссе модельных чисел подтипа Т. (Этот атрибут вырабатывает число В, см. 3.5.9.) Значение этого атрибута имеет тип универсальный-целый. |
T'SMALL |
Вырабатывает наименьшее положительное (ненулевое) модельное число подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'LARGE |
Вырабатывает наибольшее модельное число подтипа Т. Значение этого атрибута имеет тип универсальный,вещественный. |
T'FORE |
Вырабатывает минимальное число символов, необходимых для десятичного представления целой части любого значения подтипа Т в предположении, что это представление не включает порядок, но включает один символ, который является либо знаком минус, либо пробелом. (Это минимальное число не учитывает предшествующие нули и подчеркивания и по меньшей мере равно двум.) Значение этого атрибута имеет тип универсальный-целый. |
T'AFT |
Вырабатывает число десятичных цифр после точки, необходимых для обеспечения точности подтипа Т, если только DELTA подтипа Т не превышает 0.1, а для этого значения атрибут вырабатывает значение единицы. (T'AFT — это самое малое положительное целое К, для которого (10«*К)*Т'ОЕ1ТА больше или равно единице.) Значение этого атрибута имеет тип универсальный_целый. |
T'SAFE_SMALL |
Вырабатывает наименьшее положительное (ненулевое) хранимое число базового типа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'SAFE_LARGE |
Вырабатывает наибольшее положительное хранимое число базового типа Т. Значение этого атрибута имеет тип универсальный- вещественный. |
/p>
Кроме того, для объекта А фиксированного типа определены атрибуты A'SIZE и A'ADDRESS (см. 13.7.2). Для каждого фиксированного типа или подтипа Т существуют машинно-зависимые атрибуты T'MACHINE_ROUNDS и T'MACHINE_OVERFLOWS (см. 13.7.3).
Кроме базовых в состав операций над фиксированным типом входят операции отношения и следующие предопределенные арифметические операции: унарные и бинарные аддитивные операции - и +, мультипликативные операции «и/и операция
abs.
Операции над подтипом — это соответствующие операции над типом, кроме следующих:
присваивания, проверки принадлежности, квалификации, явного преобразования и атрибутов первой группы; результат этих операций определен в терминах подтипа.
Примечание.
Значение атрибута T'FORE зависит только от диапазона подтипа Т. Значение атрибута T'AFT зависит только от значения T'DELTA. Между атрибутами фиксированного типа существуют следующие соотношения:
T'LARGE = (2**Т'MANTISSА - 1) * T'SMALL T'SAFE_LARGE = T'BASE'LARGE T'SAFE_SMALL = T'BASE'SMALL
Ссылки:
арифметическая операция 3.5.5, 4.5, базовая операция 3.3.3, базовый тип 3.3, бинарная аддитивная операция 4.5, 4.5.3, граница диапазона 3.5, дельта 3.5.9, квалифицированное выражение 4.7, модельное число 3.5.6, мультипликативная операция 4.5, 4.5.5, объект 3.2, операция 3.3, операция
abs
4.5, 4.5.6, операция отношения 4.5, 4.5.2, подтип 3.3, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, унарная аддитивная операция 4.5, 4.5.4, универсальный вещественный тип 3.5.6, универсальный целый тип 3.5.4, фиксированный тип 3.5.9, хранимое число 3.5.6, числовой тип 3.5.
Пред. | Уровень выше | След. |
3.4. ПРОИЗВОДНЫЕ ТИПЫ |
Содержание | 3.6. ИНДЕКСИРУЕМЫЕ ТИПЫ |
Совмещение операций
Описание функции, обозначение которой является знаком операции, используется для совмещения операций. Последовательность символов в знаке операции должна быть обозначением операции: логической, отношения, бинарной аддитивной, унарной аддитивной, мультипликативной или высшего приоритета (см. 4.5). В качестве обозначения функции не допускаются никакие проверки вхождения, ни формы управления с промежуточной проверкой.
Спецификация подпрограммы унарной операции должна иметь один-единственный параметр. Спецификация подпрограммы бинарной операции должна иметь два параметра; при каждом использовании этой операции левый операнд берется в качестве первого фактического параметра, правый операнд — в качестве второго параметра; конкретизация настройки функции, которая обозначена знаком операции, допускается, только если спецификация настраиваемой функции имеет соответствующее число параметров. Выражения по умолчанию для параметров операции недопустимы (описана ли операция явно спецификацией подпрограммы или конкретизацией настройки).
Операции + и - допускают как унарную, так и бинарную совмещенную операцию.
Явное описание функции, которая совмещает операцию =, отличное от описания переименования, допустимо, только если оба параметра являются параметрами одного и того же лимитируемого типа. Совмещение равенства должно давать результат предопределенного типа BOOLEAN; операция неравенства /=, дающая результат, дополнительный к результату операции равенства, совмещается неявно при задании операции равенства. Явное совмещение операции неравенства недопустимо.
Описание переименования, обозначение которого — операция равенства, допустимо только для переименования другой операции равенства. (Например, такое описание переименования может быть использовано, когда равенство видимо по имени, но не непосредственно.)
Примечание.
Совмещение операций отношения не нарушает соотношений, таких как проверка вхождения в диапазон или выборы в операторе выбора.
Примеры:
function "+" (LEFT, RIGHT : MATRIX) return MATRIX; function "+" (LEFT, RIGHT : VECTOR) return VECTOR;
-- в предположении, что А, В и С типа VECTOR -- три следующих присваивания эквивалентны
А := B + С;
А := "+"(В, С); А := "+"(LEFT => В, RIGHT => С);
Ссылки:
бинарная аддитивная операция 4.5, 4.5.3, видимый по именованию 8.3, выражение по умолчанию для формального параметра 6.1, дополнительный результат 4.5.2, допустимо 1.6, знак операции 6.1, лимитируемый тип 7.4.4, логическая операция 4.5, 4.5.1, логический предопределенный тип 3.5.3, мультипликативная операция 4.5, 4.5.5, непосредственно видимо 8.3, неявное описание 3.1, обозначение 6.1, операция 4.5, операция высшего приоритета 4.5, 4.5.6, операция неравенства 4.5.2, операция отношения 4.5, 4.5.2, операция равенства 4.5, описание 3.1, описание функции 6.1, определение типа 3.3.1, проверка вхождения 4.5, 4.5.2, символ 2.1, совмещение 6.6, 8.7, унарная аддитивная операция 4.5, 4.5.4, фактический параметр 6.4.1, форма управления с промежуточной проверкой 4.5, 4.5.1, формальный параметр 6.1.
Пред. | Уровень выше | След. |
6.6. ПРОФИЛЬ ТИПА ПАРАМЕТРОВ И РЕЗУЛЬТАТА. СОВМЕЩЕНИЕ ПОДПРОГРАММ |
Содержание | Глава 7. ПАКЕТЫ |
Спецификации и описания пакетов
Первый список элементов описания в спецификации пакета называется
видимым разделом
пакета. Необязательный список элементов описания после зарезервированного слова
private
называется
личным разделом
пакета.
Понятие, описанное в личном разделе пакета, невидимо вне з^ого пакета (имя, обозначающее такое понятие, доступно только в пакете). В противоположность этому расширенные имена, обозначающие описанные в видимом разделе понятия, могут быть использованы даже вне этого пакета; прямую видимость этих понятий можно получить также с помощью спецификатора использования (см. 4.1.3 и 8.4).
Предвыполнение описания пакета состоит в предвыполнении его основных элементов описания в порядке их следования.
Примечание.
Видимый раздел пакета содержит всю информацию, доступную для другого программного модуля. Пакет, состоящий только из спецификации пакета (т. е. без тела пакета), может быть использован для представления группы общих констант или переменных или общей совокупности объектов и типов, как показано ниже в примерах.
Пример пакета, описывающего группу общих переменных:
package PLOTTING_DATA is
PEN_UP : BOOLEAN;
CONVERSION_FACTOR, X_OFFSET, Y_OFFSET, X_MIN, Y_MIN, X_MAX, Y_MAX: REAL; -— CM. 3.5.7
X_VALUE : array (1 .. 500) of REAL; Y_VALUE : array (1 .. 500) of REAL; end PLOTTING-DATA;
Пример пакета, описывающего общую совокупность объектов и типов:
package WORK_DATA is
type DAY is (MON, TUE, WED, THU, FRI, SAT, SUN); type HOURS_SPENT is delta 0.25 range 0.0 .. 24.0; type TIME_TABLE is array (DAY) of HOURS_SPENT;
WORK_HOURS : TIME_TABLE;
NORMAL_HOURS : contant TIME_TABLE := (MON .. THU => 8.25, FRI ==> 7.0, SAT | SUN => 0.0>; end WORK_DATA;
Ссылки:
идентификатор пакета 7.1, имя 4.1, константа 3.2.1, область действия 8.2, описание объекта 3.2.1, описание пакета 7.1, описание типа 3.3.1, описание числа 3.2.2, основной элемент описания 3.9, пакет 7, переменная 3.2.1, Предвыполнение 3.9, простое имя 4.1, прямая видимость 8.3, расширенное имя 4.1.3, спецификатор использования 8.4, спецификация пакета 7.1, элемент описания 3.9.
Пред. | Уровень выше | След. | |
Глава 7.
ПАКЕТЫ
|
Содержание |
7.3. ТЕЛА ПАКЕТОВ |
Спецификации задач и тела задач
Задачный модуль состоит из спецификации задачи и тела задачи.
Спецификация задачи,
которая начинается зарезервированными словами
task type,
описывает
задачный тип.
Значение объекта задачного типа указывает
задачу.
Если задача имеет входы, то они описываются в спецификации задачи; эти входы также называются входами объекта. Выполнение задачи определяется соответствующим телом задачи.
Спецификация задачи без зарезервированного слова
type
определяет
одну задачу.
Описание такой задачи эквивалентно описанию анонимного задачного типа одновременно с описанием объекта этого задачного типа, а идентификатор задачного модуля именует объект. В остальной части данной главы пояснения даются в терминах описаний задачного типа; соответствующие пояснения для одной задачи следуют из упомянутого отношения эквивалентности.
описание-задачи ::== спецификация-задачи; спецификация - задачи :: = task [type] идентификатор [is
{описание - входа} {спецификатор - представления} end [простое-имя-задачи]] тело-задачи ::= task body простое-имя-задачи is
[раздел - описаний] begin
последовательность - операторов [exception
обработчик - исключения {обработчик-исключения}] end [простое-имя-задачи];
Простое имя в начале тела задачи должно совпадать с идентификатором задачного моду-ля. Аналогично если в конце спецификации или тела задачи появляется простое имя, то оно должно совпадать с идентификатором задачного модуля. Внутри тела задачи имя соответствующего задачного модуля может быть также использовано для ссылки на объект-задачу (указывать на задачу), тело которой выполняется в данный момент; кроме того, не допускается использование этого имени в качестве обозначения типа внутри собственного задачного модуля. [7]
При предвыполнении спецификации задачи описания входов и спецификаторы представления (если они есть) предвыполняются в том порядке, в котором они даны. Спецификаторы представления применяются только к входам, описанным в спецификации задачи (см. 13.5).
Предвыполнение тела задачи не имеет никакого другого результата, кроме установления, что тело с этих пор может быть использовано для выполнения задач, указанных объектами соответствующего задачного типа.
Выполнение тела задачи вызывается активизацией задачного объекта соответствующего типа (см. 9.3). Возможные в конце тела задачи обработчики исключений обрабатывают исключения, возбуждаемые в ходе выполнения последовательности операторов тела задачи (см. 11.4).
Примеры спецификации задачных типов:
task type RESOURCE is
entry SEIZE; entry RELEASE; end RESOURCE;
task type KEYBOARD_DRIVER is
entry READ (C : out CHARACTER); entry WRITE (C : In CHARACTER); endKEYBOARD_DRIVER;
Примеры спецификации одной задачи:
task PRODUCER_CONSUMER is
entry READ (V : out ITEM); entry WRITE (E : in ITEM); end;
task CONTROLLER is
entry REQUEST(LEVEL)(D : ITEM); -— семейство ВХОДОВ end CONTROLLER;
task USER; -— не имеет входов
Пример спецификации задачи и соответствующего тела:
task PROTECTED_ARRAY is
-— INDEX and ITEM — это глобальные типы entry READ (N : in INDEX; V : out ITEM); entry WRITE (N : In INDEX; E : in ITEM); end;
task body PROTECTED_ARRAY is
TABLE : array(INDEX) of ITEM := (INDEX => NULL_ITEM); begin loop select
accept READ (N : in INDEX; V : out ITEM) do
V := TABLE(N); end READ; or
accept WRITE (N : in INDEX; E : in ITEM) do
TABLE(N) := E; end WRITE; end select;
end loop;
end PROTECTED_ARRAY;
Примечание.
Спецификация задачи задает интерфейс задачам данного типа с другими задачами тех же или различных типов, а также с главной программой.
Ссылки:
вход 9.5, главная программа 10.1, зарезервированное слово 2.9, идентификатор 2.3, обработчик исключения 11.2, объект 3.2, описание 3.1, описание входа 9.5, описание объекта 3.2.1, описание типа 3.3.1, последовательность операторов 5.1, предвыполнение 3.9, простое имя 4.1, раздел описаний 3.9, спецификатор представления 13.1, тип 3.3.
[7]
1) Кроме того, оно не может быть использовано в качестве производного от него типа или подтипа. -
Прим. ред.
Пред. | Уровень выше | След. |
8.7. КОНТЕКСТ РАЗРЕШЕНИЯ СОВМЕЩЕНИЯ |
Содержание | 9.2. ЗАДАННЫЕ ТИПЫ И ЗАДАЧНЫЕ ОБЪЕКТЫ |
Спецификация пакета исключений ввода-вывода
В этом пакете определены исключения, необходимые для работы пакетов SEQUENTIAL_IO, DIRECT_IO и TEXT_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;
Пред. | Уровень выше | След. | |
14.4. ИСКЛЮЧЕНИЯ ПРИ ВВОДЕ-ВЫВОДЕ
|
Содержание |
14.6. ВВОД-ВЫВОД НИЗКОГО УРОВНЯ |
Спецификаторы адреса
Спецификатор адреса задает адрес в памяти для понятия.
спецификатор - адреса :: = for простое-имя use at простое-выражение;
Выражение после зарезервированного слова
at
должно быть типа ADDRESS, определенного в пакете SYSTEM (см. 13.7). Этот пакет должен быть именован в спецификаторе совместности компилируемого модуля, в котором помещается спецификатор адреса. Условия, определяющие интерпретацию значения типа ADDRESS как адреса, уровня прерывания или чего-либо другого, зависят от реализации. Ниже перечислены допустимые толкования простого имени и смысл соответствующего адреса:
а) имя объекта: требуемый адрес — адрес объекта (переменной или константы);
б) имя подпрограммы, пакета или задачного модуля: требуемый адрес — адрес машинного кода, связанного с телом программного модуля;
в) имя одиночного входа: адрес задает аппаратное прерывание, связанное с этим входом. Если простое имя — это имя одиночной задачи, то спецификатор адреса относится к задачному модулю, а не к задачному объекту. Во всех случаях спецификатор адреса является правильным только тогда, когда точно одно описание с этим идентификатором помещено раньше непосредственно в том же разделе описаний, спецификации пакета или спецификации задачи. В качестве простого имени недопустимо имя, введенное описанием переименования.
Спецификаторы адреса не могут быть использованы для задания перекрытия объектов или перекрытия программных модулей. Данное прерывание может быть связано не более чем с одним входом. Любая программа, использующая такой спецификатор адреса, ошибочна.
Пример:
for CONTROL use at 16#0020#; -— предполагается, что SYSTEM.ADDRESS -- это некоторый целый тип
Примечание.
Из приведенных правил следует, что если в данной точке программы видимы две совмещенные подпрограммы, то спецификатор адреса для каждой из этих подпрограмм является неправильным в данной точке. Аналогично если в спецификации задачи описаны совмещенные друг с другом входы, то они не могут быть входами прерываний.
Для библиотечного модуля синтаксис не допускает спецификатора адреса. Реализацией могут быть определены прагмы для обеспечения оверлейных перекрытий программ.
Ссылки:
библиотечный модуль 10,1, вход 9.5, выражение 4.4, задачный модуль 9, задачный объект 9.2, зарезервированное слово 2.9, имя 4.1, компилируемый модуль 10.1, константа 3.2.1, объект 3.2, ошибочна 1.6, пакет 7, пакет SYSTEM 13.7, переменная 3.2.1, подпрограмма 6, понятие 3.1, прагма 2.8, предопределенный тип ADDRESS 13.7, применим 10.1.1, программный модуль 6, простое выражение 4.4, простое имя 4.1, спецификатор совместности 10.1.1, тело задачи 9.1, тело подпрограммы 6.3, тип 3.3.
13.5.1. ПРЕРЫВАНИЯ
Спецификатор адреса для входа сопоставляет вход с некоторым устройством, которое может вызвать прерывание; такой вход в этом разделе называется
входом по прерыванию.
Если прерывание сопровождается управляющей информацией, то она передается соответствующему входу по прерыванию как один или несколько параметров входа вида
in;
допустимы параметры только такого вида.
Прерывание действует как вызов входа некоторой связанной с оборудованием задачи, приоритет которой выше приоритета главной программы и любых определенных пользователем задач (т.е. любой задачи, тип которой описан с помощью задачного модуля в программе). Вызов входа может быть обычным, временным или условным вызовом входа в зависимости от вида прерывания и от реализации.
Если оператор отбора содержит как альтернативу завершения, так и альтернативу принятия входа по прерыванию, то реализация может наложить некоторые дополнительные требования на отбор альтернативы завершения в дополнение к требованиям, сформулированным в разд. 9.4.
Пример:
task INTERRUPT_HANDLER is
entry DONE; for DONE use at 16#40#; -- предполагается, что SYSTEM. ADDRESS -— это некоторый целый тип end INTERRUPT_HANDLER;
Примечание.
Вызовы входа по прерыванию имеют только описанную выше семантику;
они могут быть реализованы с помощью аппаратуры, непосредственно выполняющей соответствующие операторы принятия.
Выстраиваемые в очередь прерывания соответствуют обычным вызовам входа. Прерывания, которые теряются или немедленно не обрабатываются, соответствуют условным вызовам входов. Из правил приоритетов следует, что оператор принятия, выполняемый в ответ на прерывание, имеет более высокий приоритет, чем определенные пользователями обычные задачи, и может быть выполнен без задачи, выполняющей планировку.
Одним из возможных результатов указания спецификатора адреса для входа по прерыванию является спецификация (непосредственно или косвенно) приоритета прерывания. Допустимы прямые вызовы входов по прерыванию.
Ссылки:
альтернатива завершения 9.7.1, альтернатива отбора 9.7.1, альтернатива принятия 9.7.1, вид 6.1, временной вызов входа 9.7.3, вход 9.5, выход входа 9.5, допустим 1.6, задача 9, оператор отбора 9.7, оператор принятия 9.5, пакет SYSTEM 13.7, параметр подпрограммы 6.2, предопределенный тип ADDRESS 12.7, приоритет задачи 9.8, условный вызов входа 9.7.2.
Пред. | Уровень выше | След. |
13.4. СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ ЗАПИСЕЙ |
Содержание | 13.6. ИЗМЕНЕНИЕ ПРЕДСТАВЛЕНИЯ |
Спецификаторы длины
Спецификатор длины задает объем памяти:
спецификатор длины ::= for атрибут use простое-выражение;
Выражение должно быть некоторого числового типа; оно вычисляется, при пред выполнении спецификатора длины (кроме случая, когда оно является статическим). Префикс атрибута должен обозначать либо тип, либо первый именованный подтип. Далее этот префикс обозначается буквой Т. В спецификаторе длины в качестве обозначений атрибутов допустимы только SIZE, STORAGE_SIZE и SMALL. Результат применения спецификатора длины зависит от обозначения атрибута.
а) Спецификация размера: Т'SIZE
Выражение должно быть статическим некоторого целого типа. Его значение определяет максимальное число битов, используемых для размещения в памяти объектов типа или первого именованного подтипа Т. Спецификация размера должна задавать объем памяти, достаточный для размещения любого допустимого значения таких объектов. Спецификация размера для составного типа может повлиять на размер промежутков между областями памяти, отводимыми под последовательные компоненты. С другой стороны, нет необходимости влиять на размер области памяти, отводимой для каждой компоненты.
Спецификация размера допустима, только если ограничения на Т и его компоненты (если они есть) являются статическими. Для неограниченного индексируемого типа статическими должны быть также подтипы индексов.
б) Спецификация размера набора: T'STORAGE_SIZE
Префикс Т должен обозначать ссылочный тип. Выражение должно быть некоторого целого типа (но не обязательно статическим); его значение определяет число квантов памяти, выделяемых для набора, т.е. объем памяти, необходимый для размещения всех объектов, указанных значениями ссылочного типа и значениями других типов, непосредственно или косвенно производных от ссылочного типа. Эта форма спецификатора длины недопустима для типа, производного от ссылочного типа.
в) Спецификация объема памяти для активизации задачи: T'STORAGE_SIZE
Префикс Т должен обозначать задачный тип. Выражение должно быть некоторого целого типа (но не обязательно статическим); его значение определяет число квантов памяти, выделяемых для активизации (но не для кода) задачи данного типа.
г) Спецификация
наименьшего
для фиксированных типов: Т'SMALL
Префикс Т должен обозначать первый именованный подтип фиксированного типа. Выражение должно быть статическим некоторого вещественного типа; его значение должно быть не больше, чем дельта этого первого поименованного подтипа. Результат применения спецификатора длины — использование этого
наименьшего
значения для представления значений фиксированного базового типа. (Спецификатор длины, таким образом, также влияет на выделенный для объектов этого типа объем памяти.)
Примечание.
Спецификация размера допустима для ссылочного, задачного или фиксированного типов независимо от того, задана или нет для такого типа какая-либо другая форма спецификатора длины.
От реализации зависит, чтб понимается под резервированием части памяти для набора или активизации задачи. Поэтому управление с помощью спецификаторов длины зависит от соглашений в реализации. Например, в языке не определено, включается ли в память, выделяемую для активизации задачи память, необходимая для размещения набора, сопоставленного ссылочному типу и описанному в теле задачи. Метод распределения памяти под объекты, обозначенные значениями ссылочного типа, также не определяется. Например, место может выделяться в стеке; можно использовать схему настраиваемого динамического распределения памяти, или память может быть зафиксирована.
Размещенные объекты набора не обязаны занимать одинаковые размеры памяти, если указанный тип — это неограниченный индексируемый тип или неограниченный тип с дискриминантами. Заметим также, что сам генератор может требовать некоторый объем памяти для размещения внутренних таблиц и связей. Следовательно, спецификатор длины для набора ссылочного типа не всегда позволяет точно управлять максимальным числом генерируемых объектов.
Примеры:
-- предполагаемые описания:
type MEDIUM is range 0 .. 65000; type SHORT is delta 0.01 range -100.0 .. 100.0; type DEGREE is delta 0.1 range -360.0 .. 360.0;
BYTE : constant := 8; PAGE : constant := 2000;
-- спецификаторы длины:
for COLOR'SIZE use UBYTE; -— см. 3.5.1 for MEDIUM'SIZE use 2*BYTE; for SHORT'SIZE use 15;
for CAR_NAME'STORAGE_SIZE use -- примерно 2000 машин 2000*((CAR'SIZE/SYSTEM.STORAGE_UNIT) +1);
for KEYBOARD_DRIVER_STORAGE_SIZE use 1*PAGE;
for DEGREE'SMALL use 360.0/2**(SYSTEM.STORAGE_UNIT - 1);
Примечание к примерам.
В спецификаторе длины для SHORT минимально необходимы пятнадцать разрядов, так как определение типа требует SHORT'SMALL = 2.0**(-7) и SHORT'MANTISSA = 14. Спецификатор длины для DEGREE вводит модельные числа, которые занимают в точности весь диапазон типа.
Ссылки:
активизация задачи 9.3, атрибут 4.1.4, вещественный тип 3.5.5, выражение 4.4, вычисление 4.5, генератор 4.8, дельта фиксированного типа 3.5.9, должен 1.6, допустим 1.6, задача 9, задачный тип 9.1, именуемый тип 3.7, индексируемый тип 3.6, квант памяти 13.7, подкомпонента 3.3, набор 3.8, наименьшее фиксированного типа 3.5.10, неограниченный индексируемый тип 3.6, объект 3.2, ограничение 3.3, пакет SYSTEM 13.7, первый именованный подтип 13.1, подтип индекса 3.6, понятие 3.1, предвыполнение 3.9, производный тип 3.4, составной тип 3.3, спецификация задачи 9.1, ссылочный тип 3.8, статический подтип 4.9, статическое выражение 4.9, статическое ограничение 4.9, тип 3.3, указывать 3.8, фиксированный тип 3.5.9, целый тип 3.5.4, числовой тип 3.5.
Пред. | Уровень выше | След. |
Глава 13. СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ И ОСОБЕННОСТИ, ЗАВИСЯЩИЕ ОТ РЕАЛИЗАЦИИ |
Содержание | 13.3. СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ ПЕРЕЧИСЛЕНИЯ |
Спецификаторы представления
Спецификаторы представления задают способ представления типов в объектной машине для более эффективного представления или для интерфейса с внеязыковой сферой (например, с периферийным оборудованием).
спецификатор-представления :: = спецификатор-представления-типа | спецификатор-адреса
спецификатор-представления-типа ::= спецификатор-длины | спецификатор-представления-перечисления | спецификатор-представления-записи
Спецификатор представления типа применяется либо к типу, либо к
первому именованному подтипу
(т.е. подтипу, идентифицированному описанием типа, базовый тип которого является анонимным). Такой спецификатор представления применяется ко всем объектам данного типа или данного первого именованного подтипа. Для конкретного типа допустимо не более одного спецификатора представления перечисления или записи; спецификатор представления перечисления допустим только для перечислимого типа; спецификатор представления записи — только для именуемого типа. (С Другой стороны, для конкретного типа может быть задано более одного спецификатора длины; более того, могут быть одновременно заданы спецификатор длины и спецификатор представления записи или перечисления.) Спецификатор длины — это единственный из спецификаторов представления, допустимый для производного от родительского типа, имеющего (определенные пользователем) наследуемые подпрограммы.
Спецификатор адреса применяется либо к объекту, либо к подпрограмме, пакету или за-дачному модулю, либо к входу. Для любого из этих понятий допустимо не более одного спецификатора адреса.
Спецификатор представления и описание понятия, к которому применяется спецификатор, должны оба находиться непосредственно в одном и том же разделе описаний, спецификации пакета или спецификации задачи; описание должно помещаться до спецификатора. В отсутствие спецификатора представления для данного описания реализация определяет представление по умолчанию. Место нахождения такого подразумеваемого определения представления по умолчанию — не позже конца непосредственно объемлющего раздела описаний, спецификаций пакета или задачи.
Для описания из раздела описаний место нахождения подразумеваемого определения по умолчанию — до любого вложенного тела.
В случае типа некоторые вхождения его имени неявно предполагают, что представление типа уже должно быть определено. Следовательно, такие вхождения требуют определения по умолчанию любого способа представления, еще не определенного предшествующим спецификатором представления типа. Аналогичные вхождения имени подтипа этого типа или имени любого типа или подтипа с подкомпонентами данного типа также требуют определения по умолчанию. Требуемое вхождение — это любое вхождение, отличное от вхождения в описание типа или подтипа, спецификацию подпрограммы, описание входа, описание субконстанты, прагму или спецификатор представления для самого типа. В любом случае вхождение в выражение является всегда требуемым.
Спецификатор представления для данного понятия не должен помещаться после вхождения имени понятия, если вхождение требует определения представления этого понятия по умолчанию.
Аналогичные ограничения существуют для спецификатора адреса. Любое вхождение имени объекта (после описания объекта) требует определения представления. Для подпрограммы, пакета, задачного модуля или входа любое вхождение атрибута представления таких понятий является требуемым вхождением.
Результат предвыполнения спецификатора аспектов представления — определение соответствующих представления.
Интерпретация некоторых выражений, помещенных в спецификаторах представления, зависит от реализации, например, выражений, задающих адреса. Реализация может ограничивать использование спецификаторов представления лишь теми, которые можно просто обрабатывать на имеющемся оборудовании. Для учитываемых реализации спецификаторов представления компилятор должен гарантировать назависимость конечного результата работы программы от наличия или отсутствия таких спецификаторов представления, исключая спецификатор адреса и те разделы программы, где используются атрибуты представления.
Если программа содержит спецификатор представления, который не учитывается реализацией, она неправильна. Для каждой реализации в приложении даются правила составления руководства по языку, в котором должны быть описаны допустимые ею спецификаторы представления и соглашения для выражений, зависящих от реализации.
Если спецификатор представления используется для того, чтобы предписывать некоторые характеристики отображения понятия в объектной машине, то для выбора такого отображения реализация может использовать прагмы. Прагма PACK указывает, что минимизация размера памяти является главным критерием при выборе представления именуемого или индексируемого типа. Ее форма такова:
pragma
PACK (простое имя-
типа);
Упаковка означает, что промежутки между областями памяти, выделенные под последовательные компоненты, следует минимизировать, упаковка не влияет на отображение в памяти каждой компоненты. На отображение компонент можно повлиять прагмой (или спецификатором представления) для компоненты или типа компоненты. Место прагмы PACK в программе и ограничения на именованный тип подчинены тем же правилам, что и для спецификатора представления; в частности, прагма должна помещаться до любого использования атрибута представления упакованного понятия.
Прагма PACK — единственная определенная в языке прагма, связанная с представлением. Реализация может вводить дополнительные прагмы; они должны быть перечислены в приложении F. (В отличие от спецификаторов представления прагма, которая не принята в реализации, игнорируется.)
Примечание.
Для формального типа настройки недопустим спецификатор представления.
Ссылки:
атрибут представления 13,7.2, 13.7.3, вход 9.5, выражение 4.4, выражение по умолчанию 3.2.1, должно 1.6, допустим 1.6, задачный модуль 9, имя 4.1, компонента 3.3, наследуемая подпрограмма 3.4, находится непосредственно в 8.1, неправильная 1.6, объект 3.2, описание 3.1, описание подтипа 3.3.2, описание субконстанты 7.4, описание типа 3.3.1, пакет 7, подкомпонента 3.3, подпрограмма 6, подтип 3.3, понятие 3.1, прагма 2.8, производный тип 3.4, раздел описаний 3.9, родительский тип 3.4, спецификатор адреса 13.5, спецификатор длины 13.2, спецификация задачи 9.1, спецификация пакета 7.1, спецификатор представления записи 13.4, спецификатор представления перечисления 13.3, тело 3.9, тип 3.3, формальный тип настройки 12.1.2.
Пред. | Уровень выше | След. |
12.4. ПРИМЕР НАСТРАИВАЕМОГО ПАКЕТА |
Содержание | 13.2. СПЕЦИФИКАТОРЫ ДЛИНЫ |
Спецификаторы представления перечисления
Спецификатор представления перечисления задает внутренние коды для литералов перечислимого типа, указанного в спецификаторе.
спецификатор-представления-перечисления ::= for простое-имя-типа use агрегат;
Используемый в спецификаторе агрегат записывается как одномерный агрегат, в кото ром подтип индекса — перечислимый тип, а тип компоненты —
универсальный-целый
тип.
Для всех литералов перечислимого типа должны быть заданы различные целые коды, и все выборы и значения всех компонент в агрегате должны быть статическими. Целые коды, заданные для перечислимого типа, должны удовлетворять предопределенному отношению упорядоченности типа.
Пример:
type MIX_CODE is (ADD, SUB, MUL, LDA, STA, STZ); for MIX_CODE use
(ADD => 1, SUB => 2, MUL => 3, LDA => 8, STA => 24, STZ => 33);
Примечание.
Атрибуты SUCC, PRED и PCS определены даже для перечислимых типов с разрывным представлением; их определение соответствует (логическому) описанию типа, и на них не влияет спецификатор представления перечисления. В примере из-за того, что значения даны с пропуском, эти функции реализуются менее эффективно, чем это могло быть в отсутствие спецификатора представления. Это же справедливо и при использовании таких типов для индексации.
Ссылки:
агрегат 4.3, агрегат массива 4.3.2, атрибут перечислимого типа 3.5.5, выбор 3.7.3, индекс 3.6, индексируемый тип 3.6, компонента 3.3, литерал 4.2, литерал перечисления 3.5.1, описание типа 3.3.1, отношение упорядоченности для перечислимого типа 3.5.1, перечислимый тип 3.5.1, подтип индекса 3.6, простое имя 4.1, спецификатор представления 13.1, статическое выражение 4.9, тип 3.3, универсальный-целый тип 3.5.4, функция 6.5.
Пред. | Уровень выше | След. | |
13.2. СПЕЦИФИКАТОРЫ ДЛИНЫ
|
Содержание |
13.4. СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ ЗАПИСЕЙ |
Спецификаторы представления записей
Спецификатор представления записи задает представление записи в памяти, т.е. порядок, позицию и размер компонент записи (включая дискриминанты, если они есть).
спецификатор-представления-записи ::= for простое-имя-типа use
record [спецификатор-выравнивания] (спецификатор - компоненты) end record;
спецификатор-выравнивания ::= at mod статическое-простое-выражение;
спецификатор-компоненты ::= имя-компоненты at статическое-простое-выражение range статический-диапазон;
Простое выражение, заданное в спецификаторе выравнивания после зарезервированных слов
at mod
или в спецификаторе компоненты после зарезервированного слова
at,
должно быть статическим некоторого целого типа. Если в спецификаторе компоненты границы диапазона спецификатора компоненты определяются простыми выражениями, то каждая граница должна быть определена как статическое выражение любого целого типа; не обязательно, чтобы обе границы были одного и того же целого типа.
Спецификатор выравнивания требует, чтобы каждая запись данного типа была размещена начиная с адреса памяти, кратного значению данного выражения (т.е. адрес по модулю выражения должен быть равен нулю). Реализация может наложить ограничения на допускаемые выравнивания.
Спецификатор компоненты специфицирует для компоненты место
в памяти
относительно начала записи. Значение целого типа, определенное статическим выражением в спецификаторе компоненты, — это относительный адрес, выраженный в квантах памяти. Диапазон определяет позиции разрядов места памяти относительно этого кванта памяти. Первый квант памяти для записи имеет нулевой номер. Первый разряд кванта памяти тоже имеет нулевой номер. Порядок разрядов в кванте памяти машинно-зависим, а их нумерация может переходить на соседние кванты. (Для конкретной машины размер кванта памяти в разрядах задан с помощью зависящего от конфигурации именованного числа SYSTEM.STORAGE-UNIT.) Допускается размещение одной компоненты записи в соседних квантах памяти, это размещение определяется реализацией.
Для каждой компоненты именуемого типа, включая каждый дискриминант, допустимо не более одного спецификатора компоненты. Спецификаторы компонент могут быть даны для нескольких, всех или ни для одной из компонент. Если для компоненты не задан спецификатор компоненты, то выбор места в памяти для компоненты определяется компилятором. Если спецификаторы компонент даны для всех компонент, то спецификатор представления записи полностью задает представление именуемого типа и компилятор должен в точности следовать спецификатору.
Места в памяти для компонент в пределах одного варианта не должны перекрываться, но допускается перекрытие для различных вариантов. Каждый спецификатор компоненты должен допускать достаточный размер памяти для размещения допустимого значения компоненты. Спецификатор компоненты допустим только для такой компоненты, для которой любое ограничение, наложенное на него или на его подкомпоненты, является статическим.
Реализация может генерировать имена, обозначающие зависящие от реализации компоненты (например, компоненту, содержащую смещение другой компоненты). Такие имена могут быть использованы в спецификаторах представления записей (эти имена могут не быть простыми именами, например они могут быть зависящими от реализации атрибутами).
Пример:
WORD : constant := 4; -- квант памяти — это байт; в слове 4 байт type STATE is (A, M, W, Р); type MODE is (FIX, DEC, EXP, SIGNIF);
type BYTE_MASK is array (0 .. 7) of BOOLEAN; type STATE_MASK is array (STATE) of BOOLEAN; type MODE_MASK is array (MODE) of BOOLEAN;
type PROGRAM_STATUS_WORD is
record
SYSTEM_MASK : BYTE_MASK; PROTECTION_KEY : INTEGER range 0 .. 3; MACHINE_STATE : STATE_MASK; INTERRUPT_CAUSE : INTERRUPTION_.CODE; ILC : INTEGER range 0 .. 3; CC : INTEGER range 0 .. 3; PROGRAM_MASK : MODE_MASK; INST_ADDRESS : ADDRESS; end record;
for PROGRAM_STATUS_WORD use
record at mod 8; SYSTEM_MASK at 0*WORD range 0 .. 7; PROTECTION_KEY at 0*WORD range 10 .. 11; -- биты 8, 9 не использует MACHINE_STATE at 0*WORD range 12 .. 15; INTERRUPT-CAUSE at 0+WORD range 16 .. 31; ILC at 1*WORD range 0 .. 1; -- второе слово СС at 1*WORD range 2 .. 3; PROGRAM_MASK at 1*WORD range 4 .. 7; INST_ADDRESS at 1*WORD range 8 .. 31; end record;
for PROGRAM_STATUS_WORD'SIZE use 8*SYSTEM.STORAGE_UNIT:
Примечание к примеру.
Спецификатор представления записи определяет размещение полей записи. Спецификатор длины гарантирует, что при этом будет использовано точно восемь квантов памяти.
Ссылки:
атрибут 4.1.4, вариант 3.7.3, диапазон 3.5, дискриминант 3.7.1, должен 1.6, допустим 1.6, именованное число 3.2, именуемый тип 3.7, квант памяти 13.7, компонента записи 3.7, константа 3.2.1, ограничение 3.3, пакет SYSTEM 13.7, подкомпонента 3.3, простое выражение 4.4, простое имя 4.1, статическое выражение 4.9, статическое ограничение 4.9, целый тип 3.5.4.
Пред. | Уровень выше | След. |
13.3. СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ ПЕРЕЧИСЛЕНИЯ |
Содержание | 13.5. СПЕЦИФИКАТОРЫ АДРЕСА |
Справочное руководство по языку ада
Содержание
ПРЕДИСЛОВИЕ РЕДАКТОРА ПЕРЕВОДА
ПРЕДИСЛОВИЕ
ВВЕДЕНИЕ
1.1. ОБЛАСТЬ ДЕЙСТВИЯ СТАНДАРТА
1.2. СТРУКТУРА СПРАВОЧНОГО РУКОВОДСТВА
1.3. ЦЕЛИ И ИСТОЧНИКИ РАЗРАБОТКИ
1.4. ОБЗОР СВОЙСТВ ЯЗЫКА
1.5. МЕТОД ОПИСАНИЯ И СИНТАКСИЧЕСКИЕ ОБОЗНАЧЕНИЯ
1.6. КЛАССИФИКАЦИЯ ОШИБОК
ЛЕКСИКА
2.1. НАБОР СИМВОЛОВ
2.2. ЛЕКСЕМЫ, РАЗДЕЛИТЕЛИ И ОГРАНИЧИТЕЛИ
2.3. ИДЕНТИФИКАТОРЫ
2.4. ЧИСЛОВЫЕ ЛИТЕРАЛЫ
2.5. СИМВОЛЬНЫЕ ЛИТЕРАЛЫ
2.6. СТРОКОВЫЕ ЛИТЕРАЛЫ
2.7. КОММЕНТАРИИ
2.8. ПРАГМЫ
2.9. ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА
2.10. ДОПУСТИМЫЕ ЗАМЕНЫ СИМВОЛОВ
ОПИСАНИЯ И ТИПЫ
3.1. ОПИСАНИЯ
3.2. ОБЪЕКТЫ И ИМЕНОВАННЫЕ ЧИСЛА
3.3. ТИПЫ И ПОДТИПЫ
3.4. ПРОИЗВОДНЫЕ ТИПЫ
3.5. СКАЛЯРНЫЕ ТИПЫ
3.6. ИНДЕКСИРУЕМЫЕ ТИПЫ
3.7. ИМЕНУЕМЫЕ ТИПЫ
3.8. ССЫЛОЧНЫЕ ТИПЫ
3.9. РАЗДЕЛЫ ОПИСАНИЙ
ИМЕНА И ВЫРАЖЕНИЯ
4.1. ИМЕНА
4.2. ЛИТЕРАЛЫ
4.3. АГРЕГАТЫ
4.4. ВЫРАЖЕНИЯ
4.5. ОПЕРАЦИИ И ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЯ
4.6. ПРЕОБРАЗОВАНИЕ ТИПА
4.7. КВАЛИФИЦИРОВАННЫЕ ВЫРАЖЕНИЯ
4.8. ГЕНЕРАТОРЫ
4.9. СТАТИЧЕСКИЕ ВЫРАЖЕНИЯ И СТАТИЧЕСКИЕ ПОДТИПЫ
4.10. УНИВЕРСАЛЬНЫЕ ВЫРАЖЕНИЯ
ОПЕРАТОРЫ
5.1. ПРОСТЫЕ И СОСТАВНЫЕ ОПЕРАТОРЫ. ПОСЛЕДОВАТЕЛЬНОСТИ ОПЕРАТОРОВ
5.2. ОПЕРАТОРЫ ПРИСВАИВАНИЯ
5.3. УСЛОВНЫЕ ОПЕРАТОРЫ
5.4. ОПЕРАТОРЫ ВЫБОРА
5.5. ОПЕРАТОРЫ ЦИКЛА
5.6. ОПЕРАТОРЫ БЛОКА
5.7. ОПЕРАТОРЫ ВЫХОДА
5.8. ОПЕРАТОРЫ ВОЗВРАТА
5.9. ОПЕРАТОРЫ ПЕРЕХОДА
ПОДПРОГРАММЫ
6.1. ОПИСАНИЕ ПОДПРОГРАММЫ
6.2. ВИДЫ ФОРМАЛЬНЫХ ПАРАМЕТРОВ
6.3. ТЕЛА ПОДПРОГРАММ
6.4. ВЫЗОВЫ ПОДПРОГРАММ
6.5. ФУНКЦИИ
6.6. ПРОФИЛЬ ТИПА ПАРАМЕТРОВ И РЕЗУЛЬТАТА. СОВМЕЩЕНИЕ ПОДПРОГРАММ
6.7. СОВМЕЩЕНИЕ ОПЕРАЦИЙ
ПАКЕТЫ
7.1. СТРУКТУРА ПАКЕТА
7.2. СПЕЦИФИКАЦИИ И ОПИСАНИЯ ПАКЕТОВ
7.3. ТЕЛА ПАКЕТОВ
7.4. ОПИСАНИЯ ЛИЧНЫХ ТИПОВ И СУБКОНСТАНТ
7.5. ПРИМЕР ПАКЕТА РАБОТЫ С ТАБЛИЦАМИ
7.6. ПРИМЕР ПАКЕТА ОБРАБОТКИ ТЕКСТОВ
ПРАВИЛА ВИДИМОСТИ
8.1. ЗОНА ОПИСАНИЯ
8.2. ОБЛАСТИ ДЕЙСТВИЯ ОПИСАНИЙ
8.3. ВИДИМОСТЬ
8.5. ОПИСАНИЯ ПЕРЕИМЕНОВАНИЯ
Ссылочные типы
Объявленный описанием объект создается предвыполнением этого описания и обозначается простым именем или некоторой другой формой имени. В противоположность этому существуют объекты, создаваемые вычислением генераторов (см. 4.8) и не имеющие простого имени. Доступ к такому объекту осуществляется посредством возвращаемого генератором
ссылочного
значения; говорят, что ссылочное значение
указывает
объект.
определение-ссылочного-типа ::=
access
указание-подтипа
Для каждого ссылочного типа существует литерал
null,
имеющий пустое ссылочное значение, вообще не указывающее объект. Пустое значение ссылочного типа — начальное значение этого типа по умолчанию. Другие значения ссылочного типа получаются вычислением специальной операции над типом, называемой генератором. Каждое такое ссылочное значение указывает объект подтипа, обозначенного указанием подтипа определения ссылочного типа; этот подтип называется
указываемым подтипом;
базовый тип этого подтипа называется
указываемым типом.
Указанные значением ссылочного типа объекты образуют
набор,
неявно связанный с типом.
Предвыполнение определения ссылочного типа состоит из предвыполнения указания подтипа и создания ссылочного типа.
Если ссылочный объект — константа, то ссылочное значение не может быть изменено и всегда указывает один и тот же объект. С другой стороны, значение указываемого объекта
не обязательно остается одним и тем же (присваивание указываемому объекту допустимо, если указываемый тип нелимитируемый).
Единственные формы ограничения, которые допустимы после имени ссылочного типа в указании подтипа, — это ограничения индексов и ограничения дискриминантов (см. разд. 3.6.1 и 3.7.2 для правил, применимых к этим указаниям подтипа). Ссылочное значение
принадлежит
соответствующему подтипу ссылочного типа, если либо ссылочное значение — пустое значение, либо если значение указываемого объекта удовлетворяет ограничению.
Примеры:
type FRAME is access MATRIX; -- см. 3.6 type BUFFERNAME is access BUFFER; -- см. 3.7.1
Примечание.
Ссылочное значение, передаваемое генератором, может быть присвоено нескольким ссылочным объектам. Следовательно, объект, созданный генератором, может быть указан более чем одной переменной или константой ссылочного типа. Ссылочное значение может указывать только объект, созданный генератором, в частности, оно не может указывать объект, объявленный описанием объекта.
Если тип объектов, указанных ссылочными значениями, — индексируемый тип или тип с дискриминантами, то эти объекты ограничены либо границами массива, либо значениями дискриминантов, заданными неявно или явно соответствующими генераторами (см. 4.8).
Ссылочные значения в некоторых других языках называются
указателями
или
ссылками.
Ссылки:
генератор 4.8, зарезервированное слово 2.9, имя 4.1, индексируемый тип 3.6, константа 3.2.1, лимитируемый тип 7.4.4, литерал 4.2, объект 3.2.1, ограничение 3.3, ограничение дискриминанта 3.7.2, ограничение индекса 3.6.1, описание объекта 3.2.1, переменная 3.2.1, подкомпонента 3.3, подтип 3.3, Предвыполнение 3.9, принадлежит подтипу 3.3, присваивание 5.2, простое имя 4.1, спецификация индекса 3.6, тип 3.3, удовлетворять 3.3, указание подтипа 3.3.2.
3.8.1. НЕПОЛНЫЕ ОПИСАНИЯ ТИПОВ
Никаких конкретных ограничений на тип, указываемый ссылочным типом, не существует. В частности, тип компоненты указываемого типа может быть другим ссылочным типом или даже тем же самым ссылочным типом. Это позволяет вводить взаимозависимые и рекурсивные ссылочные типы. Их описания требуют предварительного неполного описания типа (или описания личного типа) для одного или нескольких типов.
неполное-описание-типа ::=
type
идентификатор [раздел-дискриминантов];
Для каждого неполного описания типа должно быть соответствующее описание типа с тем же идентификатором. Соответствующее описание должно быть либо полным описанием, либо описанием задачного типа. В оставшейся части главы пояснения даны в терминах полных описаний типа; те же правила применяются к описаниям задачного типа.
Если неполное описание типа встречается непосредственно в разделе описаний или видимом разделе спецификации пакета, то полное описание типа должно встретиться позже непосредственно в этом разделе описаний или видимом разделе. Если неполное описание типа встречается непосредственно в личном разделе пакета, то полное описание типа должно быть позже непосредственно в самом личном разделе или же в разделе описаний соответствующего тела пакета.
Раздел дискриминантов должен быть дан в полном описании типа тогда и только тогда, когда он дан в неполном описании типа; если разделы дискриминантов даны, то они должны быть согласованы (см. 6.3.1 для правил согласования). До конца полного описания типа использование имени, обозначающего" тип, объявленный неполным описанием типа, допустимо только как обозначение типа в указании подтипа определения ссылочного типа; единственной формой ограничения, допустимой в указании подтипа, являются ограничения дискриминанта.
Предвыполнение неполного описания типа создает тип. Если неполное описание типа имеет раздел дискриминантов, то это Предвыполнение включает Предвыполнение раздела дискриминантов: в этом случае раздел дискриминантов полного описания типа не предвыпол-няется.
11 явно или неявно, прямо или косвенно. —
Прим. ред.
Пример рекурсивного типа:
type CELL; — неполное описание типа type LINK is access CELL;
type CELL is record
VALUE : INTEGER; SUCC : LINK; PRED : LINK; end record;
HEAD : LINK := new CELL'(O, null, null); NEXT : LINK := HEAD.SUCC;
Примеры взаимозависимых ссылочных типов:
type PERSON(SEX : GENOER); — неполное описание типа type CAR; — неполное описание типа
type PERSONNAME is access PERSON; type CARNAME is access CAR;
type CAR is record
NUMBER : INTEGER; OWNER : PERSONNAME; end record;
type PERSON(SEX : GENDER) is
record
NAME : STRING(1 .. 20); BIRTH : DATE; AGE : INTEGER range 0 .. 130; VEHICLE : CAR_NAME; casa SEX is
when M => WIFE : PERSON_NAME(SEX => F); when F => HUSBAND ; PERSON_NAME(SEX => M); end case:
end record;
MYCAR, YOURCAR, NEXTCAR : CARNAME; — неявно инициированы — пустым значением
Ссылки:
идентификатор 2.3, имя 4.1, компонента 3.3, обозначение типа 3.3.2, ограничение 3.3, ограничение дискриминанта 3.7.2, описание 3.1, определение ссылочного типа 3.8, предвы-полнение 3.9, раздел дискриминантов 3.7.1, согласован 6.3.1, ссылочный тип 3.8, тип 3.3, указание подтипа 3.3.2, указывать 3.8, элемент описания 3.9.
3.8.2. ОПЕРАЦИИ НАД ССЫЛОЧНЫМИ ТИПАМИ
Базовые операции над ссылочным типом включают присваивание, генераторы для этого ссылочного типа, проверку принадлежности, явное преобразование, квалификацию и литерал
null.
Если указываемый тип — тип с дискриминантами, то базовые операции включают именование соответствующих дискриминантов; если указываемый тип — именуемый тип, то они включают именование соответствующих компонент; если указываемый тип — индексируемый тип, то они включают образование индексируемых компонент и отрезков; если указываемый тип — задачный тип, то они включают именование входов и семейств входов. Кроме того, базовые операции включают образование именуемой компоненты с зарезервированным словом
аll
(см. 4.1.3).
Если указываемый тип — индексируемый тип, то базовые операции включают атрибуты с обозначениями FIRST, LAST, RANGE и LENGTH (и эти же атрибуты с параметром N для номера измерения). Префикс каждого из этих атрибутов должен быть значением ссылочного типа. Эти атрибуты вырабатывают соответствующие характеристики указываемого объекта (см. 3.6.2).
Если указываемый тип — задачный тип, то базовые операции включают атрибуты с обозначениями TERMINATED и CALLABLE (см. 9.9). Префикс каждого из этих атрибутов должен быть значением ссылочного типа. Эти атрибуты вырабатывают соответствующие характеристики задачных объектов.
Кроме того, атрибут T'BASE (см. 3.3.3) и атрибуты представления T'SIZE и T'STORAGE-SIZE (см. 13.7.2) определены для ссылочного типа или подтипа Т; атрибуты A'SIZE и A'ADDRESS определены для ссылочного объекта А (см. 13.7.2).
Кроме базовых операции над ссылочным типом включают предопределенное сравнение на равенство и неравенство.
Ссылки:
атрибут 4.1.4, базовая операция 3.3.3, базовый тип 3.3, генератор 4.8, дискриминант 3.3, задачный тип 9.1, именуемая компонента 4.1.3, именуемый тип 3.7, индексируемая компонента 4.1.1, индексируемый тип 3.6, квалифицированное выражение 4.7, литерал 4.2, личный тип 7.4, набор 3.8, обозначение атрибута 4.1.4, объект 3.2.1, ограниченный индексируемый подтип 3.6, операция 3.3, отрезок 4.1.2, подтип 3.3, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, ссылочный тип 3.8, тип 3.3, указываемый подтип 3.8, указываемый тип 3.8, указывать 3.8.
Пред. | Уровень выше | След. |
3.7. ИМЕНУЕМЫЕ ТИПЫ |
Содержание | 3.9. РАЗДЕЛЫ ОПИСАНИЙ |
Стандартный пакет
Предопределенные типы (например, BOOLEAN, CHARACTER и INTEGER) описаны в предопределенном пакете, называемом STANDARD; этот пакет включает также описания предопределенных для них операций, ракет STANDARD описан в приложении С. Спецификация пакета STANDARD, за исключением предопределенных числовых типов, должна быть одинаковой для всех реализации языка.
Пакет STANDARD образует зону описания, которая охватывает каждый библиотечный модуль и, следовательно, главную программу; предполагается, что описание каждого библиотечного модуля находится непосредственно в этом пакете. Предполагается также, что неявные описания библиотечных модулей упорядочены таким образом, что область действия данного библиотечного модуля включает в себя любой компилируемый модуль, который упоминает в спецификаторе совместности этот библиотечный модуль. Однако видимыми в данном компилируемом модуле являются библиотечные модули, упомянутые в каких-либо спецификаторах совместности при данном модуле, а если он является вторичным модулем некоторого библиотечного модуля, то и этот модуль является видимым для него.
Примечание.
Если все вложенные операторы блока программы поименованы, то имя каждого программного модуля, вложенного в блок, всегда может быть записано как расширенное имя, начинающееся с идентификатора STANDARD (в случае когда этот пакет не является скрытым).
Если тип описан в видимом разделе библиотечного пакета, то из правил видимости следует, что базовая операция (например, присваивание) над этим типом непосредственно видима в точке, где сам тип невидим (либо по имени, либо непосредственно). Однако эта операция может быть применена только к тем операндам, которые являются видимыми, и описание этих операндов требует видимости либо типа, либо одного из его подтипов.
Ссылки:
библиотечный модуль 10.1, видимость 8.3, вторичный модуль 10.1, главная программа 10.1, должно 1.6, зона описания 8.1, идентификатор 2.3, имя 4.1, имя блока 5.6, находится непосредственно в 8.1, неявное описание 3.1, оператор блока 5.6, оператор цикла 8.5, операция 6.7, описание 3.1, пакет 7, подтип 3.3, применяемый спецификатор совместности 10.1.1, программный модуль 6, расширенное имя 4.1.3, скрытие 8.3, спецификатор совместности 10.1.1, тип 3.3.
Пред. | Уровень выше | След. | |
8.5. ОПИСАНИЯ ПЕРЕИМЕНОВАНИЯ
|
Содержание |
8.7. КОНТЕКСТ РАЗРЕШЕНИЯ СОВМЕЩЕНИЯ |
Статические выражения и статические подтипы
Некоторые выражения скалярного типа называются
статическими.
Аналогично статическими называют некоторые дискретные диапазоны, а обозначения типов для некоторых скалярных подтипов называют обозначающими статические подтипы.
Выражение скалярного типа называется статическим тогда и только тогда, когда каждое первичное является одним из перечисленных в пунктах от а до з, а каждая операция — это предопределенная операция и вычисление выражения дает значение (т. е. не возбуждает исключения).
а. Литерал перечисления (включая символьный литерал).
б. Числовой литерал.
в. Именованное число.
г. Заданная явным описанием константа статического подтипа и инициализированная статическим выражением.
д. Вызов функции, имя которой — знак операции, обозначающий предопределенную операцию, включая расширенное имя; каждый фактический параметр должен быть статическим выражением.
е. Определяемый в языке атрибут статического подтипа; если атрибут — функция, фактические параметры должны быть также статическими выражениями.
ж. Квалифицированное выражение, обозначение типа которого задает статический подтип, а операнд — статическое выражение.
з. Заключенное в скобки статическое выражение.
Статическим является диапазон, границы которого — статические выражения. Статическим является ограничение диапазона, если составляющие его атрибут или простое выражение являются статическими. Статический подтип — это либо скалярный базовый тип, отличный от формального типа настройки, либо скалярный подтип, образованный наложением на статический подтип либо ограничения статическим диапазоном, либо ограничения плавающего или фиксированного типа, ограничение диапазона которого, если оно есть, является статическим. Статический дискретный диапазон — это либо статический подтип, либо статический диапазон. Статическое ограничение индекса — это ограничение индекса, для которого статическим является каждый подтип индекса соответствующего индексируемого типа и для которого статическим является каждый дискретный диапазон.
Статическое ограничение дискриминанта — это ограничение дискриминанта, для которого статическим является подтип каждого дискриминанта и в котором статическим является каждое выражение.
Примечание.
Точность вычисления статического выражения вещественного типа определена правилами, данными в разд. 4.5.7. Если результат не является модельным (или хранимым) числом этого типа, то значение выражения, полученное при вычислении во время компиляции, не обязано совпадать со значением, которое получится при вычислении во время счета.
Атрибуты массивов не являются статическими, в частности статическим не является атрибут RANGE.
Ссылки:
атрибут 4.1.4, базовый тип 3.3, возбуждение исключений 11, выражение 4.4, граница диапазона 3.5, дискретный диапазон 3.6, дискретный тип 3.5, именованное число 3.2, инициализация 3.2.1, исключение 11, квалифицированное выражение 4.7, константа 3.2.1, литерал перечисления 3.5.1, модельное число 3.5.6, неявное описание 3.1, обозначение типа 3.3.2, ограничение диапазона 3.5, описание константы 3.2.1, подтип 3.3, предопределенная операция 4.5, символьный литерал 2.5, скалярный тип 3.5, фактический параметр 6.4.1, фактический параметр настройки 12.3, формальный параметр настройки 12.1.2, функция 6.5, хранимое число 3.5.6, числовой литерал 2.4.
Пред. | Уровень выше | След. |
4.8. ГЕНЕРАТОРЫ |
Содержание | 4.10. УНИВЕРСАЛЬНЫЕ ВЫРАЖЕНИЯ |
Строковые литералы
Строковый литерал образуется из последовательности (возможно, пустой) графических символов, заключенной между двумя символами кавычки —
строковыми скобками.
строковый-литерал ::= "{графический-символ}"
Строковый литерал имеет значение последовательности значений символов, соответствующих графическим символам строкового литерала, кроме внешних символов кавычки. Для представления кавычки в последовательности значений символов необходимо в соответствующем месте внутри строкового литерала поместить пару соседних символов кавычки (это означает, что строковый литерал, включающий два соседних символа кавычки, никогда не рассматривается как два строковых литерала).
Длина
строкового литерала — это количество значений символьного типа в представленной последовательности (каждые два соседних символа кавычки в строке считаются одним символом).
Примеры :
"Дневное сообщение:"
"" -- пустой строковый литерал " " "А" """" -- три строковых литерала длиной 1 "Символы, такие как $, % и ), допустимы в строковых литералах"
Примечание.
Строковый литерал должен помещаться на одной строчке, поскольку он является лексемой (см. 2.2). Более длинные последовательности значений графических символов могут быть получены катенацией строковых литералов. Равным образом катенация констант, описанных в пакете ASCII, может быть использована для получения последовательности значений символьного типа, которая включает значения неграфических символов (так называемых управляющих символов). Ниже даны примеры использования катенации:
"ПЕРВАЯ ЧАСТЬ ПОСЛЕДОВАТЕЛЬНОСТИ СИМВОЛОВ," & "КОТОРАЯ ПРОДОЛЖАЕТСЯ НА СЛЕДУЮЩЕЙ СТРОЧКЕ"
"последовательность, которая включает" & ASCII.ACK & "управляющий символ"
Ссылки:
графический символ 2.1, значение символа 3.5.2, конец строчки 2.2, константа 3.2.1, лексема 2.2, операция катенации 4.5.3, описание 3.1, предопределенный пакет ASCII С.
Пред. | Уровень выше | След. | |
2.5. СИМВОЛЬНЫЕ ЛИТЕРАЛЫ | Содержание | 2.7. КОММЕНТАРИИ |
Структура пакета
Пакет обычно представлен двумя частями: спецификацией пакета и телом пакета. Спецификация имеется у каждого пакета, а тело имеют не все пакеты.
описание-пакета ::= спецификация-пакета;
спецификация -пакета ::= package идентификатор is
{основной-элемент-описания} [private
{основной-элемент-описания)] end [простое-имя-пакета]
тело-пакета ::= package body простое-имя-пакета is
[раздел - описаний] [begin
последовательность-операторов [exception
обработчик-исключения {обработчик-исключения}]] end [простое-имя-пакета];
Простое имя в начале тела пакета должно совпадать с идентификатором этого пакета. Аналогично если простое имя помещено в конце спецификации или тела пакета, то оно должно совпадать с идентификатором этого пакета.
Если описание подпрограммы, описание пакета, описание задачи или описание настройки являются элементами описания в спецификации пакета, то тело (если оно существует) программного модуля, описанного этим элементом описания, само должно быть элементом описания в разделе описаний тела того же самого пакета.
Примечание.
Для простой формы пакета, специфицирующей совокупность объектов и типов, тело не обязательно. Одной из возможностей использования последовательности операторов тела пакета является инициализация таких объектов. Для каждого описания подпрограммы должно существовать соответствующее тело (за исключением подпрограмм, написанных на другом языке, см. 13.9). Если тело программного модуля является следом тела, то для этого программного модуля требуется раздельно компилируемый субмодуль, содержащий соответствующее тело (см. 10.2). Тело не является основным элементом описания и, таким образом, не может присутствовать в спецификации пакета.
Описание пакета — это либо библиотечный пакет (см. 10.2), либо элемент описания внутри другого программного модуля.
Ссылки:
библиотечный модуль 10.1, идентификатор 2.3, настраиваемое тело 12.2, обработчик исключения 11.2, объект 3.2, описание задачи 9.1, описание настройки 12.1, описание подпрограммы 6.1, основной элемент описания 3.9, последовательность операторов 5.1, программный модуль 6, простое имя 4.1, раздел описаний 3.8, след тела 10.2, соответствующее тело 3.9, субмодуль 10.2, тело задачи 9.1, тело пакета 7.3, тело подпрограммы 6.3, тип 3.3, элемент описания 3.9.
Пред. | Уровень выше | След. | |
6.7. СОВМЕЩЕНИЕ ОПЕРАЦИЙ
|
Содержание |
7.2. СПЕЦИФИКАЦИИ И ОПИСАНИЯ ПАКЕТОВ |
Структура справочного руководства
Это справочное руководство содержит четырнадцать глав, три дополнения, три приложения, указатель терминов и синтаксис.
Каждая глава делится на разделы, которые имеют общую структуру. В каждом разделе вводятся соответствующие понятия, даются все необходимые синтаксические правила и описывается семантика соответствующих конструкций. В конце раздела могут быть даны примеры, примечания и ссылки.
Примеры предназначены для иллюстрации возможных форм описанных конструкций. Примечание предназначено для пояснения следствий из правил, описанных в данном или других разделах. Ссылки нужны, чтобы обратить внимание читателей на термины и терминологические обороты, имеющие специальный смысл и определенные в других разделах.
Определение стандарта языка программирования Ада, состоящее из четырнадцати глав и трех дополнений, предполагае, следующее ограничение: материал каждого из перечисленных ниже пунктов носит информативный характер и не является частью определения стандарта языка.
• 1.3. Цели и источники разработки
• 1.4. Обзор свойств языка
• Примеры, примечания и ссылки, приведенные в конце любого раздела
• Каждый подраздел, заголовок которого начинается со слов «Пример» или «Примеры»
Пред. | Уровень выше | След. | |
Глава 1.
ВВЕДЕНИЕ |
Содержание |
1.3. ЦЕЛИ И ИСТОЧНИКИ РАЗРАБОТКИ |
Субмодули компилируемых модулей
Субмодули используются для раздельной компиляции соответствующего тела программного модуля, описанного в другом компилируемом модуле. Этот метод разделения программы позволяет разрабатывать программу иерархически.
след-тела ::= спецификация-подпрограммы is separate;
| package body простое-имя-пакета is separate;
| task body простое-имя-задачи is separate;
субмодуль :: = separate (имя-родительского-модуля) соответствующее-тело
Использование следа тела в качестве тела программного модуля (подпрограммы, пакета, задачного модуля или настраиваемого модуля) допускается, только если след тела помещен непосредственно в теле библиотечного пакета или в разделе описаний некоторого компилируемого модуля.
В случае задания тела программного модуля следом тела требуется, чтобы субмодуль, содержащий соответствующее тело, был откомпилирован раздельно. В случае подпрограммы спецификации подпрограммы, данные в соответствующем теле и в следе тела, должны быть согласованы (см. 6.3.1).
Для каждого субмодуля задается имя
родительского модуля,
т.е. компилируемого модуля, содержащего соответствующий след тела. Если родительский модуль — библиотечный модуль, то он называется
предком.
Если родительский модуль сам является субмодулем, то его имя должно быть представлено расширенным именем, начинающимся простым именем библиотечного модуля-предка. Простые имена всех субмодулей, которые имеют одинакового предка, должны задаваться различными идентификаторами.
Видимость в соответствующем теле субмодуля — это видимость, которая была бы получена в месте задания следа тела (в родительском модуле), если бы спецификаторы совместности и использования субмодуля были добавлены к спецификатору контекста родительского модуля. Если родительский модуль сам является субмодулем, то это же правило используется для определения видимости в соответствующем теле родительского модуля.
Результатом предвыполнения следа тела является предвыполнение соответствующего тела субмодуля.
Примечание.
Два субмодуля различных библиотечных модулей в одной и той же программной библиотеке могут иметь совпадающие идентификаторы. В этом случае их расширенные имена различны, так как различны простые имена библиотечных модулей и простые имена всех субмодулей одного предка данного библиотечного модуля. Средствами описаний пеименования могут быть введены для (различных) субмодулей совмещенные имена подпрограмм.
Библиотечный модуль, упомянутый в спецификаторе совместности субмодуля, может быть скрыт описанем (с тем же идентификатором), данным в соответствующем теле субмодуля. Более того, такой библиотечный модуль может быть скрыт описанием, данным в родительском модуле, так как библиотечный модуль рассматривается как описанный в пакете STANDARD; это, однако, не влияет на интерпретацию спецификаторов совместности, ибо в них могут быть упомянуты имена только библиотечных модулей.
Ссылки:
библиотечный модуль 10.1, видимость 8.3, задача 9, задачный модуль 9.1, идентификатор 2.3, имя 4.1, компилируемый модуль 10.1, локальное описание 8.1, настраиваемое тело 12.2, настраиваемый модуль 12, непосредственная видимость 8.3, непосредственное вхождение 8.1, описание 3.1, описание переименования 8.5, пакет 7, подпрограмма 6, предвыполнение 3.9, программа 10, программный модуль 6, простое имя 4.1, раздел описаний 3.9, раздельная компиляция 10.1, расширенное имя 4.1.3, скрыт описанием 8.3, совмещение 8.3, согласованный 6.3.1, соответствующее тело 3.9, спецификатор использования 8.4, спецификатор контекста 10.1.1, спецификатор совместности 10.1.1, спецификация подпрограммы 6.1, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.1.
10.2.1. ПРИМЕРЫ СУБМОДУЛЕЙ
Сначала процедура ТОР оформлена в виде компилируемого модуля без субмодулей.
with TEXT_IO; procedure TOP is
type REAL is digits 10; R, S ; REAL := 1.0;
package FACILITY is
PI : constant := 3.14159_26536; function F (X : REAL) return REAL; procedure G (Y, Z : REAL); end FACILITY;
package body FACILITY is
-— предшествуют некоторые локальные описания
function F(X : REAL) return REAL is
begin
-— последовательность операторов функции F ... end F;
procedure G(Y, Z : REAL) is
-— использующие пакет TEXT_IO локальные процедуры ... begin
-— последовательность операторов процедуры G ... end G;
end FACILITY;
procedure TRANSFORM(U : in out REAL) is
use FACILITY; begin
U := F(U); ... end TRANSFORM;
begin -- TOP TRANSFORM(R); FACILITY.G(R, S); end TOP;
Тело пакета FACILITY и процедуру TRANSFORM можно представить в виде раздельно компилируемых субмодулей модуля ТОР. Тело процедуры G также может быть представлено как субмодуль модуля FACILITY.
Пример 3:
procedure TOP is
type REAL is digits 10; R, S : REAL :== 1.0; package FACILITY is
PI : constant := 3.14159_26536; function F (X : REAL) return REAL; procedure G (Y, Z : REAL); end FACILITY;
package body FACILITY is separate; procedure TRANSFORM (U : in out REAL) is separate;
begin -- TOP TRANSFORM(R); ... FACILITY.G(R, S): end TOP;
separate (TOP) procedure TRANSFORM(L) : in out REAL) is
use FACILITY; begin
U := F(U); ... end TRANSFORM;
separate (TOP) package body FACILITY is
-— предшествуют некоторые локальные описания function F(X : REAL) return REAL is
begin
-- последовательность операторов функции F ... end F;
procedure G (Y, Z : REAL) is separate; -- след тела G
end FACILITY;
with TEXT_IO; separate (TOP.FACILITY) -- полное имя пакета FACILITY procedure G(Y, Z : REAL) is
--использующие ТЕХТ_Ю локальные процедуры begin
-- последовательность операторов процедуры G ... end G;
В этом примере TRANSFORM и FACILITYявляются субмодулями процедуры TOP, а G -субмодулем пакета FACILITY. Видимость в этом пакете такая же, как и в предыдущем, с одним отличием : TEXT_IO используется только в G, по этому соответствующий спецификатор совместности написан для G, а не для процедуры TOP. В остальном видимость идентификаторов в соответствующих телах программ обеих версий одинакова.
Например, в соответствующем теле субмодуля G (непосредственно) видимы процедура TOP, тип REAL, переменные R и S, пакет FACILITY и содержащиеся в нем именнованое число PI и подпрограммы F и G.
Ссылки:
видимость 8.3, идентификатор 2.3, именованное число 3.2, компилируемый мо-Идуль 10.1, локальное описание 8.1, пакет 7.1, переменная 3.2.1, подпрограмма 6, процедура 6, |след тела 10.2, соответствующее тело 3.9, спецификатор совместности 10.1.1, тело пакета 7.1, |тело процедуры 6.3, тип 3.3.
Пред. | Уровень выше | След. |
Глава 10. СТРУКТУРА ПРОГРАММЫ И РЕЗУЛЬТАТ КОМПИЛЯЦИИ |
Содержание | 10.3. ПОРЯДОК КОМПИЛЯЦИИ |
Связь с другими языками
Из программы, написанной на языке Ада, может быть вызвана подпрограмма, написанная на другом языке; все связи с этими подпрограммами обеспечиваются через параметры и результаты функций. Для каждой такой подпрограммы должна быть задана следующая прагма:
pragma
INTERFACE (имя
-языка,
имя-
подпрограммы};
Допустимо использование совмещенных имен подпрограмм. Эта прагма допустима на месте элемента описания и должна применяться к подпрограмме, описанной ранее в этом же разделе описаний или спецификации пакета. Прагма также допустима и для библиотечного модуля; в этом случае прагма должна помещаться после описания подпрограммы, но до любого следующего компилируемого модуля. Прагма задает другой язык (и тем самым соглашения о вызовах) и сообщает компилятору, что для такой подпрограммы будет задан объектный модуль. Для таких подпрограмм недопустимо задание тела (даже в форме следа тела), так как его команды написаны на другом языке.
Эту возможность не обязательно обеспечивают все реализации. Реализация может наложить ограничения на допускаемые формы и места параметров и вызовов.
Пример:
package FORT_LIB is
function SORT (X : FLOAT) return FLOAT; function EXP (X : FLOAT) return FLOAT; private
pragma INTERFACE(FORTRAN, SORT); pragma INTERFACE(FORTRAN, EXP); end FORT_LIB;
Примечание.
Соглашения, использованные в других языковых процессорах, которые вызывают Ада-программы, не являются частью определения языка Ада. Эти соглашения должны быть определены в описании других языковых процессоров.
Прагма INTERFACE не определена для настраиваемых подпрограмм.
Ссылки:
библиотечный модуль 10.1, вызов подпрограммы 6.4, должен 1.6, допустимый 1.6, имя 4.1, компилируемый модуль 10.1, описание 3.1, описание подпрограммы 6.1, параметр подпрограммы 6.2, подпрограмма 6, прагма 2.8, раздел описаний 3.9, результат функции 6.5, след тела 10.2, совмещенная подпрограмма 6.6, спецификация пакета 7.1, тело подпрограммы 6.3, элемент описания 3.9.
Пред. | Уровень выше | След. | |
13.8. ВСТАВКИ МАШИННЫХ КОДОВ
|
Содержание |
13.10. НЕКОНТРОЛИРУЕМОЕ ПРОГРАММИРОВАНИЕ |
Тела пакетов
В отличие от понятий, описанных в видимом разделе спецификации пакета, понятия, описанные в теле пакета, видимы только внутри самого тела пакета. Поэтому пакет с телом пакета может быть использован для создания группы взаимосвязанных подпрограмм (
пакет
прикладных программ в обычном смысле), в которой доступные пользователям операции явно изолированы от внутренних понятий.
При предвыполнении тела пакета сначала предвыполняется его раздел описаний, а затем выполняется его последовательность операторов (если она имеется). Необязательно присутствующие в конце тела пакета обработчики исключений обслуживают исключения, возбуждаемые при выполнении последовательности операторов тела пакета.
Примечание.
Переменная, описанная в теле пакета, видима только внутри этого тела, и, следовательно, ее значение может быть изменено только внутри этого тела пакета. В отсутствие локальных задач значение такой переменной сохраняется неизменным между вызовами извне пакета подпрограмм, описанных в его видимом разделе. Свойства такой переменной аналогичны свойствам «собственной» переменной в языке Алгол-60.
Предвыполнение тела подпрограммы, описанной в видимом разделе пакета, осуществляется при предвыполнении тела пакета. Следовательно, при вызове такой подпрограммы извне программного модуля возбуждается исключение PROGRAM-ERROR, если вызов производится до предвыполнения тела пакета (см. 3.9).
Пример пакета:
package RATIONAL-NUMBERS is
type RATIONAL is record
NUMERATOR : INTEGER; DENOMINATOR : POSITIVE; end record;
function EQUAL (X,Y RATIONAL) return BOOLEAN;
function "/" (X,Y INTEGER) return RATIONAL; —- для образования рационального числа
function "+" (X,Y RATIONAL) return RATIONAL; function "-" (X,Y RATIONAL) return RATIONAL; function "*" (X,Y RATIONAL) return RATIONAL; function "/" (X,Y RATIONAL) return RATIONAL;
end;
package body RATIONAL-NUMBERS is
procedure SAME-DENOMINATOR (X,Y : in out RATIONAL) is begin
-- приведение Х и Y к общему знаменателю; end;
function EQUAL(X,Y : RATIONAL) return BOOLEAN is
U,V : RATIONAL; begin
U := X; V := Y; SAME-DENOMINATOR (U,V); return ENUMERATOR = V.NUMERATOR; end EQUAL;
function "/" (X,Y : INTEGER) return RATIONAL is begin
if Y > 0 then
return (NUMERATOR => X, DENOMINATOR => Y); else
return (NUMERATOR => -X, DENOMINATOR => -Y); end if;
end"/";
function "+" (X,Y RATIONAL) return RATIONAL is ... end "+"; function "-" (X,Y RATIONAL) return RATIONAL is ... end "-"; function "*" (X,Y RATIONAL) return RATIONAL is ... end "*"; function "/" (X,Y RATIONAL) return RATIONAL is ... end "/";
end RATIONAL_NUMBERS;
Ссылки:
видимый раздел 7.2, имя 4.1, исключение 11, исключение PROGRAM-ERROR 11.1, ДЮЗ обработчик исключения 11.1, описание 3.1, переменная 3.2.1, подпрограмма б, последовательность операторов 5.1, Предвыполнение 3.1, 3.9, . программный модуль 6, раздел описаний 3.9, спецификация пакета 7.1.
Пред. | Уровень выше | След. |
7.2. СПЕЦИФИКАЦИИ И ОПИСАНИЯ ПАКЕТОВ |
Содержание | 7.4. ОПИСАНИЯ ЛИЧНЫХ ТИПОВ И СУБКОНСТАНТ |
Тела подпрограмм
Тело подпрограммы определяет ее выполнение.
тело-подпрограммы ::= спецификация-подпрограммы is
[раздел - описаний] begin
последовательность-операторов [exception
обработчик - исключения {обработчик-исключения}] end [обозначение];
Описание подпрограммы необязательно. При отсутствии описания спецификация подпрограммы в ее теле (или в следе тела) играет роль описания. Для каждого описания подпрограммы должно быть соответствующее тело (кроме подпрограмм, написанных на другом языке, как поясняется в разд. 13.9). Если даны и описание, и тело, то спецификация подпрограммы в теле должна быть согласована со спецификацией подпрограммы в описании (см. разд. 6.3.1 о правилах согласования).
Если в конце тела подпрограммы присутствует обозначение, то оно должно совпадать с обозначением в спецификации подпрограммы.
Предвыполнение тела подпрограммы не имеет никакого другого эффекта, кроме установления факта, что тело может быть использовано для выполнения вызовов подпрограммы.
Выполнение тела подпрограммы инициируется вызовом подпрограммы (см. 6.4). Для этого после установления соответствия между формальными и фактическими параметрами предвы-полняется раздел описаний тела и выполняется последовательность операторов тела подпрограммы. По окончании выполнения тела осуществляется возврат в место вызова (и необходимое обратное копирование значений формальных параметров в фактические (см. 6.2)). Необязательные обработчики исключений, заданные в конце тела подпрограммы, выполняются при возбуждении исключений во время выполнения последовательности операторов тела подпрограммы (см. 11.4).
Примечание.
Из правил видимости следует, что если описанная в пакете подпрограмма обязана быть видимой вне пакета, то спецификация подпрограммы должна быть дана в видимой части пакета. Эти же правила предписывают, что описание подпрограммы должно быть дано, если вызов подпрограммы возникает текстуально до тела подпрограммы (описание должно помещаться в тексте программы раньше вызова).
Данные в разд. 3.9 и 7. 1 правила подразумевают, что описание подпрограммы и соответствующее тело должны находиться непосредственно в одной и той же зоне описаний.
Пример тела подпрограммы:
procedure PUSH(E : in ELEMENT.TYPE; S : in out STACK) ) is begin if S.INDEX = S.SIZE then raise STACK-OVERFLOW; else
S.INDEX := S.INDEX + 1; S.SPACE(S.INDEX) := E; end if; end PUSH;
Ссылки:
видимость 8.3, видимый раздел 7.2, вызов подпрограммы 6.4, зона описаний 8.1, исключение 11, находится непосредственно в 8.1, обозначение 6.1, обработчик исключения 11.2, описание 3.1, описание подпрограммы 6.1, пакет 7, подпрограмма 6, последовательность операторов 5.1, Предвыполнение 3.9, Предвыполнение не имеет другого эффекта 3.1, раздел описаний 3.9, след тела 10.2, согласованный 6.3.1, спецификация подпрограммы 6.1, фактический параметр 6.4.1, формальный параметр 6.1.
6.3.1. ПРАВИЛА СОГЛАСОВАНИЯ
Всякий раз, когда правила языка требуют или допускают появления спецификации данной подпрограммы более одного раза, в каждом месте допустимы следующие вариации:
•Числовой литерал может быть заменен другим числовым литералом тогда и только тогда, когда они имеют одно и то же значение.
• Простое имя может быть заменено расширенным именем, в котором это простое имя является постфиксом тогда и только тогда, когда смысл простого имени в обоих случаях определяется одним и тем же описанием.
• Строковый литерал в качестве знака операции может быть заменен на другой строковый литерал тогда и только тогда, когда они представляют одну и ту же операцию (см. 8.5).
Две спецификации подпрограммы называются
согласованными,
если за исключением комментариев и приведенных выше вариаций, обе спецификации образованы одной и той же последовательностью лексем и соответствующие лексемы имеют одинаковый смысл с точки зрения правил видимости и совмещения.
Аналогичное согласование определяется для разделов формальных параметров, разделов дискриминантов и обозначений типов (для субконстант и фактических параметров, которые имеют форму преобразования типа (см. 6.4.1)).
Примечание.
Простое имя может быть заменено на расширенное имя, даже если простое имя само является префиксом именуемой компоненты. Например, Q.R может быть заменено на P.Q.R, если. Q описано непосредственно в Р.
Следующие спецификации не согласуются, так как они сформированы различными последовательностями лексем:
procedure P(X.Y : INTEGER) procedure P(X : INTEGER; Y : INTEGER) procedure P(X.Y : in INTEGER)
Ссылки:
видимость 8.3, допустимый 1.6, знак операции 6.1, именуемая компонента 4.1.3, имя 4.1, комментарий 2.7, лексема 2, непосредственная видимость 8.3, описание 3.1, постфикс 4.1.3, преобразование типа 4.6, префикс 4.1, простое имя 4.1, раздел дискриминантов 3.7.1, раздел формальных параметров 6.1, расширенное имя 4.1.3, совмещение 6.6, 8.7, спецификация подпрограммы 6.1, субконстанта 7.4.3, фактический параметр 6.4, 6.4.1, числовой литерал 2.4.
6.3.2. ПОДСТАНОВКА ПОДПРОГРАММ
Прагма INLINE используется для указания того факта, что для каждого вызова каждого указанного в прагме имени подпрограммы желательна подстановка тела соответствующей подпрограммы. Форма этой прагмы следующая:
pragma
INLINE (имя (, имя));
Каждое имя — это либо имя подпрограммы, либо имя настраиваемой подпрограммы. Прагма INLINE допустима только на месте элемента описания в разделе описаний или спецификации пакета либо после библиотечного модуля в компиляции, но до любого следующего компилируемого модуля.
Если прагма стоит на месте элемента описания, то каждое имя должно обозначать подпрограмму или настраиваемую подпрограмму, описанную раньше в виде элемента описания этого же раздела описаний или этой же спецификации пакета. Если несколько совмещенных подпрограмм удовлетворяют этому требованию, то прагма применяется ко всем. Если эта прагма стоит после данного библиотечного модуля, то в качестве ее аргумента допустимо только имя этого модуля. Если в прагме упомянуто имя настраиваемой подпрограммы, это указывает, что подстановка желательна для вызовов всех подпрограмм, являющихся конкретизацией именованного настраиваемого модуля.
Смысл подпрограммы не изменяется прагмой INLINE. Для каждого вызова заданных в прагме подпрограмм реализация может выполнять или игнорировать рекомендации прагмы. (Заметим, в частности, что подстановка не может быть выполнена для рекурсивных подпрограмм.)
Ссылки:
библиотечный модуль 10.1, вызоё подпрограммы 6.4, допустимый 1.6, имя 4.1, компилируемый модуль 10.1, компиляция 10.1, конкретизация 12.3, настраиваемая подпрограмма 12.1, настраиваемый модуль 12, 12.1, подпрограмма 6, прагма 2.8, раздел описаний 3.9, совмещение 6.6, 8.7, спецификация пакета 7.1, тело подпрограммы 6.3, элемент описания 3.9.
Пред. | Уровень выше | След. |
6.2. ВИДЫ ФОРМАЛЬНЫХ ПАРАМЕТРОВ |
Содержание | 6.4. ВЫЗОВЫ ПОДПРОГРАММ |
Типы и подтипы
Тип характеризуется множеством значений и множеством операций.
Существует несколько
классов
типов.
Скалярные
типы — это целые и вещественные типы и типы, определенные перечислением своих значений; значения этих типов не имеют компонент.
Индексируемый
и
именуемый
типы являются составными. Значение составного типа состоит из значений
компонент. Ссылочный
тип — это тип, значения которого обеспечивают доступ к объектам.
Личные
типы — это типы, для которых полностью определяется набор возможных значений, но непосредственный доступ к ним пользователей невозможен. Наконец, существуют
задачные
типы. (Личные типы описаны в гл. 7, задачные — .в гл. 9, остальные — в гл. 3.)
Именуемые и личные типы могут иметь специальные компоненты, называемые
дискриминантами,
значения которых различают альтернативные формы значений одного из этих типов. Если личный тип имеет дискриминанты, они известны пользователям типа. Следовательно, личный тип известен только своим именем, своими дискриминантами, если они есть, и соответствующим набором операций.
Набор возможных значений данного типа может зависеть от условия, которое называется
ограничением
(сюда не относятся случаи без ограничения), значение
удовлетворяет
ограничению, если оно удовлетворяет соответствующему условию.
Подтип —
это тип вместе с ограничением; говорят, что значение
принадлежит подтипу,
если оно принадлежит типу и удовлетворяет ограничению; данный тип называется
базовым типом
подтипа. Тип является подтипом самого себя; такой подтип называется
неограниченным;
он соответствует условию, которое не налагает никаких ограничений. Базовым типом является он сам.
Множество операций, определенных над конкретным типом, определено и для любого его подтипа; однако переменной данного подтипа можно присвоить значение только этого подтипа. Дополнительные операции, например квалификация (в квалификационном выражении), неявно определяются описанием подтипа.
Для объектов некоторых типов определено
начальное значение по умолчанию,
некоторые другие типы имеют
выражения по умолчанию,
определенные для всех или части своих компонент. Некоторые операции над типами и подтипами называются
атрибутами;
эти операции обозначаются именами, описанными в разд. 4.1.4.
Термин
подкомпонента
используется в описании языка вместо термина
компонента,
чтобы указать компоненту другой компоненты или подкомпоненты. Если нет других подкомпонент, используется термин
компонента.
Подкомпонента значения данного типа не должна быть этого же типа.
Имя класса типов используется в описании языка для квалификации объектов и значений, принадлежащих к типу рассматриваемого класса. Например, термин
индексируемый объект
используется для объекта индексируемого типа; аналогично термин
ссылочное значение
используется для значения ссылочного типа.
Примечание.
Набор значений подтипа — это подмножество значений базового типа. Это подмножество не обязано быть собственным подмножеством; оно может быть пустым.
Ссылки:
атрибут 4.1.4, вещественный тип 3.5.6, задачный тип 9,1, именуемый тип 3.7, индексируемый тип 3.6, квалифицированное выражение 4.7, компонента записи 3.7, компонента массива 3.6, личный тип 7.4, объект 3.2.1, ограничение дискриминанта 3.7.2, описание подтипа 3.3.2, описание типа 3.3.1, перечислимый тип 3.5.1, присваивание 5.2, ссылочный тип 3.8, целый тип 3.5.4.
3.3.1. ОПИСАНИЯ ТИПОВ
Описание типа объявляет тип.
описание-типа ::= полное-описание-типа | неполное-описание-типа | описание-личного-типа
полное-описание-типа ::= type идентификатор [раздел-дискриминантов] is определение-типа;
определение-типа ::= определение-перечислимого-типа | определение-целого-типа | определение-вещественного-типа | определение-индексируемого-типа | определение-именуемого-типа | определение-ссылочного-типа | определение-производного-типа
Предвыполнение полного описания типа состоит из предвыполнения раздела дискриминантов, если он есть (исключая случай использования полного описания типа для неполного описания типа или описания личного типа), и предвыполнения определения типа.
Типы, созданные в результате предвыполнения различных определений, являются различными. Более того, Предвыполнение определения типа для числовых или производных типов' создает как базовый тип, так и подтип базового типа; то же самое выполняется для определения ограниченного индексируемого типа (одной из двух форм определения индексируемого типа).
Простое имя в полном описании типа обозначает описанный тип, если только описание типа не объявляет базовый тип и подтип базового типа; в этом случае простое имя обозначает подтип, а базовый тип является анонимным. Тип называется анонимным, если он не имеет простого имени. Для наглядности в этом стандарте время от времени используется псевдоимя анонимного типа, написанное курсивом, там, где обычно по синтаксису требуется идентификатор.
Примеры определений типов:
(WHITE, RED, YELLOW, GREEN, BLUE. BROWN, BLACK)
range 1 .. 72
array
(1 .. 10)
of
INTEGER
Примеры описаний типов:
type
COLOR
is
(WHITE, RED, YELLOW, GREEN, BLUE. BROWN, BLACK):
type
COLUMN
is range
1 .. 72;
type
TABLE
is array
(1 .. 10)
of
INTEGER;
Примечание.
Два определения типа всегда определяют два различных типа, даже если они текстуально идентичны. Таким образом, данные ниже описания А и В задают различные индексируемые типы:
А :
array
(1 .. 10)
of
BOOLEAN;
В :
array
(1 .. 10)
of
BOOLEAN;
Если А и В описаны в групповом описании объектов, то их типы (анонимные) тем не менее различны, так как это групповое описание объектов эквивалентно двум приведенным выше единичным описаниям.
А, В :
array
(1 .. 10)
of
BOOLEAN;
Неполные описания типов используются для определения рекурсивных и взаимосвязанных типов (см. 3.8.1). Описания личных типов используются в спецификациях пакетов и в описаниях параметров настройки .(см. 7.4 и 12.1).
Ссыпки:
базовый тип 3.3, групповое описание объектов 3.2, зарезервированное слово 2.9, идентификатор 2.3, неполное описание типа 3.8.1, ограниченный подтип 3.3, описание 3.1, описание личного типа 7.4, определение вещественного типа 3.5.6, определение индексируемого ограниченного типа 3.6, определение индексируемого типа 3.6, определение перечислимого типа 3.5.1, определение производного типа 3.4, определение ссылочного типа 3.8, определение целого типа 3.5.4, Предвыполнение 3.9, производный тип 3.4, раздел дискриминантов 3.7.1, тип 3.3, числовой тип 3.5.
3.3.2. ОПИСАНИЯ ПОДТИПОВ
Описание подтипа объявляет подтип.
описание-подтипа ::= subtype идентификатор is указание-подтипа; указание-подтипа ::= обозначение-типа [ограничение] обозначение-типа ::= имя -типа|имя- подтипа
ограничение ::= ограничение-диапазона | ограничение-плавающего-типа | ограничение - фиксированного - типа | ограничение-индекса | ограничение-дискриминанта
Обозначение типа обозначает тип или подтип. Если обозначение типа — имя типа, то оно обозначает этот тип, а также соответствующий неограниченный подтип. Базовым типом,
соответствующим обозначению типа,
является по определению базовый тип типа или подтипа, указанного обозначением типа.
Указание подтипа определяет подтип базового типа, соответствующего обозначению типа.
Если в указании подтипа после обозначения типа стоит ограничение индекса, то обозначение типа не должно обозначать подтип с уже ограниченным индексом. Аналогично для ограничения дискриминанта: обозначение типа не должно иметь ограничение дискриминанта.
Предвыполнение описания подтипа состоит из предвыполнения указания подтипа. Это предвыполнение создает подтип. Если указание подтипа не включает ограничение, то определяемый подтип тот же, что и указанный обозначением типа подтип. Предвыполнение указания подтипа, содержащего ограничение, происходит следующим образом:
а) вначале предвыполняется ограничение;
б) ограничение проверяется на
совместимость
с типом или подтипом, заданным обозначением типа.
После предвыполнения ограничения получается условие, наложенное ограничением. (Правила предвыполнения ограничения таковы, что выражения и диапазоны ограничений вычисляются при предвыполнении всех этих ограничений.) Правила определения совместимости даны в соответствующих разделах для каждой формы ограничения. Эти правила таковы, что если ограничение совместимо с подтипом, то наложенное ограничением условие не может противоречить никакому условию, уже заданному для значений этого подтипа. В противном случае возбуждается исключение CONSTRAINT_ERROR.
Примеры описаний подтипов:
subtype RAINBOW is COLOR range RED .. BLUE; -- см. 3.3.1 subtype REOBLUE is RAINBOW; subtype INT is INTEGER; subtype SMALUNT is INTEGER range -10 .. 10; subtype UPTOK is COLUMN range 1 .. К; -- см. 3.3.1 subtype SQUARE is MATRIX(1 .. 10, 1 .. 10); -- см. 3.6 subtype MALE is PERSON(SEX => M); -- см. 3.8
Примечание.
Описание подтипа не определяет нового типа.
Ссылки:
базовый тип3, выражение 4.4, вычисление 4.5, дискриминант 3.3, зарезервированное слово 2.9, имя типа 3.3.1, исключение CONSTRAINT_ERROR 11.1, неограниченный подтип 3.3, ограничение диапазона 3.5, ограничение дискриминанта 3.7.2, ограничение индекса 3.6.1, ограничение плавающего типа 3.5.7, ограничение фиксированного типа 3.5.9, описание 3.1, подтип 3.3, предвыполнение 3.9, совместимость с ограничением диапазона 3.5, совместимость с ограничением дискриминанта 3.7.2, совместимость с ограничением индекса 3.6.1, совместимость с ограничением плавающего типа 3.5.7, совместимость с ограничением фиксированного типа 3.5.9, тип 3.3.
3.3.3. КЛАССИФИКАЦИЯ ОПЕРАЦИЙ
Множество операций над типом включает явно описанные подпрограммы с параметром
или результатом этого типа; такие подпрограммы необходимо описывать после описания типа.
Остальные операции неявно описываются сразу после каждого описания типа. К ним относятся
базовые
операции, предопределенные операции (см. 4.5) и литералы перечисления. Описанием производного типа неявно задаются операции, включающие производные подпрограммы. Считается, что описания операций расположены между описанием типа и последующим описанием, если таковое имеется. Неявные описания производных подпрограмм расположены последними. Базовыми операциями являются:
• Присваивание (в операторах присваивания и инициализациях), генератор, проверка принадлежности или форма управления с промежуточной проверкой.
• Именуемая компонента, индексируемая компонента или отрезок.
• Квалификация (в квалифицированных выражениях), явное преобразование типа или неявное преобразование значения типа
универсальный-целый
или
универсальный-вещественный в
соответствующее значение другого числового типа.
• Числовой литерал (для универсального типа), литерал
null
(для ссылочного типа), строковый литерал, агрегат или атрибут.
Для каждого типа или подтипа Т определен следующий атрибут:
Т'BASE | Базовый тип Т. Этот атрибут допустим только в качестве префикса имени другого атрибута, например T'BASE'FIRST. |
Каждый литерал — это операция, в результате выполнения которой вырабатывается сооветствующее значение (см. 4.2). Подобно этому, агрегат — это операция, в результате выполнения которой вырабатывается значение составного типа (см. 4.3). Некоторые операции
оперируют
со значениями данного типа, например предопределенные операции и некоторые подпрограммы и атрибуты. Некоторые операции
возвращают
значение данного типа, например литералы и некоторые функции, атрибуты и предопределенные операции. Присваивание — это операция, которая оперирует с объектом и значением. В результате вычисления операции, соответствующей именуемой компоненте, индексируемой компоненте или отрезку, вырабатывается объект или значение, обозначенное этой формой имени.
Ссылки:
агрегат 4.3, атрибут 4.1.4, генератор 4.8, именуемая компонента 4.1.3, индексируемая компонента 4.1.1., квалифицированное выражение 4.7, литерал 4.2, литерал перечисления 3.5.1, начальное значение 3.2.1, объект 3.2.1, 3.2, описание типа 3.3.1, отрезок 4.1.2, подпрограмма 6, подтип 3.3, предопределенная операция 4.5, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, производная подпрограмма 3.4, пустой литерал 3.8, символьный литерал 2.5, составной тип 3.3, строковый литерал 2.6, тип 3.3, универсальный вещественный тип 3.5.6, универсальный тип 4.10, универсальный целый тип 3.5.4, управление с промежуточной проверкой 4.5, 4.5.1, формальный параметр 6.1, функция 6.5, числовой литерал 2.4, числовой тип 3.5.
Пред. | Уровень выше | След. |
3.2. ОБЪЕКТЫ И ИМЕНОВАННЫЕ ЧИСЛА |
Содержание | 3.4. ПРОИЗВОДНЫЕ ТИПЫ |
Универсальные выражения
Универсальное выражение —
это выражение, вырабатывающее результат
универсального-целого
или
универсального-вещественного
типа.
Для
универсального-целого
типа предопределены те же операции, что и для любого целого типа. Для
универсального-вещественного
типа предопределены те же операции, что и для любого плавающего типа. Кроме того, эти операции включают операции умножения и деления.
Знак Операция операции | Тип левого операнда | Тип правого операнда | Тип результата | ||||||
* | Умножение | Универсальный-вещественный | Универсальный- целый | Универсальный- вещественный | |||||
Универсальный - целый | Универсальный- вещественный | Универсальный - вещественный | |||||||
/ | Деление | Универсальный-вещественный | Универсальный-целый | Универсальный-вещественный |
Точность вычисления универсального выражения типа
универсальный-вещественный
обязана быть не ниже точности любого из предопределенных плавающих типов, поддержанных в реализации, исключая сам
универсальный-вещественный
тип. Более того, если универсальное выражение — статическое, то вычисление также должно быть точным.
При вычислении операций универсального выражения, не являющегося статическим, возбуждение исключения NUMERIC_ERROR реализацией допускается только в том случае, если результат операции — вещественное число с абсолютным значением, превышающим наибольшее хранимое число самого точного предопределенного плавающего типа (исключая
универсальный-вещественный),
или целое значение, большее, чем SYSTEM.MAX_INT, либо меньшее, чем SYSTEM.MIN_INT.
Примечание.
Следствием приведенных выше правил является то, что тип универсального выражения —
универсальный-целый,
если этот тип имеет каждое первичное, содержащееся в выражении (исключая фактические параметры атрибутов — функций и правые операнды операций возведения в степень), в противном случае тип универсального выражения —
универсальный-вещественный.
Примеры:
1+1 -- 2 аbs(-10)*3 -- 30
KILO : constant := 1000; MEGA : constant := KILO*KILO; -- 1 000 000 LONG : constant := FLOАТ'DIGIТS*2;
HALF_PI : constant := Р1/2; -- см. 3.2.2. DEG_TO_RAD : constant := HALF_Р1/90; RAD_TO_DEG : constant := 1.0/DЕG_ТО_RАD; --- эквивалентно 1.0/((3.14159_26536/2)/90)
Ссылки:
атрибут 4.1.4, вещественный тип 3.5.6, вычисление выражения 4.5, мультипликативная операция 4.5, 4.5.5, первичное 4.4, плавающий тип 3.5.9, предопределенная операция типа 3.3.3, SYSTEM.MAX-INT 13.7, SYSTEM.MIN-INT 13.7, тип 3.3, универсальный-вещественный тип 3.5.6, универсальный-целый тип 3.5.4, фактический параметр 6.4.1, функция 6.5, хранимое число 3.5.6, целый тип 3.5.4.
Пред. | Уровень выше | След. |
4.9. СТАТИЧЕСКИЕ ВЫРАЖЕНИЯ И СТАТИЧЕСКИЕ ПОДТИПЫ |
Содержание | Глава 5. ОПЕРАТОРЫ |
Условные операторы
Условный оператор выбирает для выполнения одну или ни одной из входящих в него последовательностей операторов в зависимости от значения (истинности) одного или нескольких условий.
условный-оператор ::= if условие then
последовательность - операторов | elsif условие then
последовательность-операторов) [else
последовательность - операторов] end if
; условие ::= логическое-выражение
Выражение, задающее условие, должно быть логического типа.
Для выполнения условного оператора вычисляются последовательно условия после
if
и
elsif
(трактуя заключительное
else
как
elsif
TRUE
then
) до тех пор, пока одно из них не окажется истинным или не будут исчерпаны все условия. При нахождении условия со значением TRUE выполняется соответствующая последовательность операторов, в противном случае не выполняется ни одна из последовательностей операторов.
Примеры:
if MONTH = DECEMBER and DAY = 31 then
MONTH := JANUARY; DAY := 1; YEAR := YEAR + 1; end if;
if LINE-JOO-SHORT then
raise LAYOUT-ERROR; elsif LINEFULL then
NEW-LINE; PUT(ITEM); else
PUT(ITEM); end if;
if MY-.CAR.OWNER.VEHICLE /= MY-.CAR then -- CM. 3.8.1 REPORT ("Incorrect data"); end if;
Ссылки:
выражение 4.4, выполнение 4.5, логический тип 3.5.3, последовательность операторов 5.1.
Пред. | Уровень выше | След. | |
5.2. ОПЕРАТОРЫ ПРИСВАИВАНИЯ
|
Содержание |
5.4. ОПЕРАТОРЫ ВЫБОРА |
Условные вызовы входов
Условный вызов входа производит вызов входа, который отменяется, если рандеву нельзя осуществить немедленно.
условный-вызов-входа ::= select
оператор-вызова-входа [последовательность-операторов] else
последовательность-операторов end select;
При выполнении условного вызова входа вначале вычисляется имя входа. Затем выполняются требуемые вычисления фактических параметров, как при вызове подпрограмы (см. 6.4).
Вызов входа отменяется, если выполнение вызванной задачи не достигло точки, в которой она готова к принятию входа (т.е. не достигнуты оператор принятия соответствующего входа или оператор отбора с открытой альтернативой принятия этого входа), или существует очередь ранее сделанных вызовов этого входа. Если вызванная задача достигла оператора отбора, но альтернатива принятия этого входа не отобрана, то вызов входа отменяется.
Если вызов входа отменен, то выполняются операторы раздела иначе. В противном случае происходит рандеву и выполняется последовательность операторов после вызова входа (если она есть).
Выполнение условного вызова входа возбуждает исключение-TASKING- ERROR, если вызванная задача уже закончила свое выполнение (см. разд. 9.10 для случая, когда вызванная задача становится аварийной).
Пример:
procedure SPIN(R : RESOURCE) is
begin
loop
select
R.SEIZE; return;
else
null;
--занято, надо подождать end select:
end loop;
end;
Ссылки:
аварийная задача 9.10, выполнение 4.5, выражение 4.4, задача 9, законченная задача 9.4, индекс входа 9.5, исключение TASKING_ERROR 11.1, оператор вызовов входа 9.5, оператор отбора 9.7, оператор принятия 9.5, открытая альтернатива 9.7.1, очередь вызова входа 9.5, последовательность операторов 5.1, раздел фактических параметров 6.4, рандеву 9.5, семейство входов 9.5
9.7.3. ВРЕМЕННЫЕ ВЫЗОВЫ ВХОДОВ
Временной вызов входа производит вызов входа, который отменяется, если рандеву не началось на протяжении заданной задержки.
временной-вызов-входа ::= select
оператор-вызова-входа [последовательность - операторов] or
альтернатива-задержки end select;
При выполнении временного вызова входа вначале вычисляется имя входа. Затем выполняются требуемые вычисления фактических параметров, как при вызове подпрограммы (см. 6.4). После этого вычисляется выражение, задающее задержку, и, наконец, производится вызов входа.
Если рандеву может начаться в течение указанной длительности (или немедленно, как для условного вызова входа, если задержка отрицательная или нулевая), то оно происходит, и затем после вызова входа отменяется и выполняется возможная последовательность операторов альтернативы задержки.
Выполнение временного вызова входа возбуждает исключение TASKING_ERROR, если вызванная задача закончила свое выполнение до принятия вызова (см. также разд. 9.10 для случая, когда вызванная задача становится аварийной).
Пример:
select
CONTROLLER. REQUEST(MEDIUM)(SOME_ITEM); or
delay 45.0; -- контроллер слишком занят, попробуйте -- что-либо еще end select;
Ссылки:
аварийная задача 9.10, выполнение 4.5, выражение 4.4, выражение задержки 9.6, длительность 9.6; задача 9, законченная задача 9.4, индекс входа 9.5, исключение TASKING_ERROR 11.1, оператор вызова входа 9.5, оператор задержки 9.6, оператор принятия 9.5, последовательность операторов 5.1, раздел фактических параметров 6.4, рандеву 9.5, семейство входов 9.5, условный вызов входа 9.7.2.
Пред. | Уровень выше | След. |
9.7. ОПЕРАТОРЫ ОТБОРА |
Содержание | 9.8. ПРИОРИТЕТЫ |
Входы, вызовы входов и операторы принятия
Вызовы входов и операторы принятия являются основными средствами синхронизации задач и передачи значений между задачами. Описание входа подобно описанию подпрограммы и допустимо только в спецификации задачи. Действия, которые следует выполнить после вызова входа, задаются соответствующими операторами принятия.
описание-входа ::= entry идентификатор [(дискретный-диапазон)] [раздел-формальных-параметров];
оператор-вызова-входа ::= имя-входа [раздел-фактических-параметров];
оператор-принятия ::= accept простое-имя-входа [(индекс-входа)] [раздел-формальных-параметров] [do
последовательность-операторов end [простое-имя-входа]];
индекс-входа ::= выражение
Описание входа, включающее дискретный диапазон (см. 3.6.1), описывает семейство различных входов с одним и тем же формальным разделом (если он есть), а именно по одному входу для каждого значения дискретного диапазона. Термин
одиночный вход
используется при определении правил, применимых к любому входу, отличному от члена семейства. Задача, указанная объектом задачного типа, имеет вход (входы), который (которые) описан (описаны) в спецификации этого задачного типа.
В теле задачи каждый из ее одиночных входов или семейства входов может быть именован соответствующим простым именем. Имя входа семейства записывается в форме индексируемой компоненты: за простым именем семейства в круглых скобках следует индекс; тип этого индекса должен быть тем же, что и тип дискретного диапазона в соответствующем описании семейства входов. Вне тела задачи имя входа записывается в форме именованной компоненты, префикс которой обозначает задачный объект, а постфикс является простым именем одного из одиночных входов или семейства входов.
Одиночный вход совмещается с подпрограммой, литералом перечисления или другим одиночным входом, если у них одинаковые идентификаторы. Совмещение для семейства входов не определено. Одиночный вход или вход семейства могут быть переименованы в процедуру, как поясняется в разд. 8.5.
Виды параметров, определенные для параметров формального раздела описания входа, такие же, как в описании подпрограммы, и имеют тот же смысл (см. 6.2).
Синтаксически оператор вызова входа подобен оператору вызова процедуры; правила сопоставления параметров остаются теми же, что и для вызовов подпрограмм (см. 6.4.1 и 6.4.2).
Оператор принятия задает действия, которые выполняются при вызове упомянутого в этом операторе входа (им может быть и вход семейства). Раздел формальных параметров оператора принятия должен быть согласован с разделом формальных параметров, заданным в описании одиночного входа или семейства входов, упомянутых в операторе принятия (см. разд. 6.3.1 о согласовании). Если в конце оператора принятия используется простое имя, оно должно повторять простое имя, заданное в начале этого оператора.
Оператор принятия входа данной задачи допускается только в соответствующем теле задачи, исключая тело программного модуля, вложенного в тело задачи, и оператор принятия этого же одиночного входа или входа того же семейства. (Из этих правил следует, что задача может выполнять операторы принятия только своих входов.) Тело задачи может содержать несколько операторов принятия одного и того же входа.
При предвыполнении описания входа вначале вычисляется дискретный диапазон (если он есть), затем так же, как в описании подпрограммы, предвыполняется раздел формальных параметров (если он есть).
Выполнение оператора принятия начинается с вычисления индекса входа (в случае входа семейства). Выполнение оператора вызова входа начинается с вычисления имени входа, затем следуют вычисления, требуемые для фактических параметров, как и при вызове подпрограммы (см. 6.4). Дальнейшее выполнение оператора принятия и соответствующего оператора вызова входа синхронизовано.
Если данный вход вызывается только одной задачей, то предоставляются две возможности:
• Если вызывающая задача перешла к оператору вызова входа раньше, чем имеющая этот вход задача достигла оператора принятия, то выполнение вызывающей задачи
приостанавливается.
•
Если задача достигла оператора принятия раньше любого вызова этого входа, то выполнение задачи приостанавливается до получения такого вызова.
Если вход был вызван и соответствующий оператор принятия достигнут, то его последовательность операторов (если она есть) выполняется вызванной задачей (вызывающая задача остается приостановленной). Это взаимодействие задач называется
рандеву.
После рандеву вызывающая задача и задача, содержащая вход, продолжают выполняться параллельно.
Если несколько задач вызывают один и тот же вход до того, как достигнут оператор принятия, то эти вызовы становятся в очередь; с каждым входом связывается одна очередь. Каждое выполнение оператора принятия удаляет из очереди один вызов. Вызовы обрабатываются в порядке поступления.
При попытке вызвать вход задачи, закончившей свое выполнение, в точке вызова вызывающей задачи возбуждается исключение TASKING_ERROR; это же исключение возбуждается в точке вызова, если вызванная задача заканчивает свое выполнение до принятия входа (см. также разд. 9,10 для случая, когда вызванная задача становится аварийной). Исключение CONSTRAINT_ERROR возбуждается, если индекс входа семейства не принадлежит заданному дискретному диапазону.
Примеры описаний входов:
entry
READ(V : out ITEM); entry SEIZE; entry REQUEST(LEVEL)(D : ITEM); -- семейство входов
Примеры вызовов входов:
CONTROL.RELEASE; -— см. 9.2 и 9.1 PRODUCER_CONSUMER.WRITE(E); -— CM. 9.1 POOL(5).READ(NEXT_CHAR); -— CM. 9.1 и 9.2 CONTROLLER.REQUEST(LOW)(SOME_ITEM); —- см. 9.1
Примеры операторов принятия:
accept SEIZE;
accept READ(V : out ITEM) do
V := i.OCAUTEM; end READ;
accept REQUEST(LOW)(D : ITEM) do
... end REQUEST;
Примечание.
Заданный в операторе принятия раздел формальных параметров не предвыполняется; он используется только для идентификации соответствующего входа.
Оператор принятия может вызывать подпрограммы, производящие вызовы входов. Оператор принятия может не содержать последовательности операторов, даже если соответствующий вход имеет параметры. Точно так же он может содержать последовательность операторов, даже если соответствующий вход не имеет параметров.
Последовательность операторов в операторе принятия может включать операторы возврата. Задача может вызывать и свои собственные входы, однако это, конечно, может привести к тупиковой ситуации. Языком разрешены условные и временные вызовы входов (см. 9.7.2 и 9.7.3). Правилами языка задаче в данной момент времени разрешается находиться только в одной очереди.
Если границы дискретного диапазона семейства входов являются литералами целого типа, то индекс (в имени входа или в операторе принятия) должен быть предопределенного типа INTEGER (см. 3.6.1).
Ссылки:
аварийная задача 9.10, временнбй вызов входа 9.7.3, вызов процедуры 6.4, выполнение 4.5, выражение 4.4, дискретный диапазон 3.6.1, задача 9, законченная задача 9.4, идентификатор 2.3, именуемая компонента 4.1.3, имя 4.1, индексируемая компонента 4.1.1, исключение CONSTRAINT_ERROR 11.1, исключение TASKING_ERROR 11.1, литерал перечисления 3.5.1, область 8.2, объект 3.2, оператор возврата 5-8, описание переименования 8.5, описание подпрограммы 6.1, параллельное выполнение 9, подпрограмма 6, последовательность операторов 5.1, постфикс 4.1.3, правила согласования 6.3.1, предвыполнение 3.1, 3.9, префикс 4.1, простое выражение 4.4, простое имя 4.1, процедура 6, раздел фактических параметров 6.4, совмещение 6.6, 8.7, спецификация задачи 9, тело задачи 9.1, тело подпрограммы 6.3, указывать 9.1, условный вызов входа 9.7.2, формальный раздел 6.1, целый тип 3.5.4.
Пред. | Уровень выше | След. |
9.4. ЗАВИСИМОСТЬ ЗАДАЧ. ЗАВЕРШЕНИЕ ЗАДАЧ |
Содержание | 9.6. ОПЕРАТОРЫ ЗАДЕРЖКИ, ДЛИТЕЛЬНОСТЬ И ВРЕМЯ |
Видимость
Правила видимости, а в случае совмещенных операций и правила совмещения, трактуют вхождение идентификатора в данной точке текста программы. Под идентификатором в данной главе подразумевают любой идентификатор, кроме зарезервированных слов, обозначений атрибутов, идентификаторов прагм и аргументов прагм. Под точкой текста программы в этой главе понимают место вхождения лексемы (например, идентификатора), а под совмещенными описаниями — описания подпрограмм, литералов перечисления, одиночных входов.
Для каждого идентификатора и в каждой точке текста программы правила видимости определяют набор описаний (с этим идентификатором), т. е. варианты трактовки идентификатора. Говорят, что описание
видимо в
данной точке текста, когда, согласно правилам видимости, оно определяет возможные трактовки его вхождения. Возникают два случая:
•Правила видимости определяют
не более одной
трактовки идентификатора. В таком случае правил видимости достаточно для выявления описания, определяющего трактовку вхождения идентификатора, или при отсутствии такого описания для выявления того, что это вхождение в данной точке незаконно, не является правильным.
• Правила видимости определяют
более чем одну
трактовку. В таком случае вхождение идентификатора является правильным в данной точке, если и только если
точно одно
видимое описание выбирается правилами совмещения в соответствии с данным контекстом (см. разд. 6.6 для правил совмещения и разд. 8.7 для контекста, используемого при разрешении совмещения).
Описание видимо только в определенной части своей области действия; эта часть начинается в конце описания, а в спецификации пакета эта часть начинается с зарезервированного слова
is,
следующего за идентификатором пакета. (Это правило применяется, в частности, для неявных описаний.)
Видимость может быть прямой или видимостью по имени. Описание видимо по
имени
в точках программы для:
а) описания, находящегося в видимом разделе описания пакета — на месте постфикса после точки в расширенном имени, префикс которого обозначает пакет;
б) описания входа конкретного задачного типа — на месте постфикса после точки в именованной компоненте, префикс которой соответствует задачному типу;
в) описания компоненты конкретного описания именуемого типа — на месте постфикса после точки в именованной компоненте, префикс которой соответствует этому типу, а также на месте простого имени компоненты (перед составным ограничителем =>) в именованном сопоставлении компонент агрегата этого типа;
г) спецификации дискриминанта конкретного описания типа — в местах, предназначенных для описания компоненты и простого имени дискриминанта (перед составным ограничителем =>) в именованном сопоставлении дискриминанта в ограничении дискриминанта для этого типа;
д) спецификации параметра данной спецификации подпрограммы или описания входа — на месте формального параметра (перед составным ограничителем =>) в именованном сопоставлении параметра соответствующей подпрограммы или вызова входа;
е) описания параметра настройки данного настраиваемого модуля — на месте формального параметра настройки (перед составным ограничителем =>) в именованном сопоставлении соответствующей конкретизации настройки.
Наконец, в зоне описания, связанной с конструкцией, не являющейся описанием именуемого типа, любое описание видимо по имени на месте постфикса после точки в расширенном имени, префикс которого обозначает эту конструкцию.
Там, где нет видимости по имени, говорят, что описание
видимо непосредственно.
Описание видимо непосредственно в определенном разделе его непосредственной области действия; этот раздел распространяется до конца непосредственной области действия описания, за исключением тех мест, где это описание скрыто, как поясняется ниже. Кроме того, описание, находящееся непосредственно в видимом разделе пакета, может быть сделано непосредственно видимым с помощью спецификатора использования по правилам, описанным в разд. 8.4 (см. также разд. 8.6 о видимости библиотечных модулей).
Описание
скрыто
во внутренней зоне описания, если она содержит омоним этого описания; внешнее описание является тогда скрытым в непосредственной области действия этого внутреннего омонима. Каждое из двух описаний является
омонимом
другого, если оба описания имеют один и тот же идентификатор и не более чем для одного из них допустимо совмещение. Если совмещение допустимо для обоих описаний, то каждое из двух является омонимом другого в случае, если они имеют одинаковый идентификатор, символ операции или символьный литерал, а также одинаковый профиль типа параметров и результата (см. 6.6).
В спецификации подпрограммы скрыто каждое описание с таким же обозначением, как у подпрограммы; данное положение справедливо для конкретизации настройки, которая описывает подпрограмму, и в описании входа или в разделе формальных параметров оператора принятия. В этих случаях описание не является видимым ни по имени, ни непосредственно.
Два описания, которые находятся непосредственно в одной и той же зоне описания, не должны быть омонимами, за исключением тех случаев, когда выполнены одно или оба следующих требования: а) точно одно из них является неявным описанием предопределенной операции; б) точно одно из них является неявным описанием производной подпрограммы. В таких случаях предопределенная операция всегда скрыта другим омонимом; производная подпрограмма скрывает предопределенную операцию, но скрыта сама любым другим омонимом.
Там, где скрытие осуществляется таким образом, неявное описание скрыто во всей области действия другого описания (независимо от того, какое описание стоит первым); неявное описание не видимо ни по имени, ни непосредственно.
Всегда, когда описание с определенным идентификатором видимо в данной точке, говорят, что идентификатор и описанное понятие (если оно есть) видимы в этой точке. Непосредственная видимость и видимость по имени для символьных литералов и символов операций определяются аналогично. Операция, обозначенная знаком, непосредственно видима тогда и только тогда, когда описание соответствующей операции непосредственно видимо.
Наконец, обозначения, связанные с базовой операцией, непосредственно видимы во всей области действия этой операции.
Пример:
procedure P is
А, В : BOOLEAN;
procedure Q is
С : BOOLEAN; В : BOOLEAN; -— внутренний омоним В begin
... B := А; -- означает.а.в := Р.А; С := Р.В; -— означает Q.C := Р.В; end;
begin
А := B; -—означает Р.А := Р.В; end;
Примечание о видимости библиотечных модулей.
Видимость библиотечных модулей определена спецификаторами совместности (см. 10.1.1) и тем фактом, что библиотечные модули неявно описаны в пакете STANDARD (см. 8.6).
Примечание об омонимах.
Один и тот же идентификатор может находиться в различных описаниях и, таким образом, соответствовать различным понятиям, даже если области действия описаний перекрываются. Перекрытие областей действия описаний с одним и тем же идентификатором может получиться из-за совмещения подпрограмм и литералов перечисления. Такое перекрытие может произойти для понятий, описанных в видимых разделах пакета, а также входов, компонент записей и параметров, где имеется перекрытие областей действия охватывающих описаний пакета, описаний задачи, описаний именуемого типа, описаний подпрограмм, описаний переименований и описаний настройки. Наконец, перекрытие областей действия может быть результатом вложенности.
Примечание к непосредственной области действия, скрытию и видимости.
Правила, определяющие непосредственную область действия, скрытия и видимости, предусматривают, что ссылка на идентификатор в его собственном описании является неправильной (исключая случаи пакетов и настраиваемых пакетов). Идентификатор скрывает внешние омонимы в собственной непосредственной области действия, т. е. от начала описаний; с другой стороны, идентификатор является видимым только после конца описания. По этой причине (кроме последнего) все следующие описания являются неправильными.
K : INTEGER := K * K; -- неправильно T : T; -- неправильно procedure Р(х : P); -- неправильно procedure Q(X : REAL := Q); -- неправильно даже если существует функция с именем Q procedure R(R : REAL); -- правильное, хотя создает путаницу.
Ссылки:
агрегат 4.3, аргумент 2.8, базовая операция 3.3.3, библиотечный модуль 10.1, видимый раздел 7.2, вызов входа 9.5, вызов подпрограммы 6.4, задачный модуль 9, задачный тип 9.1, зарезервированное слово 2.9, знак операции 6.1, зона описания 8.1, идентификатор 2.3, именованная компонента 4.1.3, именуемый тип 3.7, конкретизация настройки 12.3, лексема 2.2, литерал 2.5, настраиваемый модуль 12, настраиваемый пакет 12.1, находится непосредственно в 8.1, непосредственная область действия 8.2, неявное описание 3.1, область действия 8.2, объект 3.2, ограничение дискриминанта 3.7.2, оператор принятия 9.5, операция 4.5, описание 3.1, описание входа 9.5, описание компоненты 3.7, описание параметра настройки 12.1, описание подпрограммы 6.1, описание типа 3.3.1, пакет 7, параметр 6.2, подпрограмма 6, постфикс
4.1.3, прагма 2.8, программный модуль 6, простое имя 4.1, распространяется 8.1, расширенное имя 4.1.3, семейство входов 9.5, совмещение 6.6, 8.7, соответствует типу 4.1, сопоставление компонент 4.3, сопоставление параметров 6.4, сопоставление параметров настройки 12.3, составной ограничитель 2.2, спецификатор использования 8.4, спецификация дискриминанта 3.7.1, спецификация литерала перечисления 3.5.1, спецификация параметра 6.1, спецификация подпрограммы 6.1, тип 3.3, указывать 3.8, формальный параметр 6.1, формальный параметр настройки 12.1.
-8.4. СПЕЦИФИКАТОРЫ ИСПОЛЬЗОВАНИЯ
Спецификатор использования обеспечивает непосредственную видимость описаний, которые находятся в видимых разделах пакетов с именами, упомянутых в спецификаторе использования.
спецификатор-использования ::=
use
имя-пакета {, имя-пакета};
Для каждого спецификатора использования существует определенная зона текста, называемая
областью действия
спецификатора использования. Эта зона начинается непосредственно после спецификатора использования. Если спецификатор использования является элементом описания некоторой зоны описания, то область действия спецификатора использования распространяется до конца этой зоны описания.
Если спецификатор использования находится в спецификаторе контекста компилируемого модуля, то область действия спецификатора использования распространяется до конца зоны описания, связанной с данным компилируемым модулем.
Чтобы определить, какие описания становятся прямо видимыми в данном месте с помощью спецификатора использования, рассмотрим пакеты, упомянутые в спецификаторах использования, области действия которых охватывают это место. Описанием, которое может быть сделано прямо видимым с помощью спецификатора использования (потенциально видимое описание), является такое описание, которое находится непосредственно в видимом разделе одного из этих пакетов. Потенциально видимое описание становится фактически прямо видимым, за исключением двух случаев:
• Потенциально видимое описание не становится прямо видимым, если рассматриваемое место программы находится непосредственно в области действия описания омонима.
• Потенциально видимые описания с-одинаковыми идентификаторами не становятся прямо видимыми, если только каждое из них не является спецификацией литерала перечисления или описанием подпрограммы (представляющим собой описание подпрограммы, описание переименования, конкретизацию настройки или неявное описание).
Предвыполнение спецификатора использования не имеет другого эффекта. /
Примечание.
Приведенные выше правила гарантируют, что описание, которое стало прямо видимым с помощью спецификатора использования, не может скрывать другое прямо видимое описание. Эти правила сформулированы в терминах набора пакетов, упомянутых в спецификаторах использования.
Следовательно, приведенные ниже строчки текста дают один и тот же эффект (в предположении существования единственного пакета Р).
use
Р;
use
Р;
use
Р, Р;
Пример противоречия имен в двух пакетах:
procedure R is
package TRAFFIC is
type COLOR is (RED, AMBER, GREEN); ... end TRAFFIC;
package WATER_COLORS is
type COLOR is (WHITE, RED, YELLOW, GREEN, BLUE, BROWN, BLACK); ... end WATER_COLORS;
use TRAFFIC; -- COLOR, RED, AMBER, и GREEN непосредственно видимы use WATER_COLORS; -- Два омонима GREEN непосредственно видимы, -- butCOLOR не является более непосредственно видимым subtype LIGHT is TRAPPIC.COLOR; -- подтип использован для разрешения subtype SHADE is WATER_COLORS.COLOR; -- противоречия, связанного с именем типа. COLOR
SIGNAL : LIGHT; PAINT : SHADE; begin
SIGNAL := GREEN; -— из пакета TRAFFIC PAINT := GREEN; -— из пакета WATER-COLORS
end R;
Пример идентификации имени со спецификатором использования:
package D is
Т, U, V : BOOLEAN; end D;
procedure P is
package E is
B, W, V : INTEGER; end E;
procedure Q is
Т, Х : REAL; use D, E; begin
-— имя Т означает Q.Т, not D.T -— имя U ознaчaeT D.U -— имя В означает Е.В -— имя W oзнaчaeT E.W -— имя Х означает Q.Х -— имя неправильно: должно быть использовано D.V или ... end Q; begin
... end P;
Ссылки:
видимый раздел 7.2, зона описания 8.1, идентификатор 2.3, имя 4.1, компилируемый модуль 10.1, находиться непосредственно в 8.1, непосредственная видимость 8.3, непосредственная область действия 8.2, область действия 8.2, омоним 8.3, описание 3.1, описание подпрограммы 6.1, пакет 7, Предвыполнение 3.1, 3.9, Предвыполнение не имеет другого эффекта 3.1, распространение 8.1, скрытие 8.3, спецификатор контекста 10.1, спецификация литерала перечисления 3.5.1, элемент описания 3.9.
Пред. | Уровень выше | След. |
8.2. ОБЛАСТИ ДЕЙСТВИЯ ОПИСАНИЙ |
Содержание | 8.5. ОПИСАНИЯ ПЕРЕИМЕНОВАНИЯ |
Виды формальных параметров
Говорят, что значение объекта
читается,
когда это значение вычисляется; оно также читается, когда читается одна из его подкомпонент. Говорят, что значение переменной
изменяется,
когда выполняется присваивание этой переменной, а также (косвенно) когда эта переменная используется в качестве фактического параметра оператора вызова подпрограммы или оператора вызова входа, которые изменяют ее значение; говорят также, что оно изменяется, когда изменяется одна из его подкомпонент.
Формальный параметр подпрограммы бывает одного из следующих трех видов:
in | Формальный параметр — константа, разрешается только чтение значения соответствующего фактического параметра. | ||
in out | Формальный параметр — переменная, разрешается как чтение, так и изменение значения соответствующего фактического параметра. | ||
out | Формальный параметр — переменная, разрешается изменение значения соответствующего фактического параметра. Значение скалярного параметра, которое не изменяется при вызове, после возврата не определено; то же самое имеет место для значения скалярной подкомпоненты, отличной от дискриминанта. Допускается чтение границ и дискриминантов формального параметра и его подкомпонент; никакое другое чтение не допускается. |
Для скалярного параметра такой эффект достигается копированием: в начале каждого вызова значение фактического параметра, соответствующего формальному параметру вида
in
или
in out,
копируется в этом формальном параметре (прямое копирование); затем после нормального окончания тела подпрограммы значение формального параметра вида
in out
или
out
копируется обратно в соответствующем фактическом параметре (обратное копирование). Для параметра ссылочного типа прямое копирование используется для всех трех видов, а обратное — для видов
in out и out.
Для параметров индексируемого, именуемого или задачного типов реализация может достигнуть такого же эффекта копированием, как и для скалярных типов.
Кроме того, если копирование используется для параметра вида
out,
то прямое копирование требуется по крайней мере для границ и дискриминантов фактического параметра и его подкомпонент, а также для каждой подкомпоненты ссылочного типа. Другой вариант — вызов ссылкой, когда каждое использование формального параметра (чтение или изменение его значения) рассматривается как использование соответствующего фактического параметра при выполнении вызова подпрограммы. В языке не определяется, какой из этих двух механизмов следует применять для передачи параметров; не определяется также, что различные вызовы одной и той же подпрограммы должны использовать один и тот же механизм. Выполнение программы ошибочно, если ее результат зависит от механизма, выбираемого реализацией.
Для параметра личного типа вышеуказанный эффект достигается по правилу, которое применяется к соответствующему полному описанию типа.
В теле подпрограммы формальный параметр отвечает любому ограничению, вытекающему из обозначения типа, данного в спецификации этого параметра. В качестве границ формального параметра неограниченного индексируемого типа берутся границы фактического параметра (см. 3.6.2). Для формального параметра, описание которого задает неограниченный (личный или именуемый) тип с дискриминантами, дискриминанты этого формального параметра инициализируются значениями соответствующих дискриминантов фактического параметра; формальный параметр не ограничен тогда и только тогда, когда его вид
in out
или
out
и имя переменной, являющейся фактическим параметром, обозначает неограниченную переменную (см. 3.7.1 и 6.4.1).
Если фактический параметр вызова подпрограммы является подкомпонентой, которая зависит от дискриминантов переменной неограниченного именуемого типа, то выполнение вызова ошибочно, если значение любого дискриминанта переменной изменяется при этом выполнении; это правило не применяется, если вид параметра
in
и тип подкомпоненты — скалярный тип или ссылочный тип.
Примечание.
Из правил передачи параметров индексируемого и именуемого типов следует:
• Если выполнение подпрограммы прекращено в результате исключения, конечное значение фактического параметра такого типа может быть либо тем же, что и до вызова, либо значением, присвоенным формальному параметру во время выполнения подпрограммы.
• Если доступ ко всем фактическим параметрам такого типа осуществляется одним способом, то результат вызова подпрограммы (при отсутствии исключения) не зависит от того, использует ли реализация для передачи параметров копирование. Если, однако, доступ к фактическому параметру осуществляется несколькими способами (например, если глобальная переменная или другой формальный параметр ссылается на один и тот же фактический параметр), то значение формального параметра после изменения фактического способом, отличным от изменения формального, неопределенно. Программа, использующая такое неопределенное значение, является ошибочной.
Такие же виды параметров определены и для формальных параметров входов (см. 9.5) с тем же смыслом, что и для подпрограмм. Для формальных параметров настройки определены другие виды параметров (см. 12.1.1).
Для всех видов справедливо, что если фактический параметр указывает задачу, то соответствующий формальный параметр указывает ту же задачу; то же самое имеет место для подкомпоненты фактического параметра и соответствующей подкомпоненты формального параметра.
Ссылки:
вид 6.1, выражение 4.4, вычисление 4.5, глобальный 8.1, граница массива 3.6.1, дискриминант 3.7.1, зависеть от дискриминанта 3.7.1, задача 9, задачный тип 9.2, именуемый тип 3.7, индексируемый тип 3.6, исключение 11, личный тип 7.4, неограниченная переменная 3.2.1, неограниченный индексируемый тип 3.6, неограниченный тип с дискриминантами 3.7.1, обозначение типа 3.3.2, объект 3.2, ограничение 3.3, оператор вызова входа 9.5, оператор
вызова подпрограммы 6.4, ошибочный 1.6, переменная 3.2.1, подкомпонента 3.3, присваивание 5.2, скалярный тип 3.5, спецификация параметра 6.1, ссылочное значение
null
3.8, ссылочный тип 3.8, тело подпрограммы 6.3, фактический параметр 6.4.1, формальный параметр 6.1, формальный параметр настройки 12.1.
Пред. | Уровень выше | След. |
Глава 6. ПОДПРОГРАММЫ |
Содержание | 6.3. ТЕЛА ПОДПРОГРАММ |
Внешние файлы и файловые объекты
Значения, вводимые из внешнего для программы окружения или выводимые в это окружение, размещаются во
внешних файлах.
Внешним файлом может быть нечто внешнее по отношению к программе, которая может произвести читаемое значение или получить записываемое. Внешний файл идентифицируется строкой
{именем).
Вторая строка
(форма)
задает дополнительные системно-зависимые характеристики, которые могут быть сопоставлены с файлом, например физическая организация или права доступа. Соглашения об интерпретации таких строк должны быть приведены в приложении F.
Операции ввода и вывода выражены операциями над объектами некоторого
файлового типа, а
не непосредственно в терминах внешних файлов. Далее в этой главе термин
файл
будет всегда использоваться для ссылки на объект файлового типа; в остальных случаях будет использоваться термин
внешний файл.
Значения, передаваемые данному файлу, должны быть все одного и того же типа.
Ввод и вывод для последовательных файлов из элементов некоторого типа определены настраиваемым пакетом SEQUENTIAL_IO. Общая структура этого пакета дана ниже.
with IO_EXCEPTIONS; generic
type ELEMENT_TYPE is private;
package SEQUENTIAL_IO is
type FILE_TYPE is limited private;
type FILE_MODE is (IN_FILE, OUT_FILE); ... procedure OPEN (FILE : in out FILE_TYPE; ...); ... procedure READ (FILE : in FILE_TYPE; ITEM : out ELEMENT_TYPE); procedure WRITE (FILE : in FILE_TYPE; ITEM : in ELEMENT_TYPE); ... end SEQUENTIAL_IO;
Для определения последовательного ввода-вывода элементов данного типа должна быть описана конкретизация этого настраиваемого модуля с фактическим параметром данного типа. Конкретизация настройки содержит описание файлового типа (названного FILE_TYPE) для файлов таких элементов, а также операции над этими файлами — например, процедуры OPEN, READ и WRITE.
Ввод-вывод для файлов прямого доступа определен аналогичным способом в настраиваемом пакете DIRECT_IO. Ввод-вывод в текстовой форме определен в (ненастраиваемом) пакете TEXT_IO.
До выполнения ввода или вывода как операции над файлом должна быть установлена связь файла с внешним файлом. Когда такая связь установлена, файл называется
открытым, в
противном случае —
закрытым.
В языке не определено, что происходит с внешними файлами после завершения работы главной программы (в частности, если соответствующие файлы не были закрыты). Результат выполнения ввода-вывода над ссылочными типами зависит от реализации.
Открытый файл имеет
текущий вид,
который является значением одного из перечисленных типов: ,,
type FILE_MODE is (IN_FILE, INOUT_FILE, OUT_FILE); -— ДЛЯ DIRECT_IO type FILE_MODE is (IN_FILE, OUT.FILE); -— ДЛЯ SEQUENTIAL_IO И TEXT_IO
Эти значения соответствуют случаям, когда можно осуществить либо только чтение, либо чтение и запись, либо только запись. Вид файла может быть изменен.
Некоторые из операций управления файлами являются общими для всех трех пакетов ввода-вывода. Эти операции над последовательными файлами и файлами прямого доступа описаны в разд. 14.2.1. Дополнительные особенности ввода-вывода текстов описаны в разд. 14.3.1.
В пакете IO_EXCEPTIONS определены все исключения, которые могут быть возбуждены при вызове подпрограммы ввода-вывода; ситуации их возбуждения описаны либо при описании подпрограмм ввода и вывода (и в разд. 14.4), либо в приложении F для ошибочных ситуаций, зависящих от реализации.
Примечание.
Каждая конкретизация настраиваемых пакетов SEQUENTIAL_IO и DIRECT_IO задает разные типы FILE_TYPE; уникальным является тип FILE_TYPE в пакете TEXT_IO.
Устройство с двусторонней связью часто может быть промоделировано двумя файлами с последовательным доступом, связанными с этим устройством; один — вида IN_FILE, а другой — вида OUT_FILE. Реализация может ограничить число файлов, которые могут быть связаны с данным внешним файлом. В этом случае результат такого разделения внешнего файла несколькими объектами файлового типа зависит от реализации.
Ссылки:
вид файла 14.2.3, индекс 14.2, исключение 11, конкретизация настройки 12.3, открытый файл 14.1, пакет DIRECT_IO 14.1, 14.2, пакет EXCEPTIONS 14.5, пакет SEQUENTIAL_IO 14.2, 14.2.2, пакет TEXT_IO 14.3, перечислимый тип 3.5.1, последовательный ввод-вывод 14.2.2, последовательный доступ 14.2, процедура CREATE 14.2.1, процедура DELETE 14.2.1, процедура OPEN 14.2.1, процедура READ 14.2.4, процедура WRITE 14.2.4, процедура для файлов прямого доступа 14.2, прямой доступ 14.2, строка 3.6.3, текущий индекс 14.2, текущий размер 14, файл ' последовательного доступа 14.2.
Пред. | Уровень выше | След. |
13.10. НЕКОНТРОЛИРУЕМОЕ ПРОГРАММИРОВАНИЕ |
Содержание | 14.2. ФАЙЛЫ ПОСЛЕДОВАТЕЛЬНОГО И ПРЯМОГО ДОСТУПА |
Вставки машинных кодов
Машинные коды могут быть включены в программу с помощью вызова процедуры, последовательность операторов которой состоит из операторов кода.
оператор-кода ::= обозначение-типа'агрегат-записи;
Оператор кода допустим только в последовательности операторов тела процедуры. Если в теле процедуры содержатся операторы кода, то в нем недопустимы никакие формы операторов, кроме операторов кода (помеченных или нет); из описаний допустимы только спецификаторы использования; недопустимы обработчики исключения (комментарии и прагмы допустимы как обычно).
Каждая машинная команда записывается как агрегат именуемого типа, агрегат определяет эту команду. Базовый тип обозначения типа в операторе кода должен быть описан в предопределенном пакете MACHINE_CODE; этот пакет должен быть упомянут в спецификаторе контекста, помещаемом для компилируемого модуля, в который входит оператор кода. Реализация не обязана обеспечивать такой пакет.
В реализации допустимо наложение дополнительных ограничений на допустимые в операторах кода агрегаты записи. Например, можно требовать, чтобы выражения в агрегатах были статическими.
Реализация может определить машинно-зависимые прагмы, специфицирующие соглашения об использовании регистров и вызовов. Такие прагмы должны быть описаны в приложении F.
Пример:
М : MASK; procedure SET_MASK; pragma INLINE(SET_MASK);
procedure SET_MASK is
use MACHINE_CODE; begin
SI_FORMAT'(CODE => SSM, В => M'BASE_REG, D => M'DISP); -- M'BASE_REG and M'DISP —это заданные реализацией предопределенные атрибуты end;
Ссылки:
агрегат именуемого типа 4.3.1, библиотечный модуль 10.1, допустим 1.6, именуемый тип 3.7, комментарий 2.7, компилируемый модуль 10.1, обработчик исключения 11.2, оператор 5, пакет 7, помеченный оператор 5.1, последовательность операторов 5.1, прагма 2.8, прагма INLINE 6.3.2, применим 10.1.1, процедура 6.6.1, спецификатор использования 8.4, спецификатор совместности 10.1.1, статическое выражение 4.9, тело процедуры 6.3, элемент описания 3.9.
Пред. | Уровень выше | След. | |
13.7. СИСТЕМНЫЙ ПАКЕТ
|
Содержание |
13.9. СВЯЗЬ С ДРУГИМИ ЯЗЫКАМИ |
Ввод-вывод низкого уровня
Операция ввода-вывода низкого уровня — это операция, выполняющаяся на физическом устройстве. Для выполнения таких операций используется одна из (совмещенных) предопределенных процедур 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. Эти тела процедур могут быть записаны операторами кода.
Пред. | Уровень выше | След. | |
14.5. СПЕЦИФИКАЦИЯ ПАКЕТА ИСКЛЮЧЕНИЙ ВВОДА-ВЫВОДА
|
Содержание |
14.7. ПРИМЕР ВВОДА-ВЫВОДА |
Ввод-вывод текстов
В этом разделе описывается пакет TEXT_IO, который обеспечивает возможности ввода и вывода в удобной для читателя форме. Каждый файл читается или записывается последовательно посимвольно, символы последовательно группируются в строчки, последовательность строчек — в страницы. В разд. 14.3.10 приведена спецификация этого пакета.
Возможности управления файлами, описанные в разд. 14.2.1 и 14.2.2, применимы и для текстового ввода-вывода. Однако вместо процедур READ и WRITE используются процедуры GET и PUT, которые осуществляют ввод и вывод значений соответствующих типов для текстовых файлов. Эти значения передаются процедурами PUT и возвращаются процедурами GET через параметр ITEM. Существует несколько совмещенных процедур с такими именами, но с
различными типами параметра ITEM. Процедуры GET анализируют вводимые последовательности символов как лексемы (см. гл. 2) и возвращают соответствующие значения; процедуры PUT выводят данные значения в виде соответствующих лексем. Процедуры GET и PUT могут также вводить и выводить отдельные символы, рассматриваемые не как лексемы, а как значения символьного типа.
Для числового и перечислимого типов параметра ITEM помимо процедур PUT и GET, записывающих в текстовой файл или читающих из него, существуют аналогичные процедуры с параметром типа STRING. Эти процедуры производят точно такие же анализ и формирование последовательности символов, как и подобные им процедуры с файловым параметром.
Для всех процедур GET и PUT, оперирующих над текстовыми файлами, а также для многих других подпрограмм существуют формы как с параметром файлового типа, так и без него. Каждая процедура GET оперирует над файлом ввода; каждая процедура PUT — над файлом вывода. Если файл не задан, то работа производится над файлом ввода по умолчанию или над файлом вывода по умолчанию.
В начале выполнения программы файлами ввода и вывода по умолчанию являются так называемые стандартный файл ввода и стандартный файл вывода. Эти файлы всегда открыты и имеют текущие виды IN_FILE и OUT_FILE соответственно, они связаны с двумя определяемыми реализацией внешними файлами.
Существуют процедуры для замены текущего файла ввода по умолчанию и текущего файла вывода по умолчанию.
Логически текстовой файл представляет собой последовательность страниц, страница — последовательность строчек, а строчка — последовательность символов; конец строчки помечается
признаком конца строчки;
конец страницы помечается комбинацией
признака конца строчки,
за которым непосредственно следует
признак конца страницы;
конец файла помечается комбинацией следующих непосредственно друг за другом признака конца строчки, признака конца страницы и
признака конца файла.
Признаки конца генерируются во время вывода; либо при вызове специально предусмотренных для этого процедур, либо неявно — как составная часть других операций, например когда для файла заданы ограничения длины строчки, длины страницы или оба этих ограничения.
Язык не определяет, что фактически представляют из себя признаки конца; это зависит от реализации, хотя некоторые из описанных ниже процедур могут опознавать или сами генерировать признаки конца, которые не обязаны всегда быть реализованы именно как символы или последовательности символов. Пользователю безразлично, представлены ли в данной конкретной реализации признаки конца как символы (и если да, то какие именно), так как он никогда явно не вводит и явно не выводит управляющие символы. Язык не определяет результата ввода или вывода управляющих символов (кроме символа горизонтальной табуляции).
Символы строчки пронумерованы начиная с единицы; номер символа называется номером
столбца.
Для признака конца строчки также определен номер столбца; его значение на единицу больше числа символов в строчке. Строчки страницы и страницы файла пронумерованы аналогично.
Текущий номер столбца —
это номер следующего (передаваемого) символа или признака конца строчки.
Текущий номер строчки —
это номер текущей строчки в текущей странице.
Текущий номер страницы —
это номер текущей страницы в файле.
Все эти номера являются значениями подтипа POSITIVE_COUNT типа COUNT (нулевое значение типа COUNT по соглашению используется для специальных целей).
type COUNT is range 0.. определяется-реализацией; subtype POSITIVE_COUNT is COUNT range 1 .. COUNT'LAST;
Для файла вывода могут быть заданы
максимальная длина строчки
и
максимальная длина страницы.
Если они заданы, а значение не помещается на текущей строчке, то автоматически до вывода значения будет начата новая строчка; если далее эта новая строчка не может быть размещена на текущей странице, то автоматически до вывода будет начата новая страница. Имеются функции для определения максимальной длины строчки и максимальной длины страницы. После открытия файла вида OUT_FILE оба этих значения равны нулю; это значит, что длина страницы и длина строчки считаются неограниченными. (Следовательно, весь файл вывода состоит из одной строчки, если только не используются подпрограммы явного управления структурой строчек и страниц файла.) Для этих целей служит константа UNBOUNDED.
Ссылки:
вид OUT_FILE 14.1, вид IN_FILE 14.1, внешний файл 14.1, последовательный доступ 14.1, процедура GET 14.3.5, процедура PUT 14.3.5, стандартный файл ввода 14.3.2, стандартный файл вывода 14.3.2, текущий файл по умолчанию 14.3.2, тип COUNT 14.3.10, файл 14.1, читать 14.2.2.
14.3.1. УПРАВЛЕНИЕ ФАЙЛАМИ
Для текстовых файлов допустимы только виды IN_FILE и OUT_FILE. К ним также применимы приведенные в разд. 14.2.1 подпрограммы управления внешними файлами и приведенная в разд. 14.2.2 функция END-OF_FILE для последовательного ввода-вывода. Имеется также вариант функции END-OF_FILE, который выдает результат для текущего файла ввода по умолчанию. Указанные процедуры для текстовых файлов характеризуются следующим:
•Процедуры CREATE и OPEN: после открытия файла вида OUT_FILE длина страницы и длина строчки не ограничены (имеют по соглашению значение 0). После открытия файла вида IN_FILE или OUT_FILE текущие номера столбца, строчки и страницы устанавливаются равными единице.
• Процедура CLOSE: если файл имеет текущий вид OUT_FILE, а текущая страница еще не завершена, то результат эквивалентен вызову подпрограммы NEW-PAGE; затем выводится признак конца файла.
•Процедура RESET: если файл имеет текущий вид OUT_FILE, а текущая страница еще не завершена, то результат эквивалентен вызову подпрограммы NEW-PAGE; затем выводится признак конца файла. Если новый вид файла — OUT_FILE, то длина строчки и длина страницы становятся неограниченными. Для всех видов файла текущие номера столбца, строчки и страницы устанавливаются равными единице.
При попытке изменить вид текущего файла ввода по умолчанию или текущего файла вывода по умолчанию процедура RESET возбуждает исключение MODE_ERROR.
Ссылки:
вид файла 14.1, вид IN_FILE 14.1, вид OUT_FILE 14.1, внешний файл 14.1, длина страницы 14.3, длина строчки 14.3, исключение MODE_ERROR 14.4, признак конца файла 14.3, процедура CREATE 14.2.1, процедура OPEN 14.2.1, процедура RESET 14.2.1, текущий номер столбца 14.3, текущий номер страницы 14.3, текущий номер строчки 14.3, текущий файл ввода по умолчанию 14.3, файл 14.1, функция END-OF_FILE 14.2.4, 14.3.
14.3.2. ФАЙЛЫ ВВОДА И ВЫВОДА ПО УМОЛЧАНИЮ
Следующие подпрограммы служат для управления файлами по умолчанию, используемыми при отсутствии параметра-файла в процедурах PUT, GET или в других описанных ниже операциях текстового ввода-вывода.
procedure SET_INPUT(FILE : in FILE.TYPE);
Оперирует над файлом вида IN_FILE. Устанавливает текущим файлом ввода по умолчанию файл, заданный параметром FILE.
Если данный файл не открыт, то возбуждается исключение STATUS_ERROR. Если вид данного файла отличен от IN_FILE, то возбуждается исключение MODE_ERROR.
procedure SET_OUTPUT(FILE : in FILE_TYPE);
Оперирует над файлом вида OUT_FILE. Устанавливает текущим файлом вывода по умолчанию файл, заданный параметром FILE.
Если данный файл не открыт, то возбуждается исключение STATUS_ERROR. Если вид данного файла отличен от OUT_FILE, то возбуждается исключение MODE_ERROR.
function STANDARD_INPUT return FILE_TYPE;
Возвращает стандартный файл ввода (см. 14.3).
function STANDARD_OUTPUT return FILE_7YPE;
Возвращает стандартный файл вывода (см. 14.3).
function CURRENT_INPUT return FILE_TYPE;
Возвращает текущий файл ввода по умолчанию.
function CURRENT_OUTPUT return FILE_TYPE;
Возвращает текущий файл вывода по умолчанию.
Примечание.
Стандартные файлы ввода и вывода не могут быть открыты, закрыты, переустановлены и уничтожены, потому что в соответствующих процедурах параметр FILE имеет вид
In out.
Ссылки:
исключение MODE_ERROR 14.4, исключение STATUS_ERROR 14.4, процедура GET 14.3.5, процедура PUT 14.3.5, текущий файл по умолчанию 14.3, тип FILE_TYPE 14.1, файл по умолчанию 14.3.
14.3.3. СПЕЦИФИКАЦИИ ДЛИН СТРОЧЕК И СТРАНИЦ
Описанные в этом разделе подпрограммы связаны со структурой строчек и страниц файла вида OUT_FILE. Они оперируют либо над файлом, заданным первым параметром, либо при отсутствии такого параметра над текущим файлом вывода по умолчанию. Эти подпрограммы служат для вывода текста с заданными максимальными длинами строчки или страницы. В этих случаях признаки конца строчки и страницы выводятся неявно и автоматически, по мере необходимости. Когда длины строчки и страницы не ограничены (т.е. когда они имеют по соглашению значение нуль), как в случае заново открытого файла, новые строчки или страницы можно начать лишь в результате явного вызова соответствующих подпрограмм.
Во всех случаях, если заданный файл не открыт, то возбуждается исключение STATUS_ERROR; если вид этого файла отличен от OUT_FILE, то возбуждается исключение MODE_ERROR.
procedure SET_LINE_LENGTH(FILE : in FILE_TYPE; TO : in COUNT); procedure SET_LINE_LENGTH(TO : in COUNT);
Устанавливает максимальную длину строчки заданного файла вывода равной числу символов, задаваемому значением параметра ТО. Нулевое значение параметра ТО задает неограниченную длину строчки.
Если заданное значение длины строчки не подходит для связанного с ней внешнего файла, то возбуждается исключение USE_ERROR.
procedure SET_PAGE_LENGTH <FILE : in FILE.7YPE; TO : in COUNT); procedure SET_PAGE_LENGTH (TO : in COUNT);
Устанавливает максимальную длину страницы заданного файла вывода равной числу строчек, задаваемому значением параметра ТО. Нулевое значение параметра ТО задает неограниченную длину страницы.
Если данное значение длины страницы не подходит для связанного с данным внешним файлом, то возбуждается исключение USE_ERROR.
function LINE_LENGTH(FILE : in FILE_TYPE) return COUNT; function LINE_LENGTH return COUNT;
Возвращает максимальную длину строчки, установленную для заданного файла вывода, или нуль, если длина строчки не ограничена.
function PAGE_LENGTH(FILE : in FILE_JYPE) return COUNT; function PAGE_LENGTH return COUNT;
Возвращает максимальную длину страницы, установленную для данного файла, или нуль, если длина страницы не ограничена.
Ссылки:
вид OUT_FILE 14.4.1, внешний файл 14.1, длина страницы 14.3, длина строчки 14.3, исключение MODE_ERROR 14.4, исключение STATUS_ERROR 14.4, исключение USE_ERROR 14.4, максимальная длина страницы 14.3, максимальная длина строчки 14.3, неограниченная длина страницы 14.3, открытый файл 14.1, признак конца строчки 14.3, страница 14.3, строчка 14.3, текущий файл вывода по умолчанию 14.3, тип COUNT 14.3, тип FILE_TYPE 14.1, файл 14.1.
14.3.4. ОПЕРАЦИИ НАД СТОЛБЦАМИ, СТРОЧКАМИ И СТРАНИЦАМИ
Описанные в этом разделе подпрограммы предназначены для явного управления структурой строчек и страниц файла; они оперируют либо над файлом, заданным первым параметром, либо при отсутствии такого параметра-файла над текущим файлом (ввода или вывода) по умолчанию. Если используемый в этих подпрограммах файл не открыт, то возбуждается исключение STATUS_ERROR.
procedure SKIP_LINE(FILE : in FILE_TYPE; SPACING : in POSITIVE_COUNT := 1); procedure SKIP_LINE(SPACING : in POSITIVE_COUNT := 1);
Оперирует над файлом вида OUT_FILE.
Если SPACING равно единице, то выводит признак конца строчки, а текущий номер столбца устанавливается равным единице.
Затем увеличивает текущий номер строчки на единицу, кроме случая, когда текущий номер строчки уже был равен или превышал максимальную длину страницы; в этом случае сначала выводит признак конца страницы, затем увеличивает текущий номер страницы на единицу, а текущий номер строчки устанавливает равным единице.
Если SPACING больше единицы, то указанные действия повторяются SPACING раз.
Если вид файла не OUT_FILE, то возбуждается исключение MODE_ERROR.
procedure NEW_LINE(FILE : in FILE_TYPE; SPACING : in POSITIVE_COUNT := 1); procedure NEW_LINE(SPACING : in POSITIVE_COUNT := 1);
Оперирует над файлом вида IN_FILE.
Если SPACING равен единице, то считывает из файла и пропускает (игнорирует) все символы до признака конца строчки, а текущий номер столбца устанавливает равным единице. Если непосредственно за признаком конца строчки не следует признак конца страницы, то увеличивает текущий номер строчки на единицу. В противном случае, когда за признаком конца строчки непосредственно следует признак конца страницы, пропускает признак конца страницы, увеличивает текущий номер страницы на единицу, а текущий номер строчки устанавливает равным единице.
Если SPACING больше единицы, указанные действия повторяются SPACING раз.
Если вид файла не IN_FILE, то возбуждается исключение MODE_ERROR. При попытке прочитать признак конца файла возбуждается исключение END_ERROR.
function END_OF_LINE(FILE : in FILE_TYPE) return BOOLEAN; function END_OF_LINE return BOOLEAN;
Оперирует над файлом вида IN_FILE. Возвращает значение TRUE, если текущий элемент файла — это признак конца строчки или признак конца файла; в противном случае возвращает значение FALSE.
Если вид файла не IN_FILE, то возбуждается исключение MODE_ERROR.
procedure NEW_PAGE(FILE : in FILE_TYPE); procedure NEW_PAGE;
Оперирует над файлом вида OUT_FILE. Если текущая строчка не завершена или текущая страница пустая (т.е. текущие номера строчки или столбца оба равны единице), то выводит признак конца строчки.
Затем выводит признак конца страницы, который завершает текущую страницу. Увеличивает номер текущей страницы на единицу, а текущие номера столбца и строчки устанавливает равными единице.
Если вид файла не OUT_FILE, то возбуждается исключение MODE_ERROR.
procedure SKIP_PAGE(FILE: in FILE_TYPE); procedure SKIP_PAGE;
Оперирует над файлами вида IN_FILE. Из файла читает и пропускает (игнорирует) все символы и признаки конца строчки, концая признаком конца страницы. Увеличивает текущий номер страницы на единицу, текущие номера столбца и строчки устанавливает равными единице.
Если вид файла не IN_FILE, то возбуждается исключение MODE_ERROR. При попытке прочитать признак конца файла возбуждается исключение END_ERROR.
function END_OF_PAGE(FILE : in FILE_TYPE) return BOOLEAN; function END_OF_PAGE return BOOLEAN;
Оперирует над файлом вида IN_FILE. Возвращает значение TRUE, если очередными элементами файла является последовательность из признаков конца строчки и страницы или если очередным элементов является признак конца файла; в противном случае возвращает значение FALSE.
Если вид файла отличен от IN_FILE, то возбуждается исключение MODE_ERROR.
function END_OF_FILE(FILE : in FILE_TYPE) return BOOLEAN; function END_OP_FILE return BOOLEAN;
Оперирует над файлом вида IN_FILE. Возвращает значение TRUE, если очередным элементом файла является признак конца файла или последовательность из признаков конца
строчки, страницы и файла; в противном случае возвращает значение FALSE.
Если вид файла отличен от IN_FILE, то возбуждается исключение MODE_ERROR. Следующие подпрограммы предназначены для управления текущей позицией чтения или
записи в файл. Во всех этих подпрограммах в качестве файла по умолчанию используется
текущий файл вывода.
procedure SET_COL(FILE : in FILE_TYPE; TO : in POSITIVE_COUNT); procedure SET_COL(TO : in POSITIVE_COUNT);
Для файла вида OUT_FILE:
Если значение параметра ТО больше текущего номера столбца, то выводит пробелы, причем после вывода каждого пробела увеличивает текущий номер столбца на единицу.
Это повторяется до тех пор, пока текущий номер столбца не станет равным значению параметра ТО. Если значение параметра ТО было равно текущему номеру столбца, то никаких действий не производит. Если значение параметра ТО меньше текущего номера столбца, то сначала выполняет действия, эквивалентные вызову процедуры NEW_LINE( SPACING = 1), затем выводит (ТО — 1) пробелов и текущий номер столбца устанавливает равным значению параметра ТО.
Если при ограниченной длине строчки (т.е. LINE_LENGTH для этого файла имеет ненулевое значение) значение параметра ТО оказалось больше LINE-LENGTH, то возбуждается исключение LAYOUT_ERROR.
Для файла вида IN_FILE:
Читает и пропускает (игнорирует) отдельные символы, признаки конца строчки и страницы до тех пор, пока номер столбца очередного, подлежащего чтению символа не станет равным значению параметра ТО. Если текущий номер столбца с самого начала равен этому значению, то никаких действий не производит. При передаче каждого символа или признака конца должным образом корректирует текущие номера столбца, строчки и страницы, как при работе процедуры GET (см. 14.3.5). (Короткие строчки будут пропущены целиком, пока не встретится строчка, содержащая символ в указанной позиции от начала строчки.)
При попытке чтения признака конца файла возбуждается исключение END_ERROR.
procedure SET_LINE(FILE : in FILE_TYPE; TO : in POSITIVE_COUNT); procedure SET_LINE(TO : in POSITIVE_COUNT);
Для файла вида OUT_FILE:
Если значение параметра ТО больше текущего номера строчки, то эта процедура эквивалентна повторным вызовам NEW_LINE (SPACING = 1) до тех пор, пока текущий номер строчки не станет равным значению параметра ТО. Если значение параметра ТО было равно текущему номеру строчки, то никаких действий не производит. Если значение параметра ТО меньше текущего номера строчки, то эта процедура эквивалентна вызову NEW-PAGE, за которым следует вызов NEW_LINE с параметром SPACING, равным (ТО — 1).
Если при ограниченной длине страницы (т.е.
PAGE- LENGTH для этого файла имеет ненулевое значение) значение параметра ТО оказалось больше PAGE-LENGTH, то возбуждается исключение LAYOUT_ERROR.
Для файла вида IN_FILE:
Результат эквивалентен повторным вызовам процедуры SKIP_LINE (SPACING = 1) до тех пор, пока текущий номер строчки не примет значение параметра ТО. Если текущий номер строчки с самого начала был равен значению параметра ТО, то никаких действий не производит. (Короткие страницы будут пропущены целиком, пока не встретится страница, содержащая строчку в указанной позиции от начала страницы.)
При попытке чтения признака конца файла возбуждается исключение END_ERROR.
function COL(FILE : in FILE_TYPE) return POSITIVE_COUNT; function COL return POSITIVE_COUNT;
Возвращает текущий номер столбца. Если этот номер больше значения COUNT'LAST, это возбуждается исключение
LAYOUT_ERROR.
function LINE(FILE : in FILE_TYPE) return POSITIVE_COUNT; function LINE return POSITIVE_COUNT;
Возвращает текущий номер строчки.
Если этот номер больше значения COUNT'LAST, то возбуждается исключение LAYOUT_ERROR.
function PAGE(FILE : in FILE_TYPE) return POSITIVE_COUNT; function PAGE return POSITIVE_COUNT;
Возвращает текущий номер страницы.
Если этот номер больше значения COUNT'LAST, то возбуждается исключение LAYOUT_ERROR.
Номера столбца, строчки или страницы, вообще говоря, могут превысить значение COUNT'LAST (в результате ввода или вывода достаточно большого числа символов, строчек или страниц). При этом никакое исключение не возбуждается. Однако при вызове функции COL, LINE или PAGE если соответствующий номер оказался больше COUNT'LAST, то возбуждается исключение LAYOUT_ERROR.
Примечание.
Признак конца страницы пропускается, если пропускается предшествующий ему признак конца строчки. Реализация может представить последовательность из таких двух признаков конца одним символом при условии, что он будет распознаваться при вводе.
Ссыпки:
вид IN_FILE 14.1, длина страницы 14.3, исключение END_ERROR 14.4, исключение LAYOUT_ERROR 14.4, исключение MODE_ERROR 14.4, исключение STATUS_ERROR 14.4, максимальная длина страницы 14.3, номер строчки 14.3, открытый файл 14.1, признак конца страницы 14.3, признак конца строчки 14.3, признак конца файла 14.3, процедура GET 14.3.5, страница 14.3, строчка 14.3, текущий номер столбца 14.3, текущий номер страницы 14.3, текущий номер строчки 14.3, текущий файл по умолчанию 14.3, тип POSITIVE_COUNT 14.3, файл 14.1.
14.3.5. ПРОЦЕДУРЫ ОБМЕНА
В разд. 14.3.5—14.3.10 описаны процедуры GET и PUT для элементов типов CHARACTER, STRING, числового и перечислимого. В данном разделе описаны возможности этих процедур, общие для большинства таких типов. Процедуры GET и PUT для элементов типов CHARACTER и STRING передают отдельные символьные значения, а для числовых и перечислимых типов передают лексемы.
Первым параметром всех процедур GET и PUT является файл. Если он опущен, то подразумевается, что используется текущий файл (ввода или вывода) по умолчанию. Каждая процедура GET оперирует над файлом вида IN_FILE. Каждая процедура PUT оперирует над файлом вида OUT_FILE.
Все процедуры GET и PUT меняют для заданного файла текущие номера столбца, строчки и страницы: каждая передача символа увеличивает на единицу текущий номер столбца. Каждый вывод признака конца строчки устанавливает текущий номер столбца равным единице и добавляет единицу к текущему номеру строчки. Каждый вывод признака конца страницы устанавливает текущие номера столбца и строчки равными единице и добавляет единицу к текущему номеру страницы. При вводе каждый пропуск признака конца строчки устанавливает текущий номер столбца равным единице и добавляет единицу к текущему номеру строчки;
каждый пропуск признака конца страницы устанавливает текущие номера столбца и строчки равными единице и добавляет единицу к текущему номеру страницы. Аналогичным образом определяется семантика процедур GET_LINE, PUT_LINE и SET-COL
Некоторые процедуры GET и PUT для числовых и перечислимых типов имеют параметры, задающие
формат;
он указывает длины полей; эти параметры принадлежат неотрицательному подтипу FIELD типа INTEGER.
Ввод-вывод значений перечислимых типов использует синтаксис соответствующих лексем. Любая процедура GET для перечислимого типа сначала пропускает все ведущие пропуски или признаки концов строчки и страницы;
пропуск —
это символ пробела или символ горизонтальной табуляции. Затем символы вводятся до тех пор, пока введенная последовательность является началом лексемы, соответствующей -идентификатору или символьному литералу (в частности, ввод прекращается при достижении признака конца строчки).
Символ или признак конца строчки, вызвавшие прекращение ввода, остаются доступными для следующего ввода.
Процедуры GET для числовых типов имеют параметр WIDTH, задающий формат. Если он имеет нулевое значение, то процедура GET выполняется так же, как для перечислимых типов,
но вместо синтаксиса литералов перечисления используется синтаксис числовых литералов. При ненулевом значении параметра WIDTH вводится ровно WIDTH символов или, если ранее встретился признак конца строчки, все символы до признака конца строчки; в это число включаются и все ведущие пропуски. Для числовых литералов используется расширенный синтаксис, в котором допускается знак числа (но не пропуски или признаки конца строчки или страницы внутри литерала).
Любая процедура PUT для элемента числового или перечислимого типа выводит значение элемента соответственно как числовой литерал, идентификатор или символьный литерал. Перед ними могут быть выведены пробелы, если этого требуют параметры формата WIDTH или FORE (это описано ниже), и для отрицательных значений — знак минус; в случае перечислимого типа пробелы выводятся не перед литералом, а после него. Если формат в процедуре PUT задает недостаточную ширину, то он игнорируется.
Следующие две ситуации могут возникнуть при выполнении процедуры PUT для числового или перечислимого типа в случае ограниченной длины строчки используемого файла вывода (т.е. длина строчки имеет ненулевое значение). Если число выводимых символов не превышает максимальной длины строчки, но при выводе этих символов, начиная с текущего столбца, они не помещаются в текущей строчке, то перед их выводом выполняются действия, эквивалентные вызову NEW_LINE с параметром SPACING, равным единице. Если же число выводимых символов больше максимальной длины строчки, то возбуждается исключение LAYOUT_ERROR, при этом символы не выводятся.
Если используемый в процедурах GET, GET_LINE, PUT и PUT_LINE файл не открыт, то возбуждается исключение STATUS_ERROR. Если в процедурах GET и GET_LINE вид используемого файла отличен от IN_LINE или в процедурах PUT и PUT_LINE вид используемого файла отличен от OUT_FILE, то возбуждается исключение MODE_ERROR.
В процедуре GET при попытке пропуска признака конца файла возбуждается исключение END_ERROR. Если вся введенная процедурой GET последовательность символов не является лексемой соответствующего типа, то возбуждается исключение DATA_ERROR; в частности, оно возбуждается, если не было введено ни одного символа; для числового типа если был введен знак, то это правило относится к следующему за ним числовому литералу. В случае процедуры PUT, выводящей элемент типа STRING, если длина строки файла недостаточна для вывода заданного элемента, то возбуждается исключение LAYOUT_ERROR.
Примеры:
В примерах этого раздела и в разд. 14.3.7 и 14.3.8 кавычки и строчная буква Ь не вводятся и не выводятся; они даны только для того, чтобы показать расположение и пробелы.
N : INTEGER; ... GET(N);
-— символы на входе | вводимая последовательность | значение N |
bb-12535Ь | -12535 | -12535 |
bb12_535Е1Ь | 12_535Е1 | 125350 |
bb12_535Е; | 12535Е | (нет) DATA_ERROR Возбуждено |
Пример игнорирования параметра ширины:
PUT(ITEM => -23, WIDTH => 2); -- "-23"
Ссылки-
вид 14.1, вид файла IN_FILE 14.1, вид файла OUT_FILE 14.1, исключение DATA_ERROR 14.4, исключение END_ERROR 14.4, исключение LAYOUT_ERROR 14.4, исключение MODE_ERROR 14.4, исключение STATUS_ERROR 14.4, максимальная длина строчки 14.3, номер столбца 14.3, номер страницы 14.3, номер строчки 14.3, параметр FORE 14.3.8, параметр WIDTH 143.5, 14.3.7, 14,3.9, признак конца страницы 14.1, признак конца строчки 14.1, пропуск 14.3.9, просмотреть 14.3.7, 14.3.8, 14.3.9, процедура GET 14.3.6, 14.3.7, 14.3.8, 14.3.9, процедура NEW_LINE 14.3.4, процедура PUT 14.3.6, 14.3.7, 14.3.8, 14.3.9, текущий файл по умолчанию 14.3, файл 14.1.
14.3.6. ВВОД-ВЫВОД СИМВОЛОВ И СТРОК
Для элемента типа CHARACTER определены следующие процедуры:
procedure GET(FILE : in FILE_TYPE; ITEM : out CHARACTER); procedure GET(ITEM : out CHARACTER);
В заданном файле ввода процедуры пропускают признаки конца строчки и страницы и читают следующий за ними символ; значение этого символа возвращают параметру ITEM вида
out.
При попытке пропустить признак конца файла возбуждается исключение END_ERROR.
procedure PUT(FILE : in FILE_TYPE; ITEM : in CHARACTER); procedure PUT(ITEM : in CHARACTER);
Если длина строчки заданного файла вывода ограничена (т. е. не равна нулю по соглашению), а текущий номер столбца превышает эту длину, то выполняют действия, эквивалентные вызову процедуры NEW_LINE с параметром SPACING, равным единице. Затем в любом случае в файл выводят заданный символ.
Для элемента типа STRING определены следующие процедуры:
procedure GET(FILE : In FILE_TYPE; ITEM : out STRING); procedure GET(ITEM : out STRING);
Определяют длину (число символов) данной строки; затем для последовательных символов строки соответствующее число раз выполняют операцию GET (в частности, для пустой строки никаких действий не выполняют).
procedure PUT(FILE : in FILE_TYPE; ITEM : in STRING); procedure PUT(ITEM : in STRING);
Определяют длину (число символов) данной строки; затем для последовательных символов строки соответствующее число раз выполняют операцию PUT (в частности, для пустой строки никаких действий не выполняют).
procedure GET_LINE(FILE : in FILE_TYPE; ITEM : out STRING; LAST : out NATURAL); procedure GET_LINE(ITEM : out STRING; LAST : out NATURAL);
Заменяют последовательные символы, содержащиеся в указанной строке, символами, читаемыми из заданного файла. Чтение заканчивается при достижении конца строчки файла;
в этом случае выполняют действия, эквивалентные действиям процедуры SKIP_LINE с
пара-
метром SPACING, равным единице. Чтение также заканчивается при достижении конца строки, заданной параметром ITEM. Символы, которые не были заменены, остаются неопределенными.
Если символы прочитаны, то в параметр LAST возвращается индекс последнего замененного символа так, что индексированная компонента ITEM (LAST) — это значение последнего замененного символа (индекс первого замененного символа равен атрибуту ITEM'FIRST). Если не было прочитано ни одного символа, то в LAST выдается значение индекса, на единицу меньшее атрибута ITEM'FIRST.
При попытке пропустить признак конца файла возбуждается исключение END_ERROR.
procedure PUT_LINE(FILE : in FILE.TYPE; ITEM : in STRING); procedure PUT_LINE(ITEM : in STRING);
Вызывают процедуру PUT для заданной строки, затем процедуру NEW_LINE с параметром SPACING, равным единице.
Примечание.
Внешние кавычки строкового литерала, являющегося параметром процедуры PUT, не выводятся. Каждый сдвоенный символ кавычки, приведенный внутри такого литерала, выводится как один символ кавычки; это следует из правил для строковых литералов (см. 2.6).
Строка, считываемая процедурой GET или записываемая процедурой PUT, в файле может занимать несколько строчек.
Ссылки:
длина строки 14.3, длина строчки 14.3, 14.3.5, исключение END_ERROR 14.4, признак конца страницы 14.3, процедура GET 14.3.5, процедура NEW_LINE 14.3.4, процедура PUT 14.3.4, строчка 14.3, текущий номер столбца 14.3, файл 14.1.
14.3.7. ВВОД-ВЫВОД ДЛЯ ЦЕЛЫХ ТИПОВ
Описанные ниже процедуры определены в настраиваемом пакете INTEGER_IO. Он должен быть конкретизован с соответствующим целым типом (указанным в спецификации параметром настройки NUM).
Значения выводятся в виде десятичных литералов или литералов с основанием, без подчеркиваний и порядка, с предшествующим знаком минус для отрицательных чисел. Формат, определяющий ширину поля (включая ведущие пробелы и знак минус), может быть задан необязательным параметром WIDTH. Его значение принадлежит неотрицательному целому подтипу FIELD. Значения основания принадлежат целому подтипу NUMBER-BASE.
subtype NUMBER_BASE is INTEGER range 2 .. 16;
В процедурах вывода могут использоваться ширина поля и основание по умолчанию; они задаются переменными, описанными в настраиваемом пакете INTEGER_IO:
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);
При нулевом значении параметра WIDTH пропускают все ведущие пропуски, признаки конца строчки и страницы, читают знак плюс или минус (если он есть), затем производят чтение в соответствии с синтаксисом целого литерала (он может быть литералом с основанием).
При нулевом значении WIDTH вводят ровно WIDTH символов, или если раньше встретится признак конца строки, то вводят лишь символы до этого признака конца (возможно, ни одного); в это количество включаются и все ведущие пропуски.
В параметр ITEM типа NUM возвращают значение, соответствующее введенной последовательности.
Если введенная последовательность не соответствует правилам синтаксиса или если полученное значение не принадлежит подтипу NUM, то возбуждается исключение DATA_ERROR.
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);
Значение параметра ITEM выводят в виде целого литерала без подчеркиваний, порядка и ведущих нулей (если значение равно нулю, выводят один нуль), с предшествующим знаком минус, если значение отрицательное.
Если число символов выводимой последовательности меньше значения WIDTH, то она дополняется ведущими пробелами.
Если параметр BASE (заданный явно указанным значением или переменной DEFAULT_BASE) имеет значение десять, то числа выводятся по синтаксису десятичного литерала, в противном случае — по синтаксису литерала с основанием и всеми прописными буквами.
procedure GET(FROM : in STRING; ITEM : out NUM; LAST : out POSITIVE);
Читает с начала строки, заданной параметром FROM, целое значение по тем же правилам, что и процедура GET, которая читает целое значение из файла; при этом рассматривает конец строки как признак конца файла. Через параметр ITEM возвращает значение типа NUM, соответствующее введенной последовательности. Через параметр LAST возвращает значение индекса, соответствующее последнему читаемому символу (следовательно, этот символ имеет значение индексированной компоненты FROM(LAST)).
Если введенная последовательность не соответствует правилам синтаксиса или если полученное значение не принадлежит подтипу NUM, то возбуждается исключение DATA_ERROR.
procedure PUT(TO : out STRING; ITEM : in NUM; BASE : in NUMBER_BASE := DEFAULT_BASE);
Через параметр ТО выводит значение параметра ITEM по тем же правилам, что и при выводе в файл; в качестве значения параметра WIDTH используется длина указанной строки.
Примеры:
package INT_IO is new INTEGER_IO(SMALUNT); use INT_IO; -— в результате конкретизации -— получается формат по умолчанию: —— DEFAULT_WIDTH = 4, DEFAULT_BASE = 10
PUT(126); -- "b126" PUT(-126, 7); -- "ЬЬЬ-126" PUT(126, WIDTH => 13, BASE => 2); -- "bbb2#1111110#"
Ссылки:
десятичный литерал 2.4.1, исключение DATA_ERROR 14.4, исключение LAYOUT_ERROR 14.4, литерал с основанием 2.4.2, пакет INTEGER_IO 14.3.10, параметр WIDTH 14.3.5, подтип FIELD 14.3.5, признак конца строчки 14.3, пропуск 14.3.5, просмотреть 14.3.5, процедура GET 14.3.5, процедура PUT 14.3.5, тип FILE_TYPE 14.1, целый литерал 2.4.
14.3.8. ВВОД-ВЫВОД ДЛЯ ВЕЩЕСТВЕННЫХ ТИПОВ
Следующие процедуры определены в настраиваемых пакетах FLOAT_IO и FIXED_IO, которые должны быть конкретизованы с соответствующим плавающим или фиксированным типом (указанным в спецификации параметром NUM).
Значения выводятся как десятичные литералы без подчеркиваний. Формат каждого выводимого значения состоит из поля FORE, десятичной точки, поля AFT, а также (при ненулевом значении параметра ЕХР) буквы Е и поля ЕХР. Таким образом, возможны два формата:
FORE . AFT и FORE . AFT E ЕХР
без всяких пробелов между этими полями. Поле FORE может включать предшествующие пробелы и знак минус для отрицательных значений. Поле AFT состоит из одних лишь десятичных цифр (оно может оканчиваться нулями). Поле ЕХР состоит из знака (плюс или минус) и порядка (возможно, с предшествующими нулями).
Для плавающих типов длины этих полей по умолчанию определены переменными, описанными в пакете FLOAT_IO:
DEFAULT_FORE : FIELD := 2; DEFAULT_APT : FIELD := NUM'DIGITS-1; DEFAULT_EXP : FIELD := 3;
Для фиксированных типов длины по умолчанию для этих полей задаются переменными, описанными в пакете FIXED_IO:
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);
При нулевом значении параметра WIDTH опускают все ведущие пропуски, признак конца строчки или признак конца страницы, читают знак плюс или минус (если он есть); затем производят чтение в соответствии с синтаксисом вещественного литерала (он может быть литералом с основанием). При ненулевом значении параметра WIDTH вводят или ровно WIDTH символов, или, если раньше встретился признак конца строчки, лишь символы, читаемые до этого признака конца (возможно, ни одного символа); в это количество включаются и все предшествующие пропуски.
Через параметр ITEM возвращают значение типа NUM, соответствующее введенной последовательности.
Если введенная последовательность не удовлетворяет требованиям синтаксиса или если полученное значение не принадлежит подтипу NUM, то возбуждается исключение DATA_ERROR.
procedure PUT(FILE : in FILE_TYPE; ITEM : in NUM; FORE : in FIELD := DEFAULT_FORE; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP);
procedure PUT(ITEM : in NUM; FORE : in FIELD := DEFAULT_FORE; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP);
Выводят значение параметра ITEM в виде десятичного литерала в формате, определяемом параметрами FORE, AFT и ЕХР. Если значение ITEM отрицательное, то в целую часть включен знак минус. При нулевом значении параметра ЕХР целая часть представляется таким количеством цифр, которое требуется для представления целой части значения ITEM. При необходимости значение FORE игнорируется. Если в значении ITEM нет целой части, то целая часть представляется цифрой 0.
Если значение ЕХР больше нуля, то целая часть представляется одной цифрой, отличной от нуля, за исключением случая, когда значение ITEM равно 0.0.
В обоих случаях, если целая часть, включая знак минус, содержит менее FORE символов, она дополняется до этого количества ведущими нулями.
Дробная часть состоит из AFT цифр или при AFT, равном нулю, из одной цифры. Значение округляется; остаток, равный половине последнего разряда, может быть округлен как с избытком, так и с недостатком.
При нулевом значении ЕХР число выводится без порядка. Если ЕХР больше нуля, то при . выводе порядка выводится столько цифр, сколько необходимо для представления порядка значения ITEM (для представления целой части этого значения используется один символ);
первым символом является знак плюс или минус. Если для представления порядка, включая знак, используется менее ЕХР символов, то это представление дополняется до требуемого количества символов ведущими нулями. Для значения ITEM, равного 0.0, порядок равен нулю.
procedure GET(FROM : in STRING; ITEM : out NUM; LAST : out POSITIVE);
Читает с начала строки, заданной параметром FROM, вещественное значение по тем же правилам, что и процедура GET, читающая вещественное значение из файла; при этом конец строки рассматривается как признак конца файла. Через параметр ITEM возвращает значение типа NUM, соответствующее введенной последовательности. Через параметр LAST возвращает значение индекса, соответствующее последнему читаемому символу (следовательно, этот символ имеет значение индексируемой компоненты FROM (LAST)).
Если введенная последовательность не соответствует правилам синтаксиса или если полученное значение не принадлежит подтипу NUM, то возбуждает исключение DATA_ERROR.
procedure PUT(TO : out STRING; ITEM : in NUM; AFT : in FIELD := DEFAULT_AFT; EXP : in INTEGER := DEFAULT_EXP);
Через параметр ТО выводит значение параметра ITEM по тем же правилам, что и при выводе в файл; при этом в качестве FORE использует такое значение, чтобы общее число выводимых символов, включая предшествующие пробелы, соответствовало длине строки параметра ТО.
Примеры:
package REAL_IO is new FLOAT_IO(REAL); use REAL_IO; -- в "результате конкретизации -- получается формат по умолчанию: DEFAULTEXP = 3 X : REAL :=-123.4567; -— 8 цифр (СМ. 3.5.7)
PUT(X); --формат по умолчанию "-1.2345670Е+02" PUT(X, FORE => 5, AFT => 3, ЕХР => 2); -- "ЬЬЬ-1.235Е+2" PUT(X, 5, 3, 0); -- "Ь-123.457"
Примечание.
Если положительное число, выводимое процедурой PUT в строку, заполняет строку целиком, без использования ведущих пробелов, то при выводе такого же отрицательного числа будет возбуждено исключение LAYOUT_ERROR.
Ссылки:
атрибут AFT 3.5.10, атрибут FORE 3.5.10, вещественный литерал 2.4, десятичный литерал 2.4.1, признак конца строчки 14.3.5, исключение DATA_ERROR 14.4, исключение LAYOUT_ERROR 14.4, литерал с основанием 2.4.2, пакет FIXED_IO 14.3.10, пакет FLOAT_IO 14.3.10, параметр WIDTH 14.3.5, подтип FIELD 14.3.5, пропуск 14.3.5, просмотреть 14.3.5, процедура GET 14.3.5, процедура PUT 14.3.5, тип FILE_TYPE 14.1.
14.3.9. ВВОД-ВЫВОД ДЛЯ ПЕРЕЧИСЛИМЫХ ТИПОВ
Описанные ниже процедуры определены в настраиваемом пакете ENUMERATION_IO, который должен быть конкретизован с соответствующим перечислимым типом (указанным в спецификации параметром настройки ENUM).
При выводе значений для представления идентификаторов используются либо строчные, либо прописные буквы. Это задается параметром SET, который принадлежит перечислимому типу TYPE-SET:
type TYPE_SET is (LOWER_CASE, UPPER_CASE);
Формат (в который включаются и заключительные пробелы) может быть задан необязательным параметром ширины поля. Ширина поля по умолчанию и представление букв задаются описанными в настраиваемом пакете ENUMERATION_IO переменными:
DEFAULT_WIDTH : FIELD := 0; DEFAULT_SETTING : TYPE_SET := UPPER_CASE;
Определены следующие процедуры:
procedure GET(FILE : in FILE_TYPE; ITEM : out ENUM); procedure GET(ITEM : out ENUM);
После игнорирования предшествующих пропусков, признака конца строчки и признака конца страницы читают или идентификатор (строчные и прописные буквы считаются эквивалентными), или символьный литерал (включая апострофы); чтение производится в соответствии с синтаксисом соответствующих лексем.
Через параметр ITEM возвращают значение, соответствующее введенной последовательности.
Если введенная последовательность не удовлетворяет правилам синтаксиса или если идентификатор или символьный литерал не соответствуют никакому значению подтипа ENUM, то возбуждается исключение DATA_ERROR.
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);
Выводят значение параметра ITEM как литерал перечисления (либо идентификатор, либо символьный литерал). Необязательный параметр SET указывает, какие буквы — строчные или прописные — следует использовать для представления идентификаторов (для символьных литералов он игнорируется). Если число выводимых символов меньше значения параметра WIDTH, то после них выводятся пробелы, дополняющие число символов до WIDTH.
procedure GET(FROM : in STRING; ITEM : out ENUM; LAST : out POSITIVE);
Читает с начала строки, заданной параметром FROM, значение перечислимого типа по тем же правилам, что и процедура GET, читающая значение перечислимого типа из файла;
при этом конец строки рассматривается как признак конца файла. Через параметр ITEM возвращает значение типа ENUM, соответствующее введенной последовательности. Через параметр LAST возвращает значение индекса, соответствующее последнему читаемому символу (следовательно, этот символ имеет значение индексируемой компоненты FROM (LAST)).
Если введенная последовательность не соответствует правилам синтаксиса или если идентификатор или символьный литерал не соответствуют никакому значению подтипа ENUM, то возбуждает исключение DATA_ERROR.
procedure PUT(TO : out STRING; ITEM : in ENUM; SET : in TYPE_SET := DEFAULT_SETTING);
Выводит в строку, заданную параметром ТО, значение параметра ITEM по тем же правилам, что и при выводе в файл; в качестве значения параметра WIDTH используется длина указанной строки.
Хотя спецификация пакета ENUMERATION_IO допускает конкретизацию с соответствующим целым типом, это не является целью данного пакета; язык не определяет результата такой конкретизации.
Примечание.
Процедуры PUT для символов и для перечислимых значений имеют определенные различия:
TEXT_IO.PUT('A'); -— выводит символ А
package CHAR_IO is new TEXT_IO.ENUMERATION_IO(CHARACTER); CHAR_IO.PUT('A'); -— выводит символ 'А', заключенный в одинарные кавычки
Тип BOOLEAN является перечислимым типом, поэтому пакет ENUMERATION_IO может быть настроен на этот тип.
Ссылки:
исключение DATA_ERROR 14.4, пакет ENUMERATION_IO 14.3.10, параметр WIDTH 14.3.5, подтип FIELD 14.3.5, признак конца строчки 14.3.5, пропуск 14.3.5, просмотреть 14.3.5, процедура GET 14.3.5, процедура PUT 14.3.5, тип FILE_TYPE 14.1.
14.3.10. СПЕЦИФИКАЦИЯ ПАКЕТА ВВОДА-ВЫВОДА ТЕКСТА
with IO_EXCEPTIONS; package TEXT_IO is
type FILE_TYPE is limited private;
type FILE_MODE is (IN_FILE, OUT_FILE);
type COUNT is range 0 .. определяется_реапизацией; subtype POSITIVE_COUNT is COUNT range 1 .. COUNT'LAST; UNBOUNDED : constant COUNT := 0; -- длина строчки и страницы
subtype FIELD is INTEGER range 0 .. определяется_реапизацией; subtype NUMBER_BASE is INTEGER range 2 .. 16;
type TYPE_SET is (LOWER_CASE, UPPER_CASE);
-- управление файлами
procedure CREATE (FILE : in out FILE_TYPE; MODE : in FILE_MODE := OUT_FILE; NAME : in STRING := ""; FORM : in STRING := "");
procedure OPEN (FILE : in out FILE_TYPE; MODE : in FILE_MODE; NAME : in STRING; FORM : in STRING := "");
procedure CLOSE (FILE : in out FILE_TYPE); procedure DELETE (FILE : in out FILE_TYPE); procedure RESET (FILE : in out FILE_TYPE; MODE : in FILE_MODE); procedure RESET (FILE : in out FILE_TYPE);
function MODE (FILE : in FILE_TYPE) return FILE_MODE; function NAME (FILE : in FILE_TYPE) return STRING; function FORM (FILE : in FILE_TYPE) return STRING;
function IS_OPEN(FILE : in FILE_TYPE) return BOOLEAN;
-- управление файлами ввода и вывода по умолчанию
procedure SET_INPUT (FILE : in FILE_TYPE); procedure SET_OUTPUT(FILE : in FILE_TYPE);
function STANDARD_INPUT return FILE_TYPE; function STANDARD_OUTPUT return FILE_TYPE;
function CURRENT_INPUT return FILE_TYPE; function CURRENT_OUTPUT return FILE_TYPE;
-- спецификация длин строчки и страницы
procedure SET_LINE_LENGTH(FILE : in FILE_TYPE; TO : in COUNT); procedure SET_LINE_LENGTH(TO : in COUNT);
procedure SET_PAGE_LENGTH(FILE : in FILE_TYPE; TO : in COUNT); procedure SET_PAGE_LENGTH(TO : in COUNT);
function LINE_LENGTH(FILE : in FILE_TYPE) return COUNT; function LINE_LENGTH return COUNT;
function PAGE_LENGTH(FILE : in FILE_TYPE) return COUNT; function PAGE_LENGTH return COUNT;
-- управление колонкой, строчкой и страницей
procedure NEW_LINE (FILE : in FILE_TYPE; SPACING : in POSITIVE_COUNT := 1); procedure NEW_LINE (SPACING : in POSITIVE_COUNT := 1);
procedure SKIP_LINE (FILE : in FILE_TYPE; SPACING : in POSITIVE_COUNT := 1); procedure SKIP_LINE (SPACING : in POSITIVE_COUNT := 1);
function END_OF_LINE(FILE : in FILE_TYPE) return BOOLEAN; function END_OF_LINE return BOOLEAN;
procedure NEW_PAGE (FILE : in FILE_TYPE); procedure NEW_PAGE;
procedure SKIP_PAGE (FILE : in FILE_TYPE); procedure SKIP_PAGE;
function END_OF_PAGE(FILE : in FILE_TYPE) return BOOLEAN; function END_OF_PAGE return BOOLEAN;
function END_OF_FILE(FILE : in FILE_TYPE) return BOOLEAN; function END_OF_FILE 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_IO 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 := 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 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 : in 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
DEFAULT_WIDTH : FIELD := 0; DEFAULT_SETTING : TYPE_SET := UPPER_CASE;
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 IO_EXCEPTIONS.DATA_ERROR; LAYOUT_ERROR : exception renames IO_EXCEPTIONS.LAYOUT_ERROR;
private
-- определяется реализацией end TEXT_IO;
Пред. | Уровень выше | След. |
14.2. ФАЙЛЫ ПОСЛЕДОВАТЕЛЬНОГО И ПРЯМОГО ДОСТУПА |
Содержание | 14.4. ИСКЛЮЧЕНИЯ ПРИ ВВОДЕ-ВЫВОДЕ |
Выполнение и активизация задачи
Тело задачи определяет выполнение всякой задачи, которая указывается задачным объектом соответствующего задачного типа. Начальный этап этого выполнения называется
активизацией
задачного объекта и указанной им задачи; активизация состоит из предвыполнения раздела описаний (если он есть) тела задачи. Выполнение различных задач, в частности, их активизация, производится параллельно.
Если задачный объект описан непосредственно в разделе описаний, то активизация задачного объекта начинается после предвыполнения раздела описаний (т. е. после грамматического разбора зарезервированного слова
begin,
следующего за разделом описаний); аналогично если такое описание помещено непосредственно в спецификацию пакета, то активизация начинается после предвыполнения раздела описаний тела пакета. То же относится и к активизации задачного объекта, являющегося подкомпонентой объекта, описанной непосредственно в разделе описаний или спецификации пакета. Первый оператор, следующий за разделом описаний, выполняется только после окончания активизации задачных объектов.
Если при активизации одной из таких задач возбуждается исключение, то эта задача становится законченной (см. 9.4); на других задачах это прямо не отражается. Если во время активизации одна из этих задач становится законченной, то после завершения активизации (успешного или нет) всех задач возбуждается исключение TASKING_ERROR; исключение возбуждается непосредственно за разделом описаний перед выполнением первого оператора (непосредственно после зарезервированного слова
begin
). Исключение TASKING_ERROR возбуждается лишь однажды, даже если во время активизации сразу несколько задач становятся законченными таким способом.
Если исключение возбуждается при предвыполнении раздела описаний или спецификации пакета, то любая созданная (прямо или косвенно) этим предвыполнением задача, которая еще не активизирована, становится завершенной и, таким образом, она никогда не активизируется (см. разд. 9.4 с определением завершенной задачи).
Приведенные выше правила предполагают, что в теле пакета без операторов присутствует пустой оператор. Для пакета без тела подразумевается тело пакета с единственным пустым оператором. Если пакет без тела описывается непосредственно в некотором программном модуле или в операторе блока, то его тело подразумевается в конце раздела описаний программного модуля или оператора блока; при наличии нескольких пакетов без тела порядок следования подразумеваемых тел пакетов не определен.
Задачный, объект, являющийся объектом или подкомпонентой объекта, созданного выполнением генератора, активизируется этим выполнением. Активизация начинается после инициализации объекта, созданного генератором; если несколько подкомпонент являются задач-ными объектами, они активизируются параллельно. Ссылочное значение, указывающее этот объект, возвращается генератором только после проведения этих активизации.
Если исключение возбуждается при активизации одной из таких задач, то она становится законченной задачей; на другие задачи этот факт не оказывает прямого воздействия. Если во время своей активизации одна из задач становится законченной, то после проведения активизации (успешной или нет) всех этих задач возбуждается исключение TASKING_ERROR;
исключение возбуждается в той точке текста программы, где выполняется генератор. Исключение TASKING_ERROR возбуждается лишь однажды, даже если во время активизации сразу несколько задач становятся законченными таким образом.
Если исключение возбуждается во время инициализации объекта, созданного генератором (следовательно, до начала активизации), то любая задача, указанная подкомпонентой этого объекта, становится завершенной, и, таким образом, она никогда не активизируется.
Пример:
procedure P is
А, В : RESOURCE; -— предвыполняет заданные объекты А и В С : RESOURCE; -— предвыполняет задачный объект С begin
-— задачи А, В, С активизируются параллельно! перед выполнением первого оператора ... end;
Примечание.
Вход задачи может быть вызван до активизации задачи. Если несколько задач активизируются параллельно, выполнение любой из них не предполагает ожидания конца активизации других задач. Задача может стать законченной во время ее активизации как из-за исключения, так и из-за прекращения (см. 9.10).
Ссылки:
вход 9.5, генератор 4.8, завершение задачи 9.4, задачный объект 9.2, задачный тип 9.1, законченная задача 9.4, исключение 11, предвыполнение 3.9, 11.1, обработка исключения 11.4, оператор 5, параллельное выполнение 9, подкомпонента 3.3, раздел описаний 3.9, тело задачи 9.1, тело пакета 7.1.
Пред. | Уровень выше | След. |
9.2. ЗАДАННЫЕ ТИПЫ И ЗАДАЧНЫЕ ОБЪЕКТЫ |
Содержание | 9.4. ЗАВИСИМОСТЬ ЗАДАЧ. ЗАВЕРШЕНИЕ ЗАДАЧ |
Выражения
Выражение — это формула, которая определяет процесс вычисления значения.
выражение ::= отношение {and отношение} | отношение {and then отношение} | отношение {ог отношение} | отношение {or else отношение} | отношение {хог отношение}
отношение ::= простое-выражение [операция-отношения простое - выражение] | простое-выражение [not] in диапазон | простое-выражение [not] in обозначение-типа
простое - выражение :: = [унарная-аддитивная-операция] слагаемое {бинарная-аддитивная-операция слагаемое}
слагаемое ::= множитель {мультипликативная-операция множитель}
множитель ::= первичное [** первичное] | abs первичное | not первичное
первичное ::= числовой-литерал | null | агрегат | строковый-литерал | имя |генератор | вызов-функции | преобразование-типа | квалифицированное-выражение | (выражение)
Каждое первичное имеет значение и тип. Использование имен в качестве первичного допускается только для именованных чисел, атрибутов, которые вырабатывают значения, а также имен, обозначающих объекты (значением такого первичного является значение объекта) или обозначающих значения. Не допускается в качестве первичных использование имен формальных параметров вида
out,
а использование имен их подкомпонент допускается только в случае дискриминантов.
Тип выражения зависит только от типа его составных частей и применяемых операций; для совмещенных операндов или операций определение типа операнда или идентификация операции зависят от контекста. Для каждой предопределенной операции типы операндов и результата приведены в разд. 4.5.
Примеры первичных:
4.0 -- литерал вещественного типа PI -- именованное число (1..10 => 0) -- агрегат массива SUM -- переменная INTEGER'LAST -- атрибут SINE(X) -- вызов функции COLOR'(BLUE) -- квалифицированное выражение РЕАL(М*N) -- преобразование типа (LINE_COUNT+10) -- выражение в скобках
Примеры выражений:
VOLUME -- первичное not DISTROYED -- множитель 2 * LINE_COUNT -- слагаемое -4.0 -- простое выражение -4.0 + А -- простое выражение В ** 2-4.0 * А * С -- простое выражение PASSWORD(1..3) = "BWV" -- отношение COUNT in SMALL_INT -- отношение COUNT not in SMALL_INT -- отношение INDЕХ=0 ог IТЕМ_НIТ -- выражение (COLD and SUNNY) or WARM -- выражение (скобки обязательны) А ** (В ** С) -- выражение (скобки обязательны)
Ссылки:
агрегат 4.3, агрегат массива 4.3.2, атрибут 4.1.4, бинарная аддитивная операция 4.5, 4.5.3, вызов функции 6.4, генератор 4.8, диапазон 3.5, именованное число 3.2, имя 4.1, квалифицированное выражение 4.7, контекст для разрешения совмещения 8.7, литерал вещественного типа 2.4, мультипликативная операция 4.5, 4.5.5, обозначение типа 3.3.2, объект 3.2, операция 4.5, операция возведения в степень 4.5, 4.5.6, операция отношения 4.5, 4.5.2, отношение 4.5.1, переменная 3.2.1, преобразование типа 4.6, пустой литерал 3.8, совмещение 8.3, совмещение операций 6.7, строковый литерал 2.6, тип 3.2, тип результата 6.1, унарная аддитивная операция 4.5, 4.5.4, числовой литерал 2.4.
Пред. | Уровень выше | След. |
4.3. АГРЕГАТЫ |
Содержание | 4.5. ОПЕРАЦИИ И ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЯ |
Вызовы подпрограмм
Вызов подпрограммы — это либо оператор вызова процедуры, либо вызов функции; он вызывает выполнение соответствующего тела подпрограммы. Вызов определяет связь фактических параметров, если они есть, с формальными параметрами подпрограммы.
оператор-вызова-процедуры ::= имя-процедуры [раздел - фактических - параметров]; вызов функции ::= имя-функции [раздел - фактических - параметров]
раздел-фактических-параметров ::= (сопоставление-параметров {, сопоставление-параметров})
сопоставление - параметров ::= [формальный-параметр =>] фактический-параметр
формальный-параметр ::= простое-имя-параметра
фактический-параметр ::= выражение | имя-переменной
| обозначение-типа (имя-переменной)
Каждое сопоставление параметров связывает фактический параметр с соответствующим формальным параметром. Сопоставление параметров называется
именованным,
если формальный параметр указан явно, в противном случае оно называется
позиционным.
Для позиционного сопоставления фактический параметр соответствует формальному параметру в той же позиции раздела формальных параметров.
Именованные сопоставления могут быть даны в любом порядке, но если в одном и том же вызове использованы позиционные и именованные сопоставления, то позиционные сопоставления должны стоять первыми, на своих местах. Следовательно, после именованного сопоставления все остальные должны быть только именованными сопоставлениями.
Для каждого формального параметра подпрограммы вызов подпрограммы должен задавать точно один соответствующий фактический параметр. Этот фактический параметр определяется либо явно сопоставлением параметра, либо в отсутствие такого сопоставления выражением по умолчанию (см. 6.4.2).
Сопоставления параметров вызова подпрограммы вычисляются в некотором порядке, не определенном в языке. Аналогично правила языка не определяют, в каком порядке значения параметров вида
in out
или
out
копируются обратно в соответствующих фактических параметрах (если это делается).
Примеры вызовов процедур:
TRAVERSE_TREE; -— СМ. 6.1 TABLE_MANAGER.INSERT(E); -— 7.5 PRINT_HEADER(128, TITLE, TRUE); —- см. 6.1
SWITCH(FROM => X, TO => NEXT); -— CM. 6.1 PRINT_HEADER(128, HEADER => TITLE, CENTER => TRUE); -— CM. 6.1 PRINT_HEADER(HEADER => TITLE, CENTER => TRUE, PAGES => 128); -— CM. 6.1
Примеры вызовов функций:
DOTPRODUCT(U, V) -— см. 6.1 и 6.5 CLOCK —- см. 9.6
Ссылки:
выражение 4.4, выражение по умолчанию для формального параметра 6.1, имя 4.1, обозначение типа 3.3.2, ошибочный 1.6, переменная 3.2.1, подпрограмма 6, простое имя 4.1, раздел формальных параметров 6.1, формальный параметр 6.1.
6.4.1. СОПОСТАВЛЕНИЯ ПАРАМЕТРОВ
Тип каждого фактического параметра должен совпадать с типом соответствующего формального параметра.
Фактический параметр, сопоставляемый с формальным параметром вида
in,
должен быть выражением; оно вычисляется до вызова.
Фактический параметр, сопоставляемый с формальным параметром вида
in out
или
out,
должен быть либо именем переменной, либо иметь форму преобразования типа с аргументом^ являющимся именем переменной. В любом случае для параметра вида
in out
переменная не должна быть формальным параметром вида
out
или подкомпонентой такого параметра. Для фактического параметра, который имеет форму преобразования типа, обозначение типа должно быть согласовано (см. 6.3.1) с обозначением типа формального параметра; допустимый операнд и целевой тип такие же, как и для преобразования типа (см. 4.6).
Данное для фактического параметра вида
in out
или
out
имя переменной вычисляется до вызова. Если фактический параметр имеет форму преобразования типа, то перед вызовом для параметра вида
in out
переменная преобразуется к заданному типу; после (нормального) окончания тела подпрограммы формальные параметры вида
in out
или
out
преобразуются обратно в тип переменной. (Тип преобразования должен быть тем же, что и у формального параметра.)
Для параметров скалярного и ссылочного типов проверяются следующие ограничения:
• Перед вызовом для параметра вида
in
или
in out
проверяется принадлежность фактического параметра подтипу формального параметра.
• После (нормального) окончания тела подпрограммы для параметра вида
in out
или
out
проверяется принадлежность значения формального параметра подтипу фактического параметра. В случае преобразования типа значение формального параметра преобразуется обратно и проверяется результат преобразования.
В каждом из вышеуказанных случаев выполнение программы ошибочно, если проверяемое значение неопределено.
Для параметров других типов всех видов проверка осуществляется до вызова, как для скалярных и ссылочных типов; после возврата никаких проверок не делается.
Если результат хотя бы одной проверки отрицателен, то при вызове подпрограммы возбуждается исключение CONSTRAINT_ERROR.
Примечание.
Если обозначение типа формального параметра задает ограниченный подтип, то для индексируемых типов и типов с дискриминантами достаточно проверки перед вызовом (проверка после возврата была бы избыточной), так как ни границы массива, ни дискриминанты не могут быть изменены.
Если это обозначение типа задает неограниченный индексируемый тип, то формальный параметр ограничен границами соответствующего фактического параметра и никакой проверки не требуется (ни до вызова, ни после возврата, см. 3.6.1). Аналогично не требуется никакой проверки, если обозначение типа обозначает неограниченный тип с дискриминантами, так как формальный параметр ограничен точно так же, как соответствующий фактический параметр (см. 3.7.1).
Ссылки:
вид 6.1, вызов подпрограммы 6.4, выражение 4.4, вычисление 4.5, вычисление имени 4.1, граница массива 3.6, дискриминант 3.7.1, имя 4.1, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, неограниченный индексируемый тип 3.6, неограниченный тип с дискриминантами 3.7.1, неопределенное значение 3.2.1, обозначение типа 3.8.2, ограничение 3.3, ограниченный подтип 3.3, ошибочный 1.6, переменная 3.2.1, пбдтип 3.3, преобразование типа 4.6, согласованный 6.3.1, сопоставление параметров 6.4, тип 3.3, фактический параметр 6.4, формальный параметр 6.1.
6.4.2. ОПУЩЕННЫЕ ПАРАМЕТРЫ
Если спецификация параметра включает выражение по умолчанию для параметра вида
in,
то соответствующие вызовы подпрограммы не обязательно содержат сопоставления для такого параметра. Если в вызове сопоставление для таких параметров опускается, то оставшаяся часть вызова, следующая за начальными позиционными сопоставлениями, должна использовать только именованные сопоставления.
Для любого опущенного сопоставления параметров выражение по умолчанию вычисляется до вызова, а значение результата используется как неявный фактический параметр.
Примеры процедур со значениями по умолчанию:
procedure ACTIVATE) PROCESS : in PROCESSNAME; AFTER : in PROCESSNAME := NOPROCESS; WAIT : in DURATION := 0.0; PRIOR : in BOOLEAN := FALSE);
procedure PAIR(LEPT, RIGHT : PERSONNAME := new PERSON);
Примеры их вызовов:
ACTIVATE(X); ACTIVATE(X, AFTER => Y); ACTIVATE(X, WAIT => 60.0, PRIOR => TRUE); ACTIVATE(X, Y, 10.0, FALSE);
PAIR; PAIR(LEFT => new PERSON, RIGHT => new PERSON);
Примечание.
Если выражение по умолчанию используется для двух или более параметров в групповой спецификации параметров, то это выражение по умолчанию вычисляется один раз для каждого опущенного параметра. Поэтому в примере два вызова процедуры PAIR эквивалентны.
Ссылки:
вид 6.1, вызов подпрограммы 6.4, выражение по умолчанию для формального параметра 6.1, вычисление 4.5, именованное сопоставление параметров 6.4, позиционное сопоставление параметров 6.4, спецификация параметра 6.1, фактический параметр 6.1.
Пред. | Уровень выше | След. |
6.3. ТЕЛА ПОДПРОГРАММ |
Содержание | 6.5. ФУНКЦИИ |
Заданные типы и задачные объекты
Задачный тип является лимитируемым типом (см. 7.4.4). Следовательно, для объектов за-дачного типа не определены ни присваивание, ни предопределенное сравнение на равенство и неравенство; более того, вид
out
недопустим для формального параметра задачного типа.
Задачный объект —
это объект задачного типа. Значение задачного объекта указывает задачу с входами соответствующего задачного типа, а ее выполнение определено соответствующим телом задачи. Если задачный объект является объектом или подкомпонентой объекта, заданными описанием объекта, то его значение определяется предвыполнением описания объекта. Если задачный объект является объектом или подкомпонентой объекта, созданными при выполнении генератора, то его значение определяется выполнением генератора. Для всех видов параметров, если фактический параметр указывает задачу, сопоставляемый формальный параметр указывает ту же задачу; это же относится к подкомпоненте фактического параметра и к соответствующей подкомпбненте сопоставляемого формального параметра; наконец, то же справедливо и для параметров настройки.
Примеры:
CONTROL : RESOURCE; TELETYPE : KEYBOARDDRIVER; POOL : array(1 .. 10) of KEYBOARDDRIVER; -— см. также примеры описаний одиночных задач в 9.1
Пример ссылочного типа, указывающего задачный объект:
type KEYBOARD is access KEYBOARDDRIVER; TERMINAL : KEYBOARD := new KEYBOARDDRIVER;
Примечание.
Поскольку задачный тип является лимитируемым, он может появиться как определение лимитируемого личного типа в личном разделе и как фактический параметр настройки, сопоставляемый формальному параметру лимитируемого типа. С другой стороны, тип формального параметра настройки вида
in
не должен быть лимитируемым и, следовательно, не может быть задачным типом.
Задачные объекты ведут себя как константы (задачный объект всегда указывает одну и ту же задачу), поскольку их значения неявно определены при описании либо при генерации, либо при сопоставлении параметров, и никакие присваивания недопустимы.
Однако зарезервированное слово
constant
недопустимо в описании задачного объекта, так как его наличие требует явной инициализации. Задачный объект, который является формальным параметром вида
in,
есть константа (как и любой формальный параметр вида in).
Если алгоритм требует запоминания и переименования задачи, то это можно сделать определением ссылочного типа, указывающего на соответствующие задачные объекты, и использованием ссылочных значений для целей идентификации (см. предыдущий пример). Присваивание для такого ссылочного типа возможно, как и для любого другого ссылочного типа.
Для задачных типов допустимы описания подтипов, как и для других типов, но никакие ограничения к задачному типу неприменимы.
Ссылки:
вид формального параметра 6.2, вид формального параметра настройки 12.1.1, вход 9.5, генератор 4.8, зарезервированное слово 2.9, инициализация 3.2.1, константа 3.2.1, лимитируемый тип 7.4.4, личный раздел 7.2, личный тип 7.4, настраиваемый модуль 12, объект 3.2, ограничение 3.3, операция неравенства 4.5.2, операция равенства 4.5.2, описание компоненты 3.7, описание константы 3.2.1, подкомпонента 3.3, подпрограмма 6, предвыполнение 3.9, присваивание 5.2, сопоставление параметров 6.4, сопоставление параметров настройки 12.3;
составной тип 3.3, ссылочный тип 3.8, тело задачи 9.1, тип 3.3, указывать 3.8.9, фактический параметр 6.4.1, фактический параметр настройки 12.3, формальный параметр 6.2, формальный параметр настройки 12.1.1.
Пред. | Уровень выше | След. |
Глава 9. ЗАДАЧИ |
Содержание | 9.3. ВЫПОЛНЕНИЕ И АКТИВИЗАЦИЯ ЗАДАЧИ |
Зарезервированные слова
Перечисленные ниже идентификаторы называются
зарезервированными словами,
они зарезервированы в языке для специального назначения. Для удобства чтения этого руководства зарезервированные слова пишутся строчными буквами полужирным шрифтом (после тире указан перевод слова).
abort | — прекращение | loop | — цикл | ||||
abs | — abs | mod | — по-мод | ||||
accept | — принятие | new | — новый | ||||
access | — ссылка-на | not | — не | ||||
all | — все | null | — пусто | ||||
and | — и | of | — из | ||||
array | — массив | or | — или | ||||
at | — положение | others | — Другие | ||||
begin | — начало | out | — вых | ||||
body | — тело | package | — пакет | ||||
case | — выбор | pragma | — прагма | ||||
constant | — константа | private | — личный | ||||
declare | — описание | procedure | — процедура | ||||
delay | — задержка | raise | — возбуждение | ||||
delta | — дельта | range | — диапазон | ||||
digits | — цифр | record | — запись | ||||
do | — выполнение | rem | — остаток | ||||
else | — иначе | renames | — синоним | ||||
elsif | — инесли | return | — возврат | ||||
end | — конец | reverse | — в-обратном-порядке | ||||
entry | — вход | select | — отбор | ||||
exception | — исключение | separate | — отдельно | ||||
exit | — выход | subtype | — подтип | ||||
for | — для | task | — задача | ||||
function | — функция | terminate | — завершение | ||||
generic | — настройка | then | — то | ||||
goto | — переход-на | type | — тип | ||||
if | — если | use | — использование | ||||
in | — из | when | — когда | ||||
in | — вх | while | — пока | ||||
is | — есть | with | — совместно-с | ||||
limited | — лимитируемый | xor | — либо |
/p>
Зарезервированные слова не должны использоваться в качестве описываемого идентификатора.
Примечание.
Зарезервированные слова, отличающиеся только соответствующими строчными или прописными буквами, рассматриваются как одинаковые (см. 2.3). Идентификаторы некоторых атрибутов, стоящие после апострофа, совпадают с зарезервированными словами (DELTA, DIGITS и RANGE).
Ссылки:
атрибут 4.1.4, идентификатор 2.3, описание 3.1, прописная буква 2.1, строчная буква 2.1.
Пред. | Уровень выше | След. |
2.8. ПРАГМЫ | Содержание | 2.10. ДОПУСТИМЫЕ ЗАМЕНЫ СИМВОЛОВ |
Зависимость задач завершение задач
Каждая задача
зависит
по крайней мере от одного родителя.
Родитель —
это конструкция, являющаяся либо задачей, либо в данный момент выполняемым оператором блока или подпрограммой, либо библиотечным пакетом (но не описанным в другом программном модуле). Зависимость от родителя является непосредственной зависимостью в следующих двух случаях:
а) Задача, указанная задачным объектом, который является объектом или подкомпонен-той объекта, созданными при выполнении генератора, зависит от родителя, предвыполняюще-го соответствующее описание ссылочного типа.
б) Задача, указанная другим задачным объектом, зависит от родителя, выполнение которого создает задачный объект.
Более того, если задача зависит от данного родителя, являющегося оператором блока, выполняемым другим родителем, то задача также косвенно зависит и от этого родителя; тоже справедливо, если данный родитель является подпрограммой, вызванной другим родителем, а также если данный родитель — задача (прямо или косвенно), зависящая от другого родителя. Зависимости существуют и для объектов личного типа, полное описание которого задано в терминах задачного типа.
Говорят, что задача
закончила
свое выполнение, когда осуществилось выполнение последовательности операторов, помещенных в ее теле за зарезервированным словом
begin.
Аналогично говорят, что блок или подпрограмма закончили свое выполнение, когда осуществилось выполнение соответствующей последовательности операторов. В случае оператора блока также говорят, что выполнение его закончилось при достижении операторов выхода, возврата или перехода, передающих управление из блока. В случае процедуры также говорят, что ее выполнение закончилось при достижении соответствующего оператора возврата. В случае функции также говорят, что ее выполнение закончилось после вычисления результирующего выражения в операторе возврата. Наконец, выполнение задачи, оператора блока или подпрограммы закончено, если при выполнении содержащихся в них соответствующих последовательностей операторов возбуждено исключение и нет соответствующего ему обработчика, а при его наличии — по окончании выполнения соответствующего обработчика.
Если у задачи нет зависимых задач и закончено ее выполнение, имеет место ее
завершение.
После завершения задачи говорят, что она завершена. Если задача имеет зависимые задачи, то ее завершение имеет место после окончания выполнения задачи и завершения всех зависимых задач. Из оператора блока или тела подпрограммы, чье выполнение закончено, нельзя выйти до завершения всех зависимых задач.
С другой стороны, завершение задачи имеет место тогда и только тогда, когда ее выполнение достигло открытой альтернативы завершения в операторе отбора (см. 9.7.1) и удовлетворены следующие условия:
• Задача зависит от некоторого родителя, выполнение которого закончено (следовательно, не от библиотечного пакета).
• Каждая задача, зависящая от рассмотренного родителя, либо уже завершена, либо также ожидает открытой альтернативы завершения в операторе отбора.
Когда оба условия удовлетворены, задача становится завершенной вместе со всеми задачами, зависящими от этого же родителя.
Пример;
declare
type GLOBAL is access RESOURCE; --CM 91 А, В : RESOURCE; G : GLOBAL; begin
-— активизация А и В declare
type LOCAL is access RESOURCE; X : GLOBAL := new RESOURCE; -— активизация X.all L : LOCAL := new RESOURCE; — активизация L.all С : RESOURCE; begin
-— активизация С G := X; -- G и X указывают один и тот же задачный объект end: -— ожидание завершения С и L.all, но не X.all end; -- ожидание завершения А, В и G.all
Примечание.
Правила завершения подразумевают, что все задачи, зависящие (прямо или косвенно) от заданного родителя и еще не завершенные, могут завершиться (коллективно) тогда и только тогда, когда каждая из них ожидает открытой альтернативы завершения в операторе отбора и выполнение данного родителя закончено.
Те же правила справедливы и для главной программы. Следовательно, для завершения главной программы необходимо завершение всех зависимых задач, даже если соответствующий задачный тип описан в библиотечном пакете.
С другой стороны, завершение главной программы не зависит от завершения задач, в свою очередь зависящих от библиотечных пакетов;
в языке не определено, требуется ли завершение таких задач.
Для ссылочного типа, являющегося производным другого ссылочного типа, соответствующее определение ссылочного типа является определением родительского типа; зависимость в данном случае является зависимостью от родителя, который предвыполняет основные определения родительского ссылочного типа.
Описание переименования вводит новое имя для уже существующего понятия и, следовательно, не порождает дальнейшей зависимости.
Ссылки:
альтернатива завершения 9.7.1, библиотечный модуль 10.1, вызов подпрограммы 6.4, генератор 4.8, главная программа 10.1, задачный объект 9.2, исключение 11, обработчик исключения 11.2, объект 3.2, оператор 5, оператор блока 5.6, оператор возврата 5.8, оператор выхода 5.7, оператор перехода 5.9, описание 3.1, описание переименования 8.5, отбор с ожиданием 9.7.1, открытая альтернатива 9.7.1, пакет 7, подкомпонента 3.3, последовательность операторов 5.1, программный модуль 6, ссылочный тип 3.8, тело задачи 9.1, тело подпрограммы 6.3, указывать 9.1, функция 6.5.
Пред. | Уровень выше | След. |
9.3. ВЫПОЛНЕНИЕ И АКТИВИЗАЦИЯ ЗАДАЧИ |
Содержание | 9.5. ВХОДЫ, ВЫЗОВЫ ВХОДОВ И ОПЕРАТОРЫ ПРИНЯТИЯ |
Зона описания
Зона описания является частью текста программы. Единичная зона описания — это:
• Описание подпрограммы, описание пакета, описание задачи или описание настройки с соответствующим телом (если оно есть). Если это тело — след тела, то зона описания включает также соответствующий субмодуль. Если программный модуль содержит субмодули, то они также включаются в зону описания.
• Описание входа с соответствующими операторами принятия.
• Описание именуемого типа с соответствующими описанием личного типа или неполным описанием типа (если они есть) и спецификатором представления записи (если он есть).
• Описание переименования, содержащее раздел формальных параметров, или описание параметров настройки, включающее либо раздел формальных параметров, либо раздел дискриминантов.
•Оператор блока или оператор цикла.
В каждом из перечисленных выше случаев говорят, что зона описания
связана с
соответствующим описанием или оператором. Описание
находится непосредственно
в зоне описания, если она является самой вложенной охватывающей данное описание без учета зоны описания (если она есть), связанной с самим описанием.
Описание, которое находится непосредственно в зоне описания, является
локальным в
этой зоне. Говорят, что описания во внешних (охватывающих) зонах являются
глобальным по
отношению к внутренней (охватываемой) зоне описания. Локальные понятия — это те, которые описаны непосредственно локальными описаниями; глобальные понятия — это те, которые описаны посредством глобальных описаний.
Некоторые из упомянутых выше форм зон описания включают несколько разъединенных разделов (например, между описанием пакета и его телом могут быть помещены другие элементы описания). Тем не менее каждая зона описания рассматривается как непрерывная часть текста программы (логически). Следовательно, если какое-либо правило определяет часть текста,
расположенного
от некоторой выделенной точки зоны описания до конца зоны, то эта часть является соответствующим подмножеством данной зоны описания (в нее не включаются, например, промежуточные элементы описания, расположенные между двумя разделами пакета).
Примечание.
Как определено в разд. 3.1, в термин
описание
включаются основные описания, неявные описания и описания, являющиеся разделом основных описаний, например спецификации дискриминантов и параметров. Из определения зоны описания следует, что спецификация дискриминанта находится непосредственно в зоне, связанной с охватывающим описанием именуемого типа. Аналогично спецификация параметра находится непосредственно в зоне, связанной с телом охватывающей подпрограммы или с оператором принятия.
Пакет STANDARD образует зону описания, которая охватывает все библиотечные модули;
предполагается, что неявное описание каждого библиотечного модуля находится непосредственно в этом пакете (см. разд. 8.6 и 10.1.1).
Зоны описания могут быть вложены в другие зоны описания. Например, подпрограммы, пакеты, задачные модули, настраиваемые модули и операторы блока могут быть вложены друг в друга и содержать описания именуемого типа, оператор цикла, а также операторы принятия.
Ссылки:
библиотечный модуль 10.1, задачный модуль 9, именуемый тип 3.7, настраивав-1 мое тело 12.2, неполное oni-ср.ние типа 3.8.1, неявное описание 3.1, оператор блока 5.6, оператор принятия 9.5, оператор цикла 5.5, описание 3.1, описание входа 9.5, описание задачи 9.1, описание личного типа 7.4, описание настройки 12.1, описание пакета 7.1, описание параметров настройки 12.1, описание переименования 8.5, описание подпрограммы 6.1, основное описание 3.1, пакет 7, раздел дискриминантов 3.7.1, раздел формальных параметров 6.1, след тела 10.2, спецификатор представления записи 13.4, спецификация дискриминанта 3.7.1, спецификация параметра 6.1, стандартный пакет 8.6, субмодуль 10.2, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3.
Пред. | Уровень выше | След. |
7.6. ПРИМЕР ПАКЕТА ОБРАБОТКИ ТЕКСТОВ |
Содержание | 8.2. ОБЛАСТИ ДЕЙСТВИЯ ОПИСАНИЙ |