Ожидаемый тип "..." определен в....... ошибка в Аде
У меня есть такая реализация алгоритма Карацубы, которую я написал в ADA.
procedure Karatsuba (Factor_1, Factor_2 : in Number; Product : out Number) is
m : Integer;
m2 : Integer;
low1 : Number := (0,1);
high1 : Number := (0,1);
low2 : Number := (0,1);
high2 : Number := (0,1);
z0 : Index;
z1 : Index;
z2 : Index;
x : Integer;
y : Integer;
hc1 : Index;
hc2 : Index;
begin
low1 := (others => 0);
high1 := (others => 0);
low2 := (others => 0);
high2 := (others => 0);
if Factor_1'Length = 1 or Factor_2'Length = 1 then
Standard(Factor_1, Factor_2,Product);
end if;
-- calculates the size of the numbers
m := Integer'Max(Factor_1'Length, Factor_2'Length);
m2 := m / 2;
-- split the digit sequences about the middle
for Factor_1_Index in Factor_1'Range loop
x := x + 1;
if x <= m2 then
low1(Factor_1_Index) := Factor_1(Factor_1_Index);
else
high1(hc1) := Factor_1(Factor_1_Index);
hc1 := hc1 + 1;
end if;
end loop;
for Factor_2_Index in Factor_2'Range loop
y := y + 1;
if y <= m2 then
low2(Factor_2_Index) := Factor_2(Factor_2_Index);
else
high2(hc2) := Factor_2(Factor_2_Index);
hc2 := hc2 + 1;
end if;
end loop;
-- 3 calls made to numbers approximately half the size
z0 := Karatsuba(low1, low2, Product);
z1 := Karatsuba((low1 + high1), (low2 + high2), Product);
z2 := Karatsuba(high1, high2, Product);
Product := (z2*10**(2*m2))+((z1-z2-z0)*10**(m2))+(z0);
end Karatsuba;
В последних 4 строках перед строкой "конец Карацубы" я получаю сообщение об ошибке "ожидаемый тип" Индекс ", определенный в...". Ошибки, которые я получаю, соответственно,
expected type "Index" defined at ....
found package or procedure name
there is no applicable operator "+" for type "Number" defined at ......
Это еще один класс, который я назначил несколько переменных:
package ITI8590.Natural_Number_Multiplication is
type Digit is range 0 .. 1;
type Index is new Positive;
type Number is array (Index range <>) of Digit;
for Digit'Size use 1;
procedure Standard(Factor_1, Factor_2 : in Number; Product : out Number);
procedure Karatsuba(Factor_1, Factor_2 : in Number; Product : out Number);
end ITI8590.Natural_Number_Multiplication;
Теперь, почему я получаю эту ошибку? Я не мог решить это, и я застрял в этом. Не могли бы вы помочь мне?
Спасибо,
1 ответ
Karatsuba
это процедура, поэтому в конце вместо
z0 := Karatsuba(low1, low2, Product);
z1 := Karatsuba((low1 + high1), (low2 + high2), Product);
z2 := Karatsuba(high1, high2, Product);
наверное, стоит прочитать
Karatsuba(low1, low2, z0);
Karatsuba((low1 + high1), (low2 + high2), z1);
Karatsuba(high1, high2, z2);
который требует от вас объявить z0
, z1
, z2
как Number
скорее, чем Index
, Заметка, Product
является out
параметр в процедуре, поэтому весь ваш код был перезаписан дважды с промежуточными результатами (3 раза, считая вызов Standard
выше).
Но тогда возникает проблема: компилятор говорит
yusuf.ada:25:12: unconstrained subtype not allowed (need initialization)
yusuf.ada:25:12: provide initial value or explicit array bounds
который призывает к чему-то связанному с тем, как вы объявили low1
так далее:
low1 : Number := (0,1);
high1 : Number := (0,1);
low2 : Number := (0,1);
high2 : Number := (0,1);
Проблема с этим подходом состоит в том, что вы теперь ограничили границы переменных: low1
исправлено, чтобы иметь 2 элемента (установить значения, которые вы затем перезаписать), и не может быть расширен. Я не знаю, как алгоритм должен работать, но это вряд ли будет правильным; для начала, что произойдет, если входы имеют более 2 цифр?
Один подход, который мог бы работать, состоит в том, чтобы использовать количество цифр во входных параметрах:
Max_Digits : constant Positive := Factor_1’Length + Factor_2’length;
pragma Assert (Product’Length >= Max_Digits, “possible overflow”);
low1 : Number (1 .. Max_Digits) := (others => 0);
и т.п.
И, как прокомментировал ajb, вам нужно определить операторы +
, -
, *
, **
между Number
с и Integers
по мере необходимости, особенно в выражении (z2*10**(2*m2))+((z1-z2-z0)*10**(m2))+(z0)
в последней строке процедуры.