Ada 左手赋值不能是受限类型

alg*_*ess 2 procedure ada task

花了几个小时在这上面后我感到不知所措。

受保护类型声明:

   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;
Run Code Online (Sandbox Code Playgroud)

任务:

   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;
Run Code Online (Sandbox Code Playgroud)

在行中,Elements(Available) := machine;machine := Elements(Available);得到“左手的分配不能是限制类型”

我不知道如何解决这个问题,我用谷歌搜索什么也没有找到,有人可以帮忙吗?

编辑:我现在知道受保护的类型是有限的,但是如何在没有上述内容的情况下完成受保护对象池?

Sim*_*ght 5

ARM 7.5开始开始,有限类型,

\n\n
\n

受限类型是不允许复制(例如赋值语句)的类型(的视图)。非限制类型是允许复制的类型(的视图)。

\n
\n\n

然而,你复制对有限对象的访问。

\n\n

所以,如果您已声明

\n\n
protected type AdditionMachine is\n   ...\nend AdditionMachine;\ntype AdditionMachine_Access is access AdditionMachine;\n
Run Code Online (Sandbox Code Playgroud)\n\n

你可以写这样的东西(我还没有测试过\xe2\x80\x99t):

\n\n
task body SimpleTask1 is \n   Available : Natural := ADDITION_MACHINES;\n   Elements  : array (1 .. ADDITION_MACHINES) of AdditionMachine_Access\n     := (others => new AdditionMachine);\nbegin\n
Run Code Online (Sandbox Code Playgroud)\n\n

当您\xe2\x80\x99 完成分配的对象时,您\xe2\x80\x99 将需要负责释放它们(如果程序需要无限期地运行,无论如何)。我不认为\xe2\x80\x99t 会出现受保护对象的问题(但是如果任务正在等待您解除分配的 PO 会发生什么?),并且最近的 GNAT 可以处理解除分配任务,前提是任务有开放的终止选项,ARM 9.7.1,或者已经终止 - 可能是通过中止)。

\n