2016-05-27 22 views
0

Okay, so kann es nicht , dass seltsam, aber ich bin wirklich neu in Ada. In meinem Job übersetze ich Legacy-Ada in C und bin auf etwas gestoßen, das ich noch nicht gesehen habe. Ich suchte herum, konnte es aber nicht wirklich finden; hier ist es.Seltsames Paar Typ Deklarationen

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 

Exkurs-the Discrete.Does_Not_Matter verweist nur eine andere Art in einer anderen Bibliothek.

Es wäre toll, wenn mir jemand helfen könnte, mich zu orientieren und herauszufinden, was hier vor sich geht.

+3

Der Aufzählungstyp ist der Indextyp für das Array - so einfach. Sie können das Array mit 'for i in Discrete_Names loop ... my_array (i): = ...' durchlaufen und Sie können nichts außerhalb des Arrays indizieren. Oh, und es ist Ada, nicht ADA. –

+0

Bitte erwähnen Sie auch, wenn [* Enumeration Representation Clauses *] (http://www.ada-auth.org/standards/12rm/html/RM-13-4.html) in der Nähe lauern. – trashgod

+0

Danke, genau das passiert hier. Es gibt keine Aufzählungsrepräsentationsklauseln in der Nähe oder irgendwelche in diesem Modul überhaupt. –

Antwort

1

Nun, es ist ziemlich einfach. In Ada können Arrays mit jedem diskreten Typ indiziert werden, dh mit ganzen Zahlen, Zeichen oder Aufzählungstypen (Ihr Fall). Die Linie

type Discrete_Array_Type is Array (Discrete_Names) of Does_Not_Matter 

erklärt Discrete_Array_Type als Typ eines Arrays, die Werte von Typ enthält Does_Not_Matter und durch Werte vom Typ Discrete_Names indiziert ist.

Wenn Ihr Zweifel von der Tatsache herrührt, dass ENUM_POS_4Pos gleich 4 hat - so dass es scheint, dass der erste Index des Arrays 4 und nicht 0 ist - mein Vorschlag ist ... vergessen Sie es. Der Compiler wird sich darum kümmern. In Ada können Arrays von jedem Index aus beginnen. Zum Beispiel, wenn Sie

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

Bar sagen nur 6 Einträge lang sein (nicht 16) und wenn Sie Bar(12) die Compiler zugreifen - hinter den Kulissen - wird die anfängliche Offset „10“ bis „12“ entfernen damit Sie auf den dritten Speicherplatz zugreifen, der für Bar reserviert ist. (Eigentlich denke ich, dass aus Gründen der Effizienz wird 12 zur Adresse von Bar um das 10-fache der ganzzahligen Größen verringert, aber das ist ein Detail ...)

Meine persönliche Erfahrung ist, dass in solchen Fällen Sie sollten den Enumerationstyp nicht als eine "ganze Zahl in Verkleidung" betrachten (obwohl er intern durch eine Ganzzahl dargestellt wird), sondern wie ein eigener Typ, der zum Indizieren eines Arrays verwendet werden kann. Lassen Sie den Compiler sich um die internen Low-Level-Details kümmern.