Ada error: invalid use of subtype mark in expression or call

1.2k views Asked by At

I'm stuck here with an error in my Ada program. There is a lot of code and I don't want to copy all of it here, so I hope that the part that I'm sharing is the part from where the problem comes.

   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;

From my attempts I understand that when I want to call entry Buffer.Zamow(Index_Jedzenia, Nr_Produkcji_Jedzenia, Zatwierdzono); (which is in task Producent) there is an error with 'Zatwierdzono' argument. When I removed this argument from declarations and definitions Zamow() entry worked.

Full error: invalid use of subtype mark in expression or call

What should I change or where is the problem with this boolean Zatwierdzono variable? Zatwierdzono means Accepted in this case. Thanks for any ideas.

1

There are 1 answers

1
Jere On

You have two problems:

Index_Jedzenia := Jedzenie;

In your Start entry is trying to implicitly convert Jedzenie from its type, Typ_Jedzenia, to Integer, the type of Index_Jedzenia. You need some way to convert this.

Additionally on the line you are seeing the error on, the first parameter of that entry is of type Typ_Jedzenia but you are passing in an Integer (Index_Jedzenia is an integer). Again, you can't implicitly convert types like that.

If Typ_Jedzenia is actually an integer, you can explicitly convert them. Otherwise you need to make a conversion function of some type and use that before passing in or assigning to different types.