gpt4 book ai didi

arrays - ADA:多项任务

转载 作者:行者123 更新时间:2023-12-02 23:50:42 25 4
gpt4 key购买 nike

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

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

以及稍后在主程序的 BEGIN 部​​分:

DECLARE arr: my_arr(1 .. N);

但我收到错误

unconstrained element type in array declaration

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

最佳答案

This is a rewrite of the original answer, now that we know that the task type in question is discriminated.

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

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

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;

您可能需要在任务完成后取消分配它们;在上面的代码中,任务的内存在从 declare block 退出时泄漏。

关于arrays - ADA:多项任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16999698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com