这是对原始答案的重写,现在我们知道所讨论的任务类型是有区别的。
您通过没有默认值的“判别式”将值传递给每个任务,这使得任务类型不受约束;如果不为判别式提供值,则无法声明该类型的对象(并且提供默认值也无济于事,因为一旦创建了对象,就无法更改判别式)。
一种常见的方法是使用访问类型:
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;
您可能需要在new
ed 任务完成后解除分配;在上面的代码中,任务的内存在退出declare
块时泄漏。