Как сделать пакет в Аде универсальным пакетом?
У меня есть программа Ada для расчета среднего и стандартного отклонения 200 значений, взятых из файла, и они оба работают правильно. эти пакеты в типе float, как превратить их в универсальный тип?
Средний файл пакета объявлений:
with Text_IO;
package avg is
type int_array is Array (1..200) of integer;
function avrage (ParArray: int_array) return float;
end avg;
и средний пакет тела:
with Text_IO;
WITH Ada.Integer_Text_IO; USE Ada.Integer_Text_IO;
package body avg is
function avrage (ParArray: int_array) return float is
result: float :=0.0;
final:float :=0.0;
myarray: int_array:=ParArray;
begin
for v in myarray'Range loop
result:= result + float(myarray(v));
end loop;
final:=result/200.0;
return final;
end avrage;
end avg;
Я называю этот пакет в моей основной программе словами "с" и "использовать". скажите пожалуйста что делать
1 ответ
Решение
Вы не говорите, что вы хотите, чтобы ваш пакет был универсальным.
Я предполагаю, что вы хотите, чтобы вход был массивом (Input_Values
ниже) какого-то типа Input_Value
индексируется Input_Index
и вы хотите, чтобы вывод был некоторого типа с плавающей точкой Result_Value
, Вам понадобится функция To_Result_Value
преобразовать Input_Value
в Result_Value
,
generic
type Input_Value is private;
type Input_Index is (<>);
type Input_Values is array (Input_Index range <>) of Input_Value;
type Result_Value is digits <>;
with function To_Result_Value (X : Input_Value) return Result_Value;
package Statistics is
function Mean (Input : Input_Values) return Result_Value;
end Statistics;
... с реализацией:
package body Statistics is
function Mean (Input : Input_Values) return Result_Value is
Sum : Result_Value := 0.0;
begin
for I of Input loop
Sum := Sum + To_Result_Value (I);
end loop;
return Sum / Result_Value (Input’Length);
end Mean;
end Statistics;
... и немного демо:
with Ada.Text_IO;
with Statistics;
procedure Demo is
type Arr is array (Integer range <>) of Integer;
function To_Float (X : Integer) return Float is
begin
return Float (X);
end To_Float;
package Avg is new Statistics (Input_Value => Integer,
Input_Index => Integer,
Input_Values => Arr,
Result_Value => Float,
To_Result_Value => To_Float);
A : Arr := (1, 2, 3, 4, 5);
M : Float;
begin
M := Avg.Mean (A);
Ada.Text_IO.Put_Line ("mean is " & Float'Image (M));
end Demo;