Delphi 6 программирование


              

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



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.


Содержание Назад Вперед