8.3.1. Открытые массивы
Object Pascal поддерживает так называемые открытые массивы, легко решающие проблему передачи подпрограмме одномерных массивов переменной длины.
Открытый массив представляет собой формальный параметр подпрограммы, описывающий базовый тип элементов массива, но не определяющий его размерности и границы:
Procedure MyProc(OpenArray: array of Integer);
Внутри подпрограммы такой параметр трактуется как одномерный массив с нулевой нижней границей. Верхняя граница открытого массива возвращается стандартной функцией High. Используя 0 как минимальный индекс и значение, возвращаемое функцией High, как максимальный индекс, подпрограмма может обрабатывать одномерные массивы произвольной длины.
Procedure TfmExample.bbRunClick(Sender: TObject) ;
{Иллюстрация использования открытых массивов: программа выводит в компонент mmOutput содержимое двух одномерных массивов разной длины с помощью одной процедуры ArrayPrint) Procedure ArrayPrint(aArray: array of Integer);
var
k: Integer;
S: String;
begin
S:=' ';
for k := 0 to High(aArray) do S := S + IntToStr(aArray[k]);
mmOutput.Lines.Add(S) ;
end;
const
A: array [-1..2] of Integer = (0,1,2,3);
B: array [5..7] of Integer = (4,5,6);
begin
ArrayPrint(A);
ArrayPrint (B);
end;
Как видно из этого примера, фактические границы массивов а и в, передаваемых в качестве параметров вызова процедуре ArrayPrint, не имеют значения. Однако размерность открытых массивов (количество индексов) всегда равна 1 - за этим следит компилятор. Если бы, например, мы добавили в программу двумерный массив с
var
С: array,[1..3,1..5] of Integer;
то обращение
ArrayPrint(С)
вызвало бы сообщение об ошибке.