Règles du forum

Le langage Ada uniquement, pas les compilateurs. Les questions de sémantique et de langage et les questions techniques liées à une application en particulier, son deux choses différentes. Si nécessaire, un forum sur GNAT et les autres compilateurs, tel JanusAda, sera ouvert.

Auteur Message
Administrateur
Avatar de l’utilisateur
Où nous allons découvrir comment une spécificité de l’opérateur d’exponentiation, “**”, peut réserver une mauvaise surprise lorsqu’un type modulo s’invite sournoisement dans l’expression. Les règles de l’algèbre ne semblent plus avoir cours, découvrons comment et pourquoi…

Soit l’application Ada suivante :

Source Ada : 

with Ada.Text_IO;
use Ada.Text_IO;

procedure Trap is

type Modular_Type is mod 256;
subtype Index_Type is Natural range 1 .. 3;

M : Modular_Type := 255;
I : Index_Type := 3;

begin
-- 10 ^ 3 = 1000.
-- What will prints the below statement?

if M < 10 ** I then
Put_Line ("`M` is less than `10 ** I`.");
else
Put_Line ("`M` is greater‑than or equal‑to `10 ** I`.");
end if;

end Trap;


Pouvez‑vous, et avant même de vous jetez sur votre compilateur et d’exécuter l’application, prédire son résultat ?

Jouez le jeux, devinez, puis compilez l’application avant de la tester.

La réponse dans le spoiler ci‑dessous (cliquez le pour l’afficher)

Spoiler : cliquez sur le cadre pour l'afficher


Reprenez le programme précédent, en remplaçant “10 ** I” par “256 ** I”. Que constatez‑vous ?

Spoiler : cliquez sur le cadre pour l'afficher


Reprenez le programme initial, en remplaçant “10 ** I” par “Natural'Pos (10 ** I)”. Que constatez‑vous ?

Spoiler : cliquez sur le cadre pour l'afficher
Profil