Discussion:
Type Variant
(trop ancien pour répondre)
Frédéric PRACA
2017-01-26 12:59:10 UTC
Permalink
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
2017-01-26 13:28:56 UTC
Permalink
Post by Frédéric PRACA
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
2017-01-26 22:04:51 UTC
Permalink
Post by J-P. Rosen
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 :)
Post by J-P. Rosen
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

Continuer la lecture sur narkive:
Loading...