Mam rozwiązać w Adzie klasyczny problem producentów i konsumentów.
Napisałem już (prawdopodobnie poprawnie) zadania, ale niestety nie jestem w stanie ich wywołać. Gdyby ktoś pomógł mi w napisaniu głównego programu to byłoby bardzo miło.

with ada.text_io, ada.integer_text_io, ada.numerics.discrete_random;
use ada.text_io, ada.integer_text_io;
with pakiet_z_semaforami; use Pakiet_z_Semaforami;

procedure program is
	max_number_of_processes: integer:=30;
	N: integer:=10;
	sprod, skons:sem;
	pusty, pelny:sem;
	wskbufprod:integer:=0;
    wskbufkons:integer:=0;
	buf:array(1..n) of integer;




	number_of_prod : integer;
	number_of_Kons : integer;



	task type prod (Nr_prod: integer:=0);
	task type kons (Nr_Kons: integer:=0);

	type pointer_Prod is access Prod;
	type pointer_Kons is access Kons;

	subtype size is integer range 1..max_number_of_processes;
	Nr_Prod: array(size) of pointer_Prod;
	Nr_Kons: array(size) of pointer_Kons;

	local_time, critical_time: array (size) of duration;
	package duration_io is new fixed_io(duration);


	task body prod is 
		x:integer;
		lok:integer;

	begin
		loop
			Put("Produkuje "); put(Nr_prod); new_line;
			delay(local_time(Nr_prod));
			X:=Nr_prod;
			
			pusty.wait;
			sprod.wait;
			wskbufprod:=(wskbufkons mod n)+1;
			lok:=wskbufprod;
			sprod.signal;
			buf(lok):=X;
         
			Put("Umieszcza "); put(Nr_prod); new_line;
			delay(critical_time(Nr_prod));
			Pelny.Signal;
		end loop;

end prod;



task body kons is 
		y:integer;
		ylok:integer;

	begin
		loop
			Put("Konsumuje "); put(Nr_kons); new_line;
			delay(local_time(Nr_kons));
	        y:=Nr_kons;
			pelny.wait;
			skons.wait;
		    wskbufkons:=(wskbufprod mod n)+1;
            ylok:=wskbufkons;
			skons.signal;
			buf(ylok):=y;
            
                   
            
			Put("Czeka "); put(Nr_kons); new_line;
			delay(critical_time(Nr_kons));
			Pusty.Signal;
		end loop;

end kons;



begin
   null;   
end program;

pakiet z semaforami

package pakiet_z_semaforami is
task type sem_bin is
	entry Wait;
	entry Signal;
end Sem_bin;
task type sem is 
	entry Inicjalizuj(N : in Integer; m : in Integer);
	entry wait;
	entry signal;
end Sem;
end pakiet_z_semaforami;

ciało pakietu

package body pakiet_z_semaforami is
task body sem_bin is
begin
	loop
		select
			accept wait;
			accept Signal;
	    or               terminate;
        end select;
	end loop;
end sem_bin;


 task body sem is
	licznik : integer;
	max : Integer;
begin
	accept Inicjalizuj(N : in Integer; m : in Integer) do
		licznik:=n;
		Max:=M;
	end Inicjalizuj;
	
	loop
	select  
		when Licznik >0 =>
           accept Wait do
		   licznik:=licznik-1;
		end Wait;
	or		
		when Licznik < Max => 
			accept Signal do  licznik:=licznik+1;
        End Signal;
     or  terminate;
	end select;
	end loop;
end Sem;
end pakiet_z_semaforami;