withada.text_io;useada.text_io;proceduretest_int_adaisbeginput_line(natural'image(natural'last+1));-- demander l'affiche du dernier naturel + 1 endtest_int_ada;
renvoie à la compilation: test_int_ada.adb:4:39: value not in range of type "Standard.Integer" test_int_ada.adb:4:39: static expression fails Constraint_Check
Donc non le type natural n'est pas du tout cyclique. Mais...
Ada gère les types modulaires
Par exemple, si tu écris :
typemy_mod_7ismod7;-- ce type représente les éléments de Z/7Z[...]put_line(my_mod_7'img(my_mod_7'mod(8)));-- on affiche le représentant de la classe de 8
alors ça t'affiche 1.
Ada fait dont exactement ce qu'on lui demande dans la mesure du réalisable avec les types primitifs gérables par la machine.
Si on veut un comportement modulaire, on définit comme ci-dessus le type, et on dispose de toute l'arithmétique (cohérente) sur ce type dans les limites offertes par la machine.
Maintenant, si on veut dépasser les limites du jeu d'instruction du processeur et qu'on veut faire de l'arithmétique multi-précision ils existe bien évidemment un binding Ada pour gmp.
Aucun warning, aucune erreur de compilation, aucune exception à l'exécution, et le programme boucle à l'infini car 'unsigned char' est vu comme un type modulaire (modulo 2^8) ce qui ne s'appuie sur aucun fait explicable (à part le fait de vouloir représenter la table ASCCI comme un cercle). Plus intéressant, il est impossible d'arriver à un tel comportement avec Ada.
[^] # Re: Du haut niveau pour gérer correctement du bas niveau
Posté par snowball (site web personnel) . En réponse au journal Un décalage de 64 bits, ça vous inspire comment ?. Évalué à 2.
Côté statique
renvoie à la compilation:
test_int_ada.adb:4:39: value not in range of type "Standard.Integer"
test_int_ada.adb:4:39: static expression fails Constraint_Check
Côté dynamique:
Renvoie:
raised CONSTRAINT_ERROR : test_int_ada.adb:6 overflow check failed
Donc non le type natural n'est pas du tout cyclique. Mais...
Ada gère les types modulaires
Par exemple, si tu écris :
alors ça t'affiche 1.
Ada fait dont exactement ce qu'on lui demande dans la mesure du réalisable avec les types primitifs gérables par la machine.
Si on veut un comportement modulaire, on définit comme ci-dessus le type, et on dispose de toute l'arithmétique (cohérente) sur ce type dans les limites offertes par la machine.
Maintenant, si on veut dépasser les limites du jeu d'instruction du processeur et qu'on veut faire de l'arithmétique multi-précision ils existe bien évidemment un binding Ada pour gmp.
Comparaison avec C++
Aucun warning, aucune erreur de compilation, aucune exception à l'exécution, et le programme boucle à l'infini car 'unsigned char' est vu comme un type modulaire (modulo 2^8) ce qui ne s'appuie sur aucun fait explicable (à part le fait de vouloir représenter la table ASCCI comme un cercle). Plus intéressant, il est impossible d'arriver à un tel comportement avec Ada.