好吧,所以它可能不是那个很奇怪,但我对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仅引用不同库中的另一种类型。
如果有人可以帮我解决问题并且弄清楚这里发生了什么,那就太棒了。
答案 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倍,但这是一个细节...)
我个人的经验是,在这种情况下你不应该把枚举类型看作是“伪装中的整数”(尽管它将在内部用整数表示),但是就像它自己的一种类型可以用来索引数组。让编译器担心内部的低级细节。