Je compile avec GNAT sur Mac OS X.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 with Ada.Text_IO; use Ada.Text_IO; procedure Essai is type Entier is new Integer range -2E9 .. 2E9; procedure Somme(X, Y: in Entier) is pragma Unsuppress(Overflow_Check); pragma Unsuppress(Range_Check); begin Put_Line(Entier'Image(X) & " + " & Entier'Image(Y) & " = " & Entier'Image(Entier'(X + Y))); exception when Constraint_Error => Put_Line("Erreur dans Somme"); end Somme; Z: Entier := Entier'Last; --E: Entier := Z + Z; -- Toujours erreur à l'exécution begin Somme(Z, Z); end Essai;
Sur ma machine, l'exécution du code ci-dessus (sans les pragmas) donne :
Je redéfinis le type Entier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 2000000000 + 2000000000 = -294967296
Maintenant à l'exécution j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part type Entier is new Integer range -1E9 .. 1E9;
Je n'en suis pas sûr, mais je pense que c'est en rapport avec RM 3.5.4 (24)
Code : Sélectionner tout - Visualiser dans une fenêtre à part Erreur dans Somme
Peut-on assumer que les types suivants lanceront toujours une exception en cas de dépassement si on les utilise avec les opérateurs prédéfinis "+" et "*" ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Entier_Sommable_Max: constant Integer := Integer'Last / 2; subtype Entier_Sommable is Integer range -Entier_Sommable_Max .. Entier_Sommable_Max; Entier_Multipliable_Max: constant Integer := Integer(Float'Floor(Sqrt(Float(Integer'Last)))); subtype Entier_Multipliable is Integer range -Entier_Multipliable_Max .. Entier_Multipliable_Max;
Partager