Функция или процедура может иметь формальные параметры. Каждый формальный параметр устанавливает имя и тип параметра. Имя является идентификатором, который должен быть уникальным в области видимости функции или процедуры. Формальный параметр процедуры может, кроме того, быть объявлен с ключевым словом VAR (изменяемый), которое означает, что если данный параметр изменяется внутри процедуры, то данное изменение должно быть передано в точку вызова процедуры. Параметры, не объявленные как VAR, также могут изменяться, но такое изменение не будет видимым после возврата управления вызвавшей структуре.
Синтаксис: |
Пример - Следующие объявления показывают, как могут быть объявлены формальные параметры.
FUNCTION dist(p1, p2 : point) : REAL;
…
PROCEDURE midpt(p1, p2 : point; VAR result : point);
Обобщенные типы данных (AGGREGATE, общий агрегированный тип данных, GENERIC и GENERIC_ENTITY) (см. 8.5) используются для того, чтобы обеспечить обобщение типов данных, используемых для представления формальных параметров функций и процедур. Тип данных AGGREGATE, общий агрегированный тип данных (см. 9.5.3.5) и родовой объектный тип данных (GENERIC_ENTITY) могут, кроме того, использоваться для объявления явных или вычисляемых атрибутов абстрактных объектных типов данных. Общий агрегированный тип данных может также использоваться, чтобы обеспечить обобщение базисных типов данных, разрешенное для конкретных агрегированных типов данных.
9.5.3.1 Тип данных AGGREGATE
Тип данных AGGREGATE является обобщением всех агрегированных типов данных.
При вызове процедуры или функции, формальный параметр которой определен типом данных AGGREGATE, передаваемый фактический параметр должен иметь тип данных ARRAY, BAG, LIST или SET. При этом операции, которые могут быть выполнены, должны зависеть от типа данных фактического параметра.
Примечание - Метки типов (см. 9.5.3.4) могут использоваться для обеспечения того, чтобы при вызове два или более параметров, представленных типом данных AGGREGATE, имели одинаковый тип данных, или чтобы тип данных возвращаемого результата был таким же, как и у одного из переданных параметров, независимо от переданных фактических типов данных.
Если явный или вычисляемый атрибут в объявлении типа данных ABSTRACT ENTITY представлен типом данных AGGREGATE, то данный атрибут должен быть объявлен в подтипах данного абстрактного объекта как ARRAY, BAG, LIST или SET.
Синтаксис: |
Правила и ограничения:
a) Тип данных AGGREGATE должен использоваться только в качестве типа формального параметра функции или процедуры, либо типа результата функции, либо типа локальной переменной внутри функции или процедуры, либо представления явного или вычисляемого атрибута в объявлении типа данных ABSTRACT ENTITY.
b) Если тип данных AGGREGATE используется в качестве типа данных результата функции или типа данных локальной переменной внутри функции или процедуры, то для такого применения требуются ссылки меток типов. Ссылки меток типов должны ссылаться на метки типов, объявленные формальными параметрами (см. 9.5.3.4).
c) Если тип данных AGGREGATE используется в качестве представления явного или вычисляемого атрибута в объявлении типа данных ABSTRACT ENTITY, то данный атрибут должен быть повторно объявлен как ARRAY, BAG, LIST или SET в неабстрактных подтипах данного объектного типа данных.
Пример - Данная функция получает агрегированную структуру чисел. Функция должна возвращать результат того же типа, что и у переданной ей агрегированной структуры, содержащий масштабированные числа.
FUNCTION scale (input : AGGREGATE : intype OF REAL; | ||||||||
scalar : REAL) : AGGREGATE : intype OF REAL; | ||||||||
LOCAL | ||||||||
result : AGGREGATE : intype OF REAL := input; | ||||||||
END_LOCAL; | ||||||||
IF SIZEOF ( [ 'BAG, 'SET' ] * TYPEOF(input)) > 0 THEN | ||||||||
REPEAT i := LOINDEX (input) TO HIINDEX (input); | ||||||||
result | := result - input[i]; | -- удалить исходный | ||||||
result | := result + scalar * input[i]; | -- вставить масштабированный | ||||||
END_REPEAT; | ||||||||
ELSE | ||||||||
REPEAT i := LOINDEX(input) TO HIINDEX(input); | ||||||||
result [I] := scalar*input[i]; | ||||||||
END_REPEAT; | ||||||||
END_IF | ||||||||
RETURN (result); | ||||||||
END_FUNCTION; |
9.5.3.2 Обобщенный тип данных
Тип данных GENERIC является обобщением всех других типов данных.
При вызове процедуры или функции с типом данных формального параметра GENERIC, передаваемый фактический параметр может не иметь тип данных GENERIC. Операции, которые при этом могут быть выполнены, зависят от типа данных фактического параметра.
Примечание - Метки типов (см. 9.5.3.4) могут быть использованы для обеспечения того, чтобы при вызове два или более параметров, представленных типом данных GENERIC, имели одинаковый тип данных, или чтобы тип данных возвращаемого результата был таким же, как и у одного из переданных параметров, независимо от переданных фактических типов данных.