Недоліки вивченого раніше способу передачі масивів-параметрів очевидні: по-перше, необхідність опису типу даних масиву оператором type порушує правило переносимости підпрограм (дія підпрограми стає залежним від зовнішнього оператора), по-друге, для вказівки реальної розмірності переданих у підпрограму масивів доводиться використовувати додаткові параметри-значення, по-третє, при обробці масивів меншої, чим зазначене в операторі type розмірності, неефективно губиться оперативна пам'ять. У який те мері виправити ці недоліки дозволяє використання відкритих масивів.
Спосіб підходить тільки для одномірних масивів. Використовувати його з матрицями можливо, якщо інтерпретувати матрицю як вектор (див. главу 17).
Наявні в програмі вектори описуються в розділі var звичайним способом, без визначення типу type. У списку формальних параметрів підпрограми параметр-вектор вказується без діапазону розмірності:
Function Sum(Var X : Array Of Real) : Real;
При виклику підпрограми фактичний параметр-масив підставляється на місце формального:
Var a:array [1..5] of real;
S:real;
. . .
S:=Sum(a);
Відкритим залишається питання – як відслідковувати з підпрограми розмірність переданого масиву? Для цього в Паскалі існують стандартні функції Low і High. Їхнім єдиним параметром передається ідентифікатор масиву, Low повертає найнижче значення припустиме значення індексу, а High – найвище. Якщо A – одномірний масив, величини Low(A) і High(A) можна безпосередньо застосовувати як границі циклу for:
Function Sum(Var X : Array Of Real) : Real;
Var I : Word;
S : Real;
Begin
S:=0;
For I:=Low(X) To High(X) Do S:=S+X[I];
Sum:=S;
End;
Щоб завершити приклад, викличемо написану функцію Sum:
Const a:array [1..5] of real=(1,2,3,4,5.5);
Var s:real;
begin
writeln (Sum(a):6:1);
end.
Як правило, номер першого елемента відкритого масиву дорівнює нулю, однак, надійніше все-таки вказувати Low. Приведемо ще один приклад програми, що включає підпрограму з відкритими масивами в якості параметрів.
Пр. Знайти кількість елементів вектора X[7], що попадають в інтервал [0,3] і кількість елементів вектора Y[5], що попадають в інтервал [-1,1].
Для введення елементів масиву із клавіатури напишемо процедуру Input, якої все-таки прийде передавати розмірність масиву-параметра (адже вводяться два вектори різної розмірності). Тому в Input використаний той факт, що нумерація елементів відкритого масиву за замовчуванням виконується в нуля. Функції kol, що обчислює кількість елементів відкритого масиву, що попадають в інтервал [x1,x2], досить стандартної вказівки Low і High:
var x:array [1..7] of real;
y:array [1..5] of real;
k1,k2,i:integer;
procedure Input (n:integer; var a:array of real);
var i:integer;
begin
writeln ('Enter ',n,' items of array:');
for i:=0 to n-1 do read (a[i]);
end;
function Kol (var a:array of real; x1,x2:real):integer;
var i,k:integer;
begin
k:=0;
for i:=Low(a) to High(a) do
if (a[i]>=x1) and (a[i]<=x2) then k:=k+1;
Kol:=k;
end;
begin
Input (7,x);
Input (5,y);
k1:=Kol(x,0,3);
k2:=Kol(y,-1,1);
writeln ('k1=',k1,' k2=',k2);
end.