В ТП версии 7.0 было введено понятие открытого массива.
Открытый массив - это формальный параметр процедуры или функции, который является одномерным массивом переменной длины, индексируемым с 0.
Открытые массивы описываются как array of ИД_типа, без использования диапазона значений. Фактическим параметром, сопоставленным открытому массиву, может быть любой одномерный массив с элементами типа ИД_типа. Аналогично открытым массивам ведется обработка строк PChar, когда последние являются формальными параметрами процедур и функций.
Для получения верхней границы открытого массива можно воспользоваться функцией High (см. параграф 1.5.1.3).
Например:
procedure HighA(f:array of integer); {процедура для констатации верхней границы массива}
begin
writeln('Верхняя граница массива - ',high(f));
end;
{---------основная программа------------}
var x:array[1..100]of integer;{массив на 100 элементов}
y:array[-100..300] of integer; {массив на 401 элемент}
begin
HighA(x);
HighA;
readln;
end.
В результате выполнения данной программы на экране появится:
Верхняя граница массива - 99
Верхняя граница массива - 400
Так как индексация открытых массивов ведется от 0, то значение верхней границы на единицу меньше количества элементов массива.
Задача 47. Создать две процедуры. Первая из них заполняет случайными числами переданный ей одномерный вещественный массив. Вторая выводит на экран содержимое переданного ей вещественного массива.
procedure Fill(var f:array of real); {процедура заполнения}
var i:word;
begin
for i:=low(f) to High(f) do f[i]:=random;
end;
procedure Out(var f:array of real); {процедура вывода на экран}
var i:word;
begin
for i:=low(f) to High(f) do write(f[i]:5:2);
writeln;
end;
{---------основная программа------------}
var x:array[1..5]of real; {массив на 5 элементов}
y:array[1..10] of real; {массив на 10 элементов}
begin
randomize;
Fill(x); Fill; {заполняем оба массива}
Out(x); Out; {выводим их на экран}
readln;
end.
В результате выполнения программы на экране появится две строки, первая из которых содержит 5 чисел, вторая - 10.
Например:
0.62 0.98 0.74 0.98 0.87
0.63 0.97 0.03 0.68 0.31 0.94 0.72 0.13 0.18 0.04
Благодаря randomize, при следующем запуске выводимые значения будут уже другими.
Открытыми строками в ТП называются строковые параметры-переменные типа string. Открытые строки обладают свойством менять свою максимальную длину в соответствии максимальной длиной фактически переданной строки. При использовании директивы компилятора {$P+} строковые параметры-переменные превращаются в открытые строки.
Например
{$P+}
procedure MaxLen(var f:string);
begin
writeln('Максимальная длина строки = ',high(f));
end;
{---------основная программа------------}
var x:string[70]; {строковая переменная на 70 символов}
y:string[50]; {строковая переменная на 50 символов}
begin
MaxLen(x);
MaxLen;
readln;
end.
В результате выполнения данной программы на экране появится:
Максимальная длина строки = 70
Максимальная длина строки = 50
Если отказаться от поддержки открытых строк с помощью директивы {$P-}, и не забыть установить директиву {$V-}, которая позволяет отключить проверку компилятором совпадения максимальных длин строк для формальных и фактических параметров ({$P-,V-}), то результат выполнения данной программы будет другим:
Максимальная длина строки = 255
Максимальная длина строки = 255