gpt4 book ai didi

ada - 将字符串作为 Ada 中的任务创建判别式传递

转载 作者:行者123 更新时间:2023-12-02 08:33:04 24 4
gpt4 key购买 nike

我正在迈出使用 Ada 的第一步,但我发现我很难理解如何执行在其他语言中会立即执行的常见甚至平庸的操作。

在这种情况下,我定义了以下任务类型(以及访问类型,以便我可以创建新实例):

task type Passenger(
Name : String_Ref;
Workplace_Station : String_Ref;
Home_Station : String_Ref
);

type Passenger_Ref is access all Passenger;

如您所见,这是一个简单的任务,具有 3 个可在创建实例时传递给它的判别式。 String_Ref 定义为:

   type String_Ref is access all String;

我使用它是因为显然你不能使用“正常”类型作为任务判别,只能使用引用或原始类型。

所以我想创建这样一个任务的实例,但无论我做什么,我都会得到一个错误。我不能通过简单地直接传递字符串:

  Passenger1 := new Passenger(Name => "foo", Workplace_Station => "man", Home_Station => "bar");

因为这些是字符串而不是对字符串的引用,这很公平。所以我尝试了:

task body Some_Task_That_Tries_To_Use_Passenger is
Passenger1 : Passenger_Ref;
Name1 : aliased String := "Foo";
Home1 : aliased String := "Man";
Work1 : aliased String := "Bar";

begin

Passenger1 := new Passenger(Name => Name1'Access, Workplace_Station => Work1'Access, Home_Station => Home1'Access);

但这也不起作用,因为据我了解,Home1/Name1/Work1 变量是任务的局部变量Some_Task_That_Tries_To_Use_Passenger 等不能被 Passenger 的“构造函数”使用。

老实说,我不明白我该怎么做。我过去使用过多种编程语言,但我从来没有遇到过将一个简单的 String 传递给构造函数的麻烦,我觉得自己是个白痴,但我不明白为什么这么常见的操作会如此复杂,我'我确信我没有正确地解决这个问题,请启发我并告诉我正确的方法来做到这一点,因为我快疯了 :D

最佳答案

是的,我同意区分任务和记录类型的语言必须是离散的,这是一个严重的问题。幸运的是,对于任务类型有一个简单的解决方案——可以通过“入口”点传递数据。

with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
procedure Main is
task type Task_Passenger is
entry Construct(Name, Workplace, Home : in String);
end Passenger;
task body Task_Passenger is
N, W, H : Unbounded_String;
begin
accept Construct(Name, Workplace, Home : in String) do
N := To_Unbounded_String(Name);
W := To_Unbounded_String(Workplace);
H := To_Unbounded_String(Home);
end Construct;
--...
end Passenger;
Passenger : Task_Passenger;
begin
Passenger.Construct("Any", "length", "strings!");
--...
end Main;

关于ada - 将字符串作为 Ada 中的任务创建判别式传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24764524/

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