Содержание
Открытые параметры
Открытые параметры — это массивы и строки неопределённой длины. Открытым параметром может стать только параметр–переменная. Возможность работать с открытыми параметрами в подпрограммах появилась в версии Turbo Pascal 7.0.
Открытые массивы
В параметр, который является открытым массивом, можно передавать как аргумент массив любой длины и размерности. Единственное ограничение: типы компонент у этих двух массивов должны совпадать.
В заголовке подпрограммы открытый параметр–массив описывается по следующему шаблону:
var <имя_параметра> : array of <тип_компонентов_массива>
Например, если описано
то аргументом могут стать такие массивы:
a2 : array[-10 .. 10] of Byte;
a3 : array[1 .. 2, 1 .. 3] of Byte;
Компоненты открытого параметра–массива нумеруются, начиная с нуля — этим достигается единообразие обращения к массивам переменной длины.
Если в качестве аргумента поступил многомерный массив, его компоненты «вытягиваются» в одну строку: сначала все компоненты первой строки массива, затем — второй строки и т. д. Например, если массив а3 имеет значения
1 2 3 4 5 6
то внутри процедуры proc6 параметр а будет иметь уже следующий вид:
1 2 3 4 5 6
причём, компоненты двух массивов будут соотноситься так:
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] |
a3[1, 1] | a3[1, 2] | a3[1, 3] | a3[2, 1] | a3[2, 2] | a3[2, 3] |
Открытые строки
Поскольку строки — это массивы символов, то они тоже могут стать открытыми параметрами. Описывается это следующим образом:
var <имя_параметра> : String
Например:
Длина такого параметра будет автоматически скорректирована в соответствии с длиной строки–аргумента.
Процедурный тип данных
Имена подпрограмм могут выступать в роли аргументов для других подпрограмм.
Описание
В разделе type процедурный тип данных задаётся одним из следующих способов:
<имя_типа> = function[(<список_параметров>)]:<тип_результата>;
или
<имя_типа> = procedure[(<список_параметров>)];
Например:
Аргументы
Аргументами, которые можно передать в параметр процедурного типа, могут быть только подпрограммы первого уровня вложенности, чьё объявление полностью соответствует этому типу. Кроме того, объявления подпрограмм, которые могут стать аргументами, необходимо снабдить ключевым словом far, означающим, что программа будет использовать не только основной сегмент данных.
Например, для параметра, имеющего описанный выше тип func, аргументами могут послужить такие функции:
begin
if a > b then
min := b
else
min := a
end;
и
begin
if a < b then
max := b
else
max := a
end;
Вызов
Приведём пример подпрограммы, имеющей параметр процедурного типа:
var c : Integer;
begin
{...}
c := f(i, j);
{...}
end;
Теперь, если будет осуществлён вызов count(x, y, min), то в локальную переменную с запишется минимум из x и y. Если же вызвана будет count(x, y, max), то в локальную переменную с запишется максимум из x и y.