gpt4 book ai didi

compiler-errors - Ada : Task type as task mark in its own body

转载 作者:行者123 更新时间:2023-12-02 10:49:46 25 4
gpt4 key购买 nike

我有一个Ada任务Do_Something,它需要“调用”自身。我认为它来自C++,我有一个运行void Do_Something()的线程,有时void Do_Something()需要产生更多也运行void Do_Something()的线程。

艾达(我正在学习)不喜欢那样。这似乎是M(non)WE:

task body A_Task is

new_task: access A_Task;
my_level: Natural;

begin

accept Do_Something(level: in Natural) do
my_level := level + 1;
end Do_Something;

if my_level < 4 then
new_task := new A_Task;
new_task.Do_Something(my_level);
end if;

end A_Task;

GNAT至少不喜欢这样,在 new_task.Do_Something(my_level);上报告错误,因为
task type cannot be used as type mark within its own spec or body

但是,可以通过在任务之外添加以下过程来轻松地规避此问题:
procedure Circumvent(level: Natural) is
new_task: access A_Task;
begin
new_task := new A_Task;
new_task.Do_Something(level + 1);
end Circumvent;

然后将 if主体中的 A_Task语句修改为此:
  if my_level < 4 then
Circumvent(my_level);
end if;

后一个版本通过了GNAT(现在我们有了M *** W *** E),即使在昨晚我玩的一个不平凡的例子中,程序也可以正常运行。

这个解决方法似乎非常简单,以至于我根本不明白为什么编译器会引发第一个错误!我想我一定是以完全错误的方式来解决这个问题。这被认为是好的Ada技术吗?如果不是,那么做这种事情的Ada样方式是什么?

最佳答案

此行为在RM 8.6(17/3)中指定:
“如果用法名称出现在type_declaration的声明性区域内并表示相同的type_declaration,则它表示该类型的当前实例(而不是类型本身);”

这意味着该类型的实际名称不能用于实例化其他对象。
包装器(如您的包装器)将是一种方法。
子类型也应该起作用subtype Foo is A_Task;
但是请注意,C++思维/做事方式很少是Ada做事方式

关于compiler-errors - Ada : Task type as task mark in its own body,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50235245/

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