我的问题包含一段较长的Ada代码。基本上,我尝试以面向对象的方式为带有标题的消息建模。两个原语操作Create_Message和Create_Message_Access可以用来创建具体消息对象。我不确定原始操作是否应返回类型Message_Type或Message_Type_Access。建议使用哪种类型(效率?)还是两种解决方案都不都是最佳选择?
我认为第一种方法是在堆栈上创建对象,然后在return执行语句后将其复制,因为变量Object超出了范围。对还是错?
function Create_Message (Title : String) return Message_Type is
Object : Message_Type;
begin
Object.Title := To_Unbounded_String (Title);
return Object;
end Create_Message;
Run Code Online (Sandbox Code Playgroud)
我认为第二种方法是在堆上创建对象,然后在执行语句后复制指针,return因为变量Object超出了范围。对还是错?
function Create_Message_Access (Title : String) return Message_Type_Access is
Object : Message_Type_Access := new Message_Type;
begin
Object.Title := To_Unbounded_String (Title);
return Object;
end Create_Message_Access;
Run Code Online (Sandbox Code Playgroud)
后来,我创建了一个带有标题的示例对象,使用原始操作Updated_Title来更改标题并将其更改回末尾。
First_Message := Message.Create_Message ("First");
Ada.Text_IO.Put_Line (First_Message.Get_Title);
First_Message.Update_Title ("First changed");
Ada.Text_IO.Put_Line (First_Message.Get_Title);
First_Message.Update_Title ("First");
Ada.Text_IO.Put_Line …Run Code Online (Sandbox Code Playgroud) 在haskell中找到最少的列表真的很容易:
foldl1 (min) [9,5,7,3,7,4,6,10]给了我3.;)
我换成min与<=测试如果列表进行排序:
foldl1 (<=) [9,5,7,3,7,4,6,10]
我收到此错误消息:
No instance for (Num Bool) arising from the literal `9'
Possible fix: add an instance declaration for (Num Bool)
In the expression: 9
In the second argument of `foldl1', namely `[9, 5, 7, 3, ....]'
In the expression: foldl1 (<=) [9, 5, 7, 3, ....]
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个错误?
我创建了以下示例代码:
with Ada.Text_IO;
procedure Main is
type My_Type is
(A,
B,
C);
procedure Foo (The_Type : My_Type) is
begin
null;
end Foo;
procedure Bar (B : String) is
begin
-- Error
Foo (The_Type => B);
-- Ok
Foo (The_Type => My_Type'Succ (A));
-- Ok
Foo (The_Type => My_Type'Value ("B"));
end Bar;
begin
Bar ("Hello");
end Main;
Run Code Online (Sandbox Code Playgroud)
B枚举类型中定义的文字在My_Type过程中也用作参数名称Bar。不幸的是,编译器假定过程调用中Foo (The_Type => B);的B是参数的名称,而不是B已定义的枚举类型中的文字。我发现了两个非最佳解决方案来解决该问题。如果我对重命名文字或参数名称不感兴趣,还有其他解决方案吗?
我想知道 Ada 提供哪些功能来实现两个正在运行的可执行文件(不是任务)之间的(简单)形式的进程间通信?我假设两个可执行文件都是用 Ada 编写的。
想象一下,一个可执行文件定期从传感器读取数据,a而另一个可执行文件有兴趣定期处理这些值b。我认为该包Ada.Streams.Stream_IO可用于序列化传感器数据并将其写入文件,但我不确定如何同步写入(第一个可执行文件)和读取(第二个可执行文件)操作。可以使用 pragmaShared_Passive来解决此类问题吗?
我想实现一个控制工作任务的几个实例的主任务。每个工作任务都有三个不同的阶段:
在开始时,主任务应该初始化所有工作任务(同时)。每个工作任务都有s几秒钟的时间来成功完成其初始化,但s不能保证以秒为单位的完成。
我有什么有效的可能性(信号机制)让主任务监视所有工作任务的初始化状态?我想让每个工作任务访问一个工作任务特定的受保护类型对象,并通过一个过程来设置一个布尔标志,该标志将由单个工作任务在成功完成初始化后设置。
主任务触发所有工作任务的初始化后,它可以记住当前时间并进入循环,通过使用在受保护对象类型中声明的函数来检索初始化状态来定期轮询工作任务初始化状态。如果所有工作任务都已初始化或已过几s秒钟,则退出循环。
我是否必须使用适当的时间值在监视器循环内使用延迟语句来使用这样的轮询概念?我阅读了有关入口调用超时的信息。我可以使用这样的超时来阻止轮询吗?
工作任务成功完成初始化后,它应该等待来自控制任务的信号以执行一个工作包。所以我认为工作任务应该有一个Do_Work条目,因此主任务应该为循环中的所有工作任务调用这些条目,对吗?
主任务可以使用适当的机制来检查是否所有工作任务都已完成其工作包。发生这种情况后,工作任务应该以确定性的方式(不是同时)报告他们的工作结果。因此,如果我Report_Result在工作任务中使用一个条目来等待来自主任务的信号,则在控制任务的循环中调用此条目将导致报告结果的不确定顺序。是否也可以以阻塞方式调用这些条目(如正常过程调用)?