Ada错误:在表达式或调用中无效使用子类型标记

问题描述

我在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实际上是整数,则可以显式转换它们。否则,您需要制作某种类型的转换函数,并在传入或分配给其他类型之前使用它。