Формальный параметр, описанный с помощью синтаксиса:
array of T
является открытым параметром-массивом. T должно быть идентифика-
тором типа, а фактический параметр должен быть переменной типа T,
или массивом, типом элементов которого является T. В процедуре
или функции формальный параметр ведет себя так, как если бы он
был описан следующим образом:
arra[0..N - 1] of T
где N - число элементов в фактическом параметре. По существу,
диапазон индекса фактического параметра отображается в диапазон
целых чисел от 0 до N - 1. Если фактический параметр - это прос-
тая переменная типа T, то он интерпретируется как массив с одним
элементом типа T.
К открытому формальному параметру-массиву можно обращаться
только по элементам. Присваивания всему открытому массиву не до-
пускаются, и открытый массив может передаваться другим процедурам
или функциям только как открытый параметр-массив или нетипизиро-
ванный параметр-переменная.
Открытый параметр-массив может быть параметром-значением,
параметром-константой и параметром-переменной и имеет тот же
смысл, что и обычные параметры-значения, параметры-константы и
параметры-переменные. В частности, присваивания элементам фор-
мального открытого массива-константы не допускаются, а присваива-
ния элементам формального открытого массива, являющегося парамет-
ром-значением, не влияют на фактический параметр.
Для открытых массивов-значений компилятор создает в кадре
стека процедуры или функции локальную копию фактического парамет-
ра. Таким образом, при передаче в качестве открытых парамет-
ров-значений больших массивов следует учитывать возможное пере-
полнение стека.
При применении к открытому параметру-массиву стандартная
функция Low возвращает 0, стандартная функция High возвращает ин-
декс последнего элемента в фактическом параметре-массиве, а функ-
ция SizeOf возвращает размер фактического параметра-массива.
Процедура Clear в следующем примере присваивает каждому эле-
менту массива вещественных значений ноль, а функция Sum вычисляет
сумму всех элементов массива вещественных чисел. Поскольку в обо-
их случаях параметр A является открытым параметром-массивом,
подпрограммы могут работать с любым массивом элементов типа Real:
procedure Clear(var A: array of Real);
var
I: Word;
begin
for I := 0 to High(A) do A[I] := 0;
end;
function Sum(const A: array of Real): Real;
var
I: Word;
S: Real;
begin
S := 0;
for I := 0 to High(A) do S := S + A[I];
Sum := S;
end;
Когда типом элементов открытого параметра-массива является
Char, фактический параметр может быть строковой константой. Нап-
ример, с учетом предыдущего описания:
procedure PringStr(const S: array of Char);
var
I: Integer;
begin
for I := 0 to High(S) do
if S[I] <> #0 then Write(S[I]) else Break;
end;
и допустимы следующие операторы процедур:
PrintStr('Hello word');
PrintStr('A');
При передаче в качестве открытого параметра-массива пустая
строка преобразуется в строку с одним элементом, содержащим сим-
вол NULL, поэтому оператор PrintStr('') идентичен оператору
PrintStr('#0').