阿达分配的左手不得类型的限制(Ada left hand of assignment must no

2019-10-23 01:54发布

我在亏损愿意花小时后。

受保护的类型声明:

   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); 我得到“左assingment的手绝不仅限于类型”

我不知道如何解决这个问题,我发现没有,当我用Google搜索,谁能帮助?

编辑:现在我知道,受保护的种类是有限的,但如何做到保护对象池没有像上面?

Answer 1:

从ARM 7.5 ,限制形式,

有限类型是(的视图),用于其复制(如用于assignment_statement)不允许使用的类型。 甲nonlimited类型是允许复制为哪种类型(的视图)。

但是,你允许复制访问有限的对象。

所以,如果您已声明

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等待会发生什么?),以及最近的虱子与提供的任务已经开放终止解除分配方案确定的任务, ARM 9.7 0.1 ,或者已经终止-也许被中止)。



文章来源: Ada left hand of assignment must not be limited type