gpt4 book ai didi

ada - 无法访问 Ada 泛型参数的成员

转载 作者:行者123 更新时间:2023-12-04 17:05:29 27 4
gpt4 key购买 nike

我正在尝试编写一个通用包,所需的操作之一是对通过总线接收的数据记录进行校验和。记录类型会有所不同,它是一个通用参数。但是,任何访问泛型参数成员的尝试都会导致编译错误。

错误......(Ada 95 GNAT 2009)

file.adb:XX no selector "Data" for private type "The_Transfer_Type" defined at file.ads:YY

宣言...
generic
type The_Transfer_Type is private;
SIZE : Integer;
package CC_Test_Channel is
function Checksum(Msg : The_Transfer_Type) return Integer;
end package

还有 body ...
function Checksum(Msg : The_Transfer_Type) return Integer is
Sum : Integer := 0;
begin
-- calculate the checksum
for i in 1 .. SIZE loop
Sum := Sum + Integer(Msg.Data(i));
end loop;
return Sum;
end Checksum;

最佳答案

当您指定泛型参数是私有(private)类型时,Ada 假设您是认真的 :-)

IE。您无权访问其组件。 Ada 不是“duck typed”,因此您是否知道实例化类型实际上可能拥有特定字段是无关紧要的。 (如果 The_Transfer_Type 参数是用整数实例化的,您希望您的 Checksum 函数如何工作?)

解决此问题的一种方法是还提供一个访问器函数作为泛型的参数,该函数将检索所需的数据,在这种情况下,计算校验和。例如。:

generic
type The_Transfer_Type is private;
with function Get_Checksummable_Data_Item
(Msg : The_Transfer_Type;
I : Integer) return Integer;
SIZE : Integer;

package CC_Test_Channel is
function Checksum(Msg : The_Transfer_Type) return Integer;
end CC_Test_Channel;

那么 body 是:
function Checksum(Msg : The_Transfer_Type) return Integer is
Sum : Integer := 0;
begin
-- calculate the checksum
for i in 1 .. SIZE loop
Sum := Sum + Get_Checksummable_Data(Msg, I);
end loop;
return Sum;
end Checksum;

然后,您为 Get_Checksummable_Data 提供的函数特定于 The_Transfer_Type,并简单地返回从 The_Transfer_Type 的组件字段中选择的值。

还有许多其他方法可以设置它,比如提供一个不受约束的数组类型作为通用形式参数和一个形式函数来检索它——这也允许您摆脱显式 SIZE 形式参数。或者您可以编写一个 Checksum() 函数作为您正在实例化 CC_Test_Channel 的类型的操作之一,然后具有:
with function Calculate_Checksum(Msg : The_Transfer_Type) return Integer;

作为通用形式之一。

退后一步,想想可能性……

关于ada - 无法访问 Ada 泛型参数的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2338913/

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