提问人:maciek 提问时间:6/8/2013 最后编辑:Marc Cmaciek 更新时间:5/15/2020 访问量:3448
ADA:多项任务
ADA: multiple tasks
问:
我在 Ada 并发编程方面遇到了问题。我必须在 Ada 中编写一个简单的程序,该程序可以创建 N 个相同类型的任务,其中 N 是来自键盘的输入。问题是在编译之前我必须知道 N...... 我试图声明一个单独的类型:
TYPE my_arr IS ARRAY(INTEGER RANGE <>) OF some_task;
稍后在主过程的 BEGIN 部分:
DECLARE arr: my_arr(1 .. N);
但是我收到错误
数组声明中不受约束的元素类型
这(我认为)意味着任务类型some_task的大小未知。 谁能帮忙?
答:
2赞
Marc C
6/8/2013
#1
在“声明块”中分配它们,或动态分配它们:
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;
评论
0赞
Simon Wright
6/8/2013
我认为 Maciej 是在声明块中创建它们?
0赞
maciek
6/9/2013
是的,我是,但我也尝试过指针。在这两种情况下都存在一个问题:我必须向每个任务发送 1 个参数,当我尝试时,我得到“数组声明中不受约束的元素类型”
3赞
Simon Wright
6/9/2013
#2
这是对原始答案的重写,现在我们知道任务类型 问题是有区别的。
您通过没有默认值的“判别”将值传递给每个任务,这使得任务类型不受约束;如果不为判别器提供值,则无法声明该类型的对象(并且提供默认值无济于事,因为一旦创建了对象,就无法更改判别器)。
一种常见的方法使用访问类型:
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;
完成 ed 任务后,您可能需要取消分配这些任务;在上面的代码中,任务的内存在退出块时泄漏。new
declare
评论
0赞
maciek
6/9/2013
好的,它可以工作,但是我必须将参数从键盘发送到任务。当我尝试编写:任务类型 T(param: INTEGER) 时,我收到相同的错误......
0赞
egilhh
6/9/2013
(param: Integer) 是一个判别式,将使您的任务成为无约束类型。如果你真的需要它,你可以在判别中添加一个默认值(参数:整数:= 0)
0赞
Rudra Lad
5/15/2020
#3
如果您在运行时确定需要多少个任务,则可以将其作为命令行参数传递。
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
上一个:在 Perl 中创建哈希
下一个:Seaborn热图上的次级x轴
评论