【问题标题】:Strange pair of type declarations奇怪的类型声明对
【发布时间】:2016-05-27 15:15:52
【问题描述】:

好的,所以这可能并不那么奇怪,但我对 Ada 真的很陌生。在我的工作中,我正在将遗留的 Ada 翻译成 C,并且遇到了一些我还没有见过的东西。我四处寻找,但真的找不到;在这里。

type Discrete_Names is ( ENUM_POS_4,  --label names in an enum
                         ENUM_POS_5,  --that evaluate to 4, 5, and 6
                         ENUM_POS_6); --respectively
type Discrete_Array_Type is Array (Discrete_Names) of Discrete.Does_Not_Matter

旁注——Discrete.Does_Not_Matter 只是引用了不同库中的另一种类型。

如果有人能帮我弄清楚方向并弄清楚这里发生了什么,那就太好了。

【问题讨论】:

  • 枚举类型是数组的索引类型——就这么简单。您可以使用for i in Discrete_Names loop ... my_array(i) := ... 循环遍历数组,并且不能索引数组外的任何内容。哦,是艾达,不是艾达。
  • 另外,如果有Enumeration Representation Clauses潜伏在附近,请注明。
  • 谢谢,这正是这里发生的事情。附近没有枚举表示子句,或者这个模块中根本没有任何枚举表示子句。
  • Discrete_Names’Pos (ENUM_POS_4) 将始终为 0。如果您需要从 ENUM_POS_5 获取值 5,您可以使用枚举表示子句和 GNAT 的 ’Enum_Rep here。过去我只使用了一个由枚举索引的整数数组。
  • 作为noted,可以使用“Unchecked_Conversion”的实例来查询用于枚举类型的内部代码。结果应该与'Enum_Rep 相同。您可以检查一下您的实现正在使用什么。

标签: ada


【解决方案1】:

嗯,这很简单。在 Ada 中,数组可以由任何离散类型索引,即整数、字符或枚举类型(您的情况)。线

type Discrete_Array_Type is Array (Discrete_Names) of Does_Not_Matter

Discrete_Array_Type 声明为包含Does_Not_Matter 类型值的数组的类型,并由Discrete_Names 类型的值索引。

如果您的疑问源于 ENUM_POS_4Pos 等于 4 的事实——因此数组的第一个索引似乎是 4 而不是 0——我的建议是......忘记它.编译器会处理这个问题。在 Ada 中,数组可以从任何索引开始。例如,如果你说

type Array_Foo is array(Positive range <>) of Characters;
Bar : Array_Foo(10..15);

Bar 将只有 6 个条目长(不是 16 个),当您访问 Bar(12) 时,编译器 - 在幕后 - 将删除初始偏移量“10”到“12”,以便您访问第三个内存位置保留给Bar。 (其实我觉得为了效率会在Bar的地址上加12减10倍的整数大小,不过这是个细节……)

我个人的经验是,在这种情况下,您不应将枚举类型视为“伪装的整数”(尽管它在内部将由整数表示),而应将其视为可用于索引一个数组。让编译器担心内部低级细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多