Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Type Variant

22 views
Skip to first unread message

Frédéric PRACA

unread,
Jan 26, 2017, 7:59:11 AM1/26/17
to
Bonjour à toutes et à tous,
en jouant avec les variants, je me suis posé une question.

Dans le code suivant :
with Ada.Text_IO; use Ada.Text_IO;

procedure Test_Variant is

type Formes is (CARRE, RECTANGLE);

type Forme(De_Type : Formes) is
record
case De_Type is
when CARRE =>
Cote : Positive;
when RECTANGLE =>
Longueur : Positive;
Largeur : Positive;
end case;
end record;

ma_forme : Forme := (RECTANGLE, 5, 3);
begin
Put_line(Positive'Image(ma_forme.Cote));
ma_forme.Longueur := -1;
Put_line(Positive'Image(ma_forme.Longueur));
end Test_Variant;

pourquoi le compilateur Gnat ne fournit-il qu'un warning et pas une erreur de compilation lorsque l'on référence un composant inexistant ?
D'ailleurs, je me suis aussi toujours posé la question de l'intérêt d'un avertissement en lieu et place d'une erreur lorsque le compilateur sait à la compilation qu'une valeur sera hors plage.

Je ne doute pas de vous voir éclairer ma lanterne :)

Fred

J-P. Rosen

unread,
Jan 26, 2017, 8:29:02 AM1/26/17
to
Le 26/01/2017 à 13:59, Frédéric PRACA a écrit :
> pourquoi le compilateur Gnat ne fournit-il qu'un warning et pas une
> erreur de compilation lorsque l'on référence un composant inexistant
> ? D'ailleurs, je me suis aussi toujours posé la question de l'intérêt
> d'un avertissement en lieu et place d'une erreur lorsque le
> compilateur sait à la compilation qu'une valeur sera hors plage.
>
> Je ne doute pas de vous voir éclairer ma lanterne :)

La notion d'erreur est définie par la norme. Un programme Ada doit être
accepté s'il ne contient pas d'erreur, et ne doit pas être accepté s'il
en contient.

Les warning sont une gentillesse de la part du compilateur, sans aucune
obligation légale.

Dans ton cas, tout est statique donc il est facile de voir que ce n'est
pas correct, mais cela pourrait aussi bien être dynamique. Donc la règle
(au niveau de la norme) est: c'est diagnostiqué à l'exécution, pas à la
compilation. Le compilateur doit l'accepter, et il y a des tests pour
vérifier que l'exception est levée au bon endroit. Mais comme ça se voit
comme le nez au milieu de la figure, le compilateur te le dit quand
même... mais ça ne peut être qu'un warning.

--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr

Frédéric Praca

unread,
Jan 26, 2017, 5:04:52 PM1/26/17
to

> La notion d'erreur est définie par la norme. Un programme Ada doit être
> accepté s'il ne contient pas d'erreur, et ne doit pas être accepté s'il
> en contient.
>
> Les warning sont une gentillesse de la part du compilateur, sans aucune
> obligation légale.
Et bien utile :)

> Dans ton cas, tout est statique donc il est facile de voir que ce n'est
> pas correct, mais cela pourrait aussi bien être dynamique. Donc la règle
> (au niveau de la norme) est: c'est diagnostiqué à l'exécution, pas à la
> compilation. Le compilateur doit l'accepter, et il y a des tests pour
> vérifier que l'exception est levée au bon endroit. Mais comme ça se voit
> comme le nez au milieu de la figure, le compilateur te le dit quand
> même... mais ça ne peut être qu'un warning.
Effectivement, là, c'était évident et c'est pour ça que je m'attendais à
une erreur mais effectivement, la norme est très logique. Après tout, on
parle d'un compilateur, pas d'un outil d'analyse statique de code.

Merci pour cette réponse très claire
0 new messages