Ада-95. Компилятор GNAT



         

Потоки ввода/вывода - часть 4


(В случае дискриминанта значение которого равно значению по умолчанию, дискриминант рассматривается как обычный компонент записи).

Это выполняется с помощью использования дополнительных атрибутов 'Input и 'Output.

Основная идея заключается в том, что атрибуты 'Input и 'Output

обрабатывают дополнительную информацию (если она есть) и затем вызывают 'Read и 'Write

для обработки остальных значений.

Их описание имеет следующий вид:

procedure T'Output(Stream : access Streams.Root_Stream_Type'Class; Item : in T);

function T'Input(Stream: access Streams.Root_Stream_Type'Class) return T;

Примечательно, что 'Input - это функция, поскольку T может быть неопределенным и нам могут быть не известны ограничения которые установлены для конкретного типа.

Таким образом, в случае массива процедура 'Output

выводит значения границ и, после этого, вызывает 'Write

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

В случае типа записи с дискриминантами, если запись имеет дискриминанты значения которых равны значениям по умолчанию, то 'Output

просто вызывает 'Write, которая трактует дискриминант как простой компонент записи.

Если значение дискриминанта не соответствует тому значению, которое указано как значение по умолчанию, то сначала 'Output

выводит дискриминанты записи, а затем вызывает 'Write

для обработки остальных компонентов записи.

В качестве примера, рассмотрим случай определенного подтипа, чей тип - это первый подтип, который не определен:

subtype String_6 is String(1 .. 6); S: String_6 := "String"; . . . String_6'Output(S); -- выводит значения границ и "String" String_6'Write(S); -- не выводит значения границ

Примечательно, что атрибуты 'Output и 'Write

принадлежат типам и, таким образом, не имеет значения или мы записываем String_6'Write, или String'Write.

Приведенное выше описание работы T'Input и T'Output

относится к атрибутам которые заданы по умолчанию.

Они могут быть переопределены для выполнения чего-либо другого, причем не обязятельно для вызова T'Read и T'Write.




Содержание  Назад  Вперед