8.3.3. Вариантные массивы-параметры

В Delphi 32 при передаче подпрограмме массивов переменной длины и размерности удобно использовать вариантные массивы (см. п. 7.4.3). В следующем примере с помощью функции GetAr-rayAverage определяется среднее арифметическое значение всех элементов вариантного массива произвольной длины и размерности не выше 5:

function GetArrayAverage (const V: Variant): Double;

{Возвращает среднее арифметическое значение массива произвольной длины и размерности или очень маленькую отрицательную величину, если V - не вариант или если его размерность больше 5} var

i,j,k,l,m: Integer;

Sum: Double;

NItem: Integer;

begin

Result := -1E-309;

if ((VarType(V) and VarArray) <> VarArray) or

(VarArrayDimCount(V) > 5) then Exit;

Sum := 0;

NItem := 0;

// Подсчитываем количество элементов массива

for k := 1 to VarArrayDimCount(V) do

NItem := NItem+VarArrayH'ighBound(V, k)-VarArrayLowBound(V,k) ;

// Подсчитываем сумму элементов case VarArrayDimCount(V) of

1: for i "VarArrayLowBound(V,1) to VarArrayHighBound(V,1) do

Sum := Sum+V[i] ;

2: for i =VarArrayLowBound(V,1) to VarArrayHighBound(V,1) do

for j :=VarArrayLowBound(V,2) to VarArrayHighBound(V,2) do

Sum := Sum+V[i,j] ;

3: for i: =VarArrayLowBound(V,1) to VarArrayHighBound(V,1) do

for j: =VarArrayLowBound(V,2) to VarArrayHighBound(V,2) do

for k: =VarArrayLowBound(V,3) to VarArrayHighBound(V,3) do

Sum := Sum+V[i,j,k] ;

4: for i: =VarArrayLowBound(V,1) to VarArrayHighBound(V,1) do

for j: =VarArrayLowBound(V,2) to VarArrayHighBound(V,2) do

for k :=VarArrayLowBound(V,3) to VarArrayHighBound(V,3) do

for l: =VarArrayLowBound(V,4) to VarArrayHighBound(V,4) do

Sum := Sum+V[i,j,k,1];

5: for i:=VarArrayLowBound(V,1) to VarArrayHighBound(V,1) do

for j :=VarArrayLowBound(V,2) to VarArrayHighBound(V,2) do

for k: =VarArrayLowBound(V,3) to VarArrayHighBound(V,3) do

for 1 :=VarArrayLowBound(V,4) to VarArrayHighBound(V,4) do

for m:= VarArrayLowBound(V,5) to VarArrayHighBound(V,5) do

Sum := Sum+V[i,j,k,1,m];

end;

Result := Sum/NItem

end;

В подобного рода подпрограммах ограничение на размерность вариантного массива определяется, как правило, количеством вариантов в предложении case.