Arrays 多任务

Arrays 多任务,arrays,task,ada,Arrays,Task,Ada,我在Ada并发编程方面有一个问题。我必须用Ada编写一个简单的程序,创建N个相同类型的任务,其中N是来自键盘的输入。问题是在编译之前我必须知道N。。。 我已尝试声明一个单独的类型: TYPE my_arr IS ARRAY(INTEGER RANGE <>) OF some_task; 但是我得到了错误 数组声明中的无约束元素类型 这(我认为)意味着任务类型某些任务的大小未知。 有人能帮忙吗?在“声明块”中分配它们,或动态分配它们: type My_Arr is array

我在Ada并发编程方面有一个问题。我必须用Ada编写一个简单的程序,创建N个相同类型的任务,其中N是来自键盘的输入。问题是在编译之前我必须知道N。。。 我已尝试声明一个单独的类型:

TYPE my_arr IS ARRAY(INTEGER RANGE <>) OF some_task;
但是我得到了错误

数组声明中的无约束元素类型

这(我认为)意味着任务类型某些任务的大小未知。
有人能帮忙吗?

在“声明块”中分配它们,或动态分配它们:

   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;
键入My_Arr是某个_任务的数组(整数范围);
键入My_Arr_Ptr是访问My_Arr;
Arr:My_Arr_Ptr;
开始
--得到N的值
--动态分配
Arr:=新的My_Arr(1..N);
声明
堆栈上的Arr\u:My\u Arr(1..N);
开始
--做事
结束;
结束;
这是对原始答案的重写,现在我们知道任务类型为 问题是歧视性的

您正在通过“判别式”向每个任务传递一个值,没有默认值,这使得任务类型不受约束;如果不为判别式提供值,则无法声明该类型的对象(并且提供默认值也没有帮助,因为一旦创建了对象,就无法更改判别式)

一种常见的方法是使用访问类型:

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;
带有Ada.Integer\u Text\u IO;
使用Ada.Text_IO;
程序Maciek是
任务类型T(参数:整数);
类型T_P为接入T;
键入My_Arr是T_P的数组(整数范围);
任务体T是
开始
Ada.Text_IO.Put_行(“t”和Param'Img);
T端;
N、 M:整数;
开始
Ada.Text_IO.Put(“任务数:”);
Ada.Integer\u Text\u IO.Get(N);
Ada.Text_IO.Put(“参数:”);
Ada.Integer\u Text\u IO.Get(M);
声明
--创建所需大小的数组并用
--新分配的T,每个T受输入约束
--参数。
Arr:My_Arr(1..N):=(其他=>newt(参数=>M));
开始
无效的
结束;
结束马切克;

完成
新的
ed任务后,您可能需要取消分配这些任务;在上面的代码中,任务的内存在退出
declare
块时泄漏。

如果在运行时确定需要多少任务,可以将其作为命令行参数传递

with Ada.Text_IO; use ADA.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Command_Line;
with Ada.Strings;

procedure multiple_task is

    No_of_tasks : Integer := Integer'Value(Ada.Command_Line.Argument(1));

    task type Simple_tasks;

    task body Simple_tasks is
    begin
        Put_Line("I'm a simple task");
    end Simple_tasks;

    type task_array is array (Integer range <>) of Simple_tasks;

    Array_1 : task_array(1 .. No_of_tasks);

begin
   null;

end multiple_task;

我想Maciej是在declare块中创建它们的?是的,我是,但我也尝试过使用指针。在这两种情况下都存在一个问题:我必须向每个任务发送一个参数,当我尝试获取“数组声明中的无约束元素类型”时,它将有助于查看某个任务的定义。比如说,它有任何区别吗?好的,它可以工作,但我必须将参数从键盘发送到任务。当我尝试写入:task type T(param:INTEGER)时,我得到了相同的错误,…(param:INTEGER)是一个判别式,将使您的任务成为无约束类型。如果确实需要,可以向判别式添加默认值(param:Integer:=0)
with Ada.Text_IO; use ADA.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Command_Line;
with Ada.Strings;

procedure multiple_task is

    No_of_tasks : Integer := Integer'Value(Ada.Command_Line.Argument(1));

    task type Simple_tasks;

    task body Simple_tasks is
    begin
        Put_Line("I'm a simple task");
    end Simple_tasks;

    type task_array is array (Integer range <>) of Simple_tasks;

    Array_1 : task_array(1 .. No_of_tasks);

begin
   null;

end multiple_task;
> multiple_task.exe 3
I'm a simple task
I'm a simple task
I'm a simple task