gpt4 book ai didi

enumeration - 在 Ada 中获取枚举类型的表示值

转载 作者:行者123 更新时间:2023-12-03 18:31:55 24 4
gpt4 key购买 nike

我需要获取与 Ada 中枚举类型的值相关联的数值。不是枚举中的位置,而是使用“for TYPE use”子句分配给每个值的值。

有谁知道这是否可能?

最佳答案

目前还没有完全通用的解决方案。枚举表示条款似乎旨在使这些信息难以获得。 (但是 Ada 2020 将添加一个解决方案;有关详细信息,请参阅此答案的底部。)

这:

function Rep is new Ada.Unchecked_Conversion(Enum, Integer);

在大多数情况下可能有效,但有一些严重的警告:表示值必须在 Integer'First..Integer'Last 范围内,并且如果 EnumInteger 的大小不匹配(但它实际上与实现定义的 GNAT 不匹配) )。

正如 Simon Wright 所说,RM 推荐 Unchecked_Conversion ,但这不是一个非常令人满意的解决方案,并且很难确定一致的目标类型。

自 2007 RM 起,建议的支持级别为:

An implementation should support at least the internal codes in the range System.Min_Int..System.Max_Int.



这意味着转换为 Integer 并不总是足够的;值可能小于 Integer'First 或大于 Integer'Last 。即使所有值都在该范围内,也没有真正好的方法来确定与枚举类型大小相同的目标类型。例如,这个:
type Enum is (Ten, Twenty, Thirty);
for Enum use (10, 20, 30);
function Rep is new Ada.Unchecked_Conversion(Enum, Integer);

在 GNAT 中产生此警告:
warning: types for unchecked conversion have different sizes

但是在警告之后,Rep 确实返回了预期值 10、20 和 30。

RM 明确指出,如果 Unchecked_Conversion 实例中的源和目标大小不匹配,并且结果类型为标量,则

the result of the function is implementation defined, and can have an invalid representation



因此,上述适用于 GNAT 的事实并不意味着它可以保证在任何地方都适用。

对于仅支持 System.Min_Int..System.Max_Int 范围内的值的实现,您可以执行以下操作:
type Enum is (...);
for Enum use (...);
type Longest_Integer is range System.Min_Int .. System.Max_Int;
function Rep is new Ada.Unchecked_Conversion(Enum, Longest_Integer);

并忽略警告。但是编译器可以接受大于 System.Max_Int 的值,只要它们在某个整数类型的范围内。例如,GNAT 拒绝这一点,但另一个 Ada 编译器可能会接受它:
type Longest_Unsigned is mod System.Max_Binary_Modulus;
type Unsigned_Enum is (Zero, Huge);
for Unsigned_Enum use (0, Longest_Unsigned'Last);

并且从这个到任何有符号整数类型的 Unchecked_Conversion 将不起作用。如果大小不匹配,您仍然存在实现定义结果的潜在问题。

这是一个适用于任何枚举类型的通用解决方案,如果(a)表示值在 System.Min_Int..System.Max_Int 范围内,并且(b)如果 Unchecked_Conversion 的实现比 Ada 标准要求的表现更好:
type Longest_Signed is range System.Min_Int .. System.Max_Int;

generic
type Enum is (<>);
function Generic_Rep(E: Enum) return Longest_Signed;

function Generic_Rep(E: Enum) return Longest_Signed is
function Rep is new Ada.Unchecked_Conversion(Enum, Longest_Signed);
begin
return Rep(E);
end Generic_Rep;

考虑到所有这些困惑,您可能会考虑使用除枚举表示子句之外的某种机制来完成您想要做的任何事情。

更新:

GNAT 具有实现定义的属性 'Enum_Rep'Enum_Val 。预计 Ada 2020 将采用它们。

http://www.ada-auth.org/standards/2xrm/html/RM-13-4.html#p10.1

关于enumeration - 在 Ada 中获取枚举类型的表示值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9503897/

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