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

Type discret

30 views
Skip to first unread message

Olivier

unread,
Mar 12, 2013, 4:12:56 PM3/12/13
to
Bonjour,



Je bute sur le message d'erreur suivant : "expected a discrete type"

Je passe une chaᅵne de caractᅵres ᅵ une fonction qui doit la comparer ᅵ
d'autres.

FUNCTION VerifJour (s_Mois : IN String; s_Jour : in integer) RETURN
Boolean IS

bDateOk : boolean := false;

BEGIN

CASE s_Mois IS <- Erreur sur s_Mois : "expected a discrete type"

WHEN "janvier"|"mars"| "mai"| "juillet" =>

IF S_Jour IN 1..31 THEN

bDateOk := True;

ELSE

bDateOk := False;

end if;

end case;

return bDateOk;

end VerifJour;



if VerifJour(s_Mois => to_string(sMois), s_Jour => to_string(sJour))
then

end if;

J'envoie un string ᅵ la fonction qui attends un string, je ne comprends
pas le message d'erreur.

Pouvez-vous m'aiguiller sur cette erreur.

Merci


Ludovic Brenta

unread,
Mar 12, 2013, 6:26:44 PM3/12/13
to
Olivier <prog...@free.fr> writes:
> CASE s_Mois IS <- Erreur sur s_Mois : "expected a discrete type"
>
> WHEN "janvier"|"mars"| "mai"| "juillet" =>
[...]
> Pouvez-vous m'aiguiller sur cette erreur.

L'instruction case ne fonctionne que sur les variables de type
discret. Un type discret est un type avec un nombre fini de valeurs
possibles, c'est-à-dire un type entier ou énuméré (ARM 3.5(1)).

Essaie ceci pour voir (je n'ai pas compilé ni essayé):

type Month_French is
(Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Août, Septembre,
Octobre, Novembre, Décembre);

function Valid (Month_Name : in String; Day_In_Month : in Positive)
return Boolean is
begin
declare
Month : constant Month_French := Month_French'Value (Month_Name);
-- raises Constraint_Error if Month_Name is invalid
begin
case Month is
when Janvier | Mars | Mai | Juillet | Août | Octobre | Décembre =>
return Day_In_Month <= 31;
when Février =>
return Day_In_Month <= 29; -- beware of leap years!
when Avril | Juin | Septembre | Novembre =>
return Day_In_Month <= 30;
end case;
end;
exception
when Constraint_Error =>
-- Month_Name is invalid, don't check the Day_In_Month
return False;
end Valid;

--
Ludovic Brenta.

Yannick Duchêne (Hibou57)

unread,
Mar 15, 2013, 1:46:17 AM3/15/13
to
Le Tue, 12 Mar 2013 21:12:56 +0100, Olivier <prog...@free.fr> a écrit:

> Bonjour,
>
>
>
> Je bute sur le message d'erreur suivant : "expected a discrete type"
>
> Je passe une chaîne de caractères à une fonction qui doit la comparer à
> d'autres.
>
> FUNCTION VerifJour (s_Mois : IN String; s_Jour : in integer) RETURN
> Boolean IS
>
> bDateOk : boolean := false;
>
> BEGIN
>
> CASE s_Mois IS <- Erreur sur s_Mois : "expected a discrete type"


Ludovic a déjà répondu, j’ajoute seulement pour compléter et comprendre :
si Ada attend un type discret, c’est parce que Ada attend une couverture
exhaustive des cas, et c’est là justement l’intérêt de la construction
`case` en Ada.

Exemple:


type T is (A, B, C, D);
X : T = …;
-- suite
case X is
when A => …;
when C => …;
when D => …;
end case;


Dans un tel cas, Ada va râler et se plaindre qu’on a oublier le cas où `X`
est `B`, c’est ça l’intérêt (sauf si on utilise le cas `when others =>`,
que personnellement je n’aime pas à cause de la faille potentielle qu’il
présente).

La construction `case`, si elle s’appliquait aux types non‑discret,
pourrait s’appliquer à un ensemble potentiellement énorme (pas infini en
pratique, mais énorme) de valeur différentes, qu’il se serait plus
possible de prévoir ou de restreindre de manière déterministe.

Imagine la même construction `case` que ci‑dessus, mais avec `X` du type
`String`. Il est in‑envisageable que Ada puisse garantir la couverture de
tous les cas possibles avec un type `String`.

Voilà dans le principe, la raison pour laquelle Ada requière un type
discret… en fait, l’intention et de requérir un type dont l’ensemble des
valeur possible soit déterministe et prévisible, d’une manière raisonnable
(notes que cela exclus donc les type à flottant aussi des types possibles
pour une construction `case`).

Quand tu ne peux pas utiliser `case`, tu peux utiliser `if/elsif/else/end
if`.

P.S. C’est bizarre, je reçois toujours les messages de la version FR avec
plusieurs jours de retard :-/


--
“Syntactic sugar causes cancer of the semi-colons.” [1]
“Structured Programming supports the law of the excluded muddle.” [1]
[1]: Epigrams on Programming — Alan J. — P. Yale University

progidevs

unread,
Mar 15, 2013, 11:01:04 AM3/15/13
to
Olivier a pensᅵ trᅵs fort :
Merci ᅵ vous 2 pour vos excellentes rᅵponses. ^^

Olivier


0 new messages