Une contrainte d'interval, est par exemple de la forme 0..255 et peut être utilisée dans une déclaration de type comme type T is range 0..255;. [RM95 3.5 (2)]
Une référence à un attribut, est par exemple de la forme Integer'First, cette expression désignant la plus petite valeur du type Integer. [RM95 4.1.4]
Il est donc possible de créer une contrainte d'interval, avec des références à attributs. Et on devrait même avoir par exemple Integer'First..Integer'Last équivalent à Integer'Range (First, Last et Range, étant tous trois des attributs valides du type Integer)
Now and then the problem arise, as follow...
Je déclare ceci ...
Jusque là, Ok...type T is range 0..16#FFFFFFFF#;
for T'Size use 32; -- Exige que T soit physiquement sur 32 bits.
type U is range 0..65535;
for U'Size use 16; -- Exige que U soit physiquement sur 16 bits.
Je poursuis en déclarant
Et là, le compilateur me dit qu'il attend un T en lieu et place de U. Pourtant bien sûr, rien n'oblige à ce que V ait la même contrainte d'intetval que T. Bien au contraire...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 type V is new T range U'Range;
Même chose si j'essai de déclarer ...
Mais si je déclare d'une autre manière ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 type V is new T range U'First..U'Last;
Là, le compilateur l'accepte. Les deux formes, type V is new T range U'Range; et type V is new T range 0..65535;, devraient pourtant êtres équivalentes, je pensais. Je ne comprends pas, parce U'Range est bien 0..65535, donc la même chose... et U'First est bien 0 et U'Last est bien 65535.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 type V is new T range 0..65535;
Alors pourquoi le compilateur refuse la première et la deuxième forme, mais accepte la troisième ? J'ai un peu cherché dans le RM95, mais je n'ai pas trouvé la réponse.
Do some one know about it ?
Merci beaucoup par avance, shoukran jazilan
(n.b. le compilateur est GNAT sous Windows)
Partager