Массивы в параметрах процедур и функций
Массивы, как и другие типы данных, могут выступать в качестве параметров
процедур и функций. Вот как может выглядеть функция, вычисляющая среднее
значение в массиве действительных чисел:
const
Max = 63;
type
TStatistics = array [0..Max] of Double;
function Average(const A: TStatistics): Double;
var
I: Integer;
begin
Result := 0;
for I := Low(A) to High(A) do Result := Result + A[I];
Result := Result / (High(A) - Low(A) + 1);
end;
Функция Average принимает в качестве параметра массив известной размерности.
Требование фиксированного размера для массива-параметра часто является
чрезмерно сдерживающим фактором. Процедура для нахождения среднего значения
должна быть способна работать с массивами произвольной длины. Для этой
цели в язык Delphi введены открытые массивы-параметры. Такие массивы
были заимствованы разработчиками языка Delphi из языка Modula-2. Открытый
массив-параметр описывается с помощью словосочетания array of, при этом
границы массива опускаются:
function Average(const A: array of Double): Double;
var
I: Integer;
begin
Result := 0;
for I := Low(A) to High(A) do Result := Result + A[I];
Result := Result / (High(A) - Low(A) + 1);
end;
Внутри подпрограммы Average нижняя граница открытого массива A равна
нулю (Low(A) = 0), а вот значение верхней границы (High(A)) неизвестно
и выясняется только на этапе выполнения программы.
Существует только два способа использования открытых массивов: обращение
к элементам массива и передача массива другой подпрограмме, принимающей
открытый массив. Нельзя присваивать один открытый массив другому, потому
что их размеры заранее неизвестны.
Вот пример использования функции Average:
var
Statistics: array[1..10] of Double;
Mean: Double;
begin
...
Mean := Average(Statistics);
Mean := Average([0, Random, 1]);
...
end;
Заметьте, что во втором операторе открытый массив конструируется в момент
вызова функции Average. Конструктор открытого массива представляет собой
заключенный в квадратные скобки список выражений. В выражениях могут
использоваться константы, переменные и функции. Тип выражений должен
быть совместим с типом элементов массива. Конструирование открытого
массива равносильно созданию и инициализации временной переменной.
И еще одно важное замечание по поводу открытых массивов. Некоторые
библиотечные подпрограммы языка Delphi принимают параметры типа array
of const - открытые массивы констант. Массив, передаваемый в качестве
такого параметра, обязательно конструируется в момент вызова подпрограммы
и может состоять из элементов различных типов (!). Физически он состоит
из записей типа TVarRec, кодирующих тип и значение элементов массива
(записи рассматриваются ниже). Открытый массив констант позволяет эмулировать
подпрограммы с переменным количеством разнотипных параметров и используется,
например, в функции Format для форматирования строки (см. выше).
|