4

Ada 並行プログラミングに問題があります。N がキーボードからの入力である同じタイプの N 個のタスクを作成する Ada で単純なプログラムを作成する必要があります。問題は、コンパイルの前に N を知る必要があることです...別の型を宣言しようとしました:

TYPE my_arr IS ARRAY(INTEGER RANGE <>) OF some_task;

以降、メイン プロシージャの BEGIN セクションで:

DECLARE arr: my_arr(1 .. N);

しかし、私はエラーが発生します

配列宣言の制約されていない要素型

これは(私が思うに)、タスクタイプ some_task のサイズが不明であることを意味します。誰でも助けてもらえますか?

4

3 に答える 3

3

問題のタスクタイプが差別されていることがわかったので、これは元の回答の書き直しです。

デフォルトなしで「判別式」を介して各タスクに値を渡しているため、タスクの種類が制約されていません。判別式に値を指定せずに型のオブジェクトを宣言することはできません (オブジェクトが作成されると判別式を変更できないため、デフォルトを指定しても役に立ちません)。

これに対する一般的なアプローチの 1 つは、アクセス タイプを使用します。

with Ada.Integer_Text_IO;
with Ada.Text_IO;
procedure Maciek is
   task type T (Param : Integer);
   type T_P is access T;
   type My_Arr is array (Integer range <>) of T_P;
   task body T is
   begin
      Ada.Text_IO.Put_Line ("t" & Param'Img);
   end T;
   N, M : Integer;
begin
   Ada.Text_IO.Put ("number of tasks: ");
   Ada.Integer_Text_IO.Get (N);
   Ada.Text_IO.Put ("parameter: ");
   Ada.Integer_Text_IO.Get (M);
   declare
      --  Create an array of the required size and populate it with
      --  newly allocated T's, each constrained by the input
      --  parameter.
      Arr : My_Arr (1 .. N) := (others => new T (Param => M));
   begin
      null;
   end;
end Maciek;

newed タスクが完了したら、割り当てを解除する必要がある場合があります。上記のコードでは、declareブロックの終了時にタスクのメモリがリークされます。

于 2013-06-08T16:00:13.843 に答える
2

それらを「宣言ブロック」に割り当てるか、動的に割り当てます。

   type My_Arr is array (Integer range <>) of Some_Task;

   type My_Arr_Ptr is access My_Arr;

   Arr : My_Arr_Ptr;

begin
   -- Get the value of N

   -- Dynamic allocation
   Arr := new My_Arr(1 .. N);

   declare
      Arr_On_Stack : My_Arr(1 .. N);

   begin
      -- Do stuff
   end;

end;
于 2013-06-08T14:03:31.657 に答える