问题描述
我在Ada程序中因错误而被困在这里。有很多代码,我不想在这里复制所有代码,所以我希望我要共享的部分是问题所在。
task type Producent is
entry Start(Jedzenie: in Typ_Jedzenia; Czas_Produkcji: in Integer);
end Producent;
task type Buffer is
entry Zamow(Jedzenie: in Typ_Jedzenia; Numer: in Integer; Czy_Zatwierdzono: out Boolean);
entry Dostarcz(Zamowienie: in Typ_Zestawu; Numer: out Integer);
end Buffer;
task body Producent is
package Losowa_Produkcja is new
Ada.Numerics.discrete_Random(Zakres_Czasu_Produkcji);
Generator: Losowa_Produkcja.Generator;
Index_Jedzenia: Integer;
Nr_Produkcji_Jedzenia: Integer := 1;
Produkcja: Integer;
Zatwierdzono: Boolean := False;
begin
accept Start (Jedzenie : in Typ_Jedzenia; Czas_Produkcji : in Integer) do
Losowa_Produkcja.Reset(Generator);
Index_Jedzenia := Jedzenie;
Produkcja := Czas_Produkcji;
end Start;
loop
delay Duration(Losowa_Produkcja.Random(Generator));
Put_Line("Przygotowano " & Nazwa_Jedzenia(Index_Jedzenia) & " numer " & Integer'Image(Nr_Produkcji_Jedzenia));
loop
Buffer.Zamow(Index_Jedzenia,Nr_Produkcji_Jedzenia,Zatwierdzono); <-------- ERROR
if Zatwierdzono = False then
Put_Line("Brak miejsca w kuchni dla " & Nazwa_Jedzenia(Index_Jedzenia) & ". Wstrzymanie");
delay Duration(3.0);
else
Nr_Produkcji_Jedzenia := Nr_Produkcji_Jedzenia + 1;
end if;
exit;
end loop;
end loop;
end Producent;
task body Buffer is
begin
Put_Line("Jestesmy u Buffera");
loop
select
accept Zamow(Jedzenie: in Typ_Jedzenia; Numer: in Integer; Czy_Zatwierdzono: out Boolean) do
Put_Line("Trwa zamawianie...");
end Zamow;
end select;
end loop;
end Buffer;
从我的尝试中我了解到,当我想调用条目Buffer.Zamow(Index_Jedzenia,Zatwierdzono);
(位于任务Producent
中)时,'Zatwierdzono'参数存在错误。当我从声明和定义中删除此参数时,Zamow()
条目起作用。
我应该更改什么,或者此布尔Zatwierdzono
变量在哪里出现问题?
在这种情况下,Zatwierdzono
的意思是Accepted
。
谢谢你的想法。
解决方法
您有两个问题:
Index_Jedzenia := Jedzenie;
在“开始”条目中尝试将Jedzenie从其类型Typ_Jedzenia隐式转换为Integer,即Index_Jedzenia的类型。您需要一些转换方法。
此外,在您看到错误的行上,该条目的第一个参数的类型为Typ_Jedzenia,但您传入的是整数(Index_Jedzenia是整数)。同样,您不能像这样隐式转换类型。
如果Typ_Jedzenia实际上是整数,则可以显式转换它们。否则,您需要制作某种类型的转换函数,并在传入或分配给其他类型之前使用它。