奇怪的一对类型声明

时间:2016-05-27 15:15:53

标签: ada

好吧,所以它可能不是那个很奇怪,但我对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仅引用不同库中的另一种类型。

如果有人可以帮我解决问题并且弄清楚这里发生了什么,那就太棒了。

1 个答案:

答案 0 :(得分:1)

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

type Discrete_Array_Type is Array (Discrete_Names) of Does_Not_Matter

Discrete_Array_Type声明为包含Does_Not_Matter类型值的数组类型,并使用Discrete_Names类型的值进行索引。

如果您的怀疑源于ENUM_POS_4 Pos等于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倍,但这是一个细节...)

我个人的经验是,在这种情况下你不应该把枚举类型看作是“伪装中的整数”(尽管它将在内部用整数表示),但是就像它自己的一种类型可以用来索引数组。让编译器担心内部的低级细节。