Как сделать пакет в Аде универсальным пакетом?

У меня есть программа 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;
Другие вопросы по тегам