在这花了几个小时后,我感到很茫然。
受保护的类型声明:
protected type AdditionMachine is
procedure setTask (Item : in WorkerTask);
procedure getTask (Item : out WorkerTask);
procedure calculate;
private
machineType : String (1 .. 1) := "A";
job : workerTask;
end AdditionMachine;
任务:
task body SimpleTask1 is
Available : Natural := ADDITION_MACHINES;
Elements : array (1 .. ADDITION_MACHINES) of AdditionMachine;
begin
loop
select
when Available > 0 =>
accept getMachine (machine : out AdditionMachine) do
machine := Elements(Available);
Available := Available - 1;
end getMachine;
or
accept addMachine (machine : in AdditionMachine) do
Available := Available + 1;
Elements(Available) := machine;
end addMachine;
end select;
end loop;
end SimpleTask1;
在第Elements(Available) := machine;
行和machine := Elements(Available);
我得到了#34;左手的分配不能是限制类型"
我不知道如何解决这个问题,当我用Google搜索时,我什么也没找到,有人可以帮忙吗?
编辑:我现在知道受保护的类型是有限的,但是如何在没有上述内容的情况下完成受保护对象池?
答案 0 :(得分:3)
来自ARM 7.5,限制类型,
有限类型是(视图)不允许复制(例如,对于assignment_statement)的类型。无限制类型是允许复制的(视图a)类型。
但是, 允许将访问权限复制到受限对象。
所以,如果你已宣布
protected type AdditionMachine is
...
end AdditionMachine;
type AdditionMachine_Access is access AdditionMachine;
你可以写这样的东西(我还没有测试过):
task body SimpleTask1 is
Available : Natural := ADDITION_MACHINES;
Elements : array (1 .. ADDITION_MACHINES) of AdditionMachine_Access
:= (others => new AdditionMachine);
begin
当你完成它们时,你需要注意释放已分配的对象(如果程序需要无限期地运行)。我不认为受保护对象会出现问题(但如果任务正在等待您解除分配的PO上会发生什么?),并且最近的GNAT可以解除分配任务,前提是任务具有开放的终止备选方案,{{ 3}},或者已经终止 - 也许是通过中止)。