Hello!

Inspiré(e) de prendre part à la discussion ? Ou de poser une question ou demander de l’aide ?

Alors bienvenues dans les grands sujets des forums de La Bulle : m’inscrire.

Cette partie du forum n’est pas compatible avec les bloqueurs publicitaires

Félicitations à vous, de préférer les accès payants plutôt que la gratuité par la publicité, c’est honnorable et cohérent de votre part. Malheureusement, l’accès payant par micropaiement (qui serait d’environ 1 cent pour 20 pages consultées) n’est pour l’instant pas encore mis en place, et l’accès gratuit sans publicité, est réservé aux membres actif(ve)s du forum. En attendant, si vous souhaitez poursuivre votre visite chez nous, vous pouvez ajouter le site à votre liste blanche, ou encore mieux, désactiver le bloqueur partout. Pour ajouter le site à votre liste blanche, pour Firefox (similaire pour les autres navigateurs), rendez‑vous en bas à gauche de la fenêtre de votre navigateur, et cliquez sur le menu comme dans l’exemple de l’image ci‑dessous, puis rechargez la page, en appuyant sur F5.

Restreindre les contraintes d’un sous‑type sans les fixer
Auteur Message
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 22210
Lun 6 Fév 2012 09:09
Message Restreindre les contraintes d’un sous‑type sans les fixer
Astuce en forme de présentation aux prédicats introduits par Ada 2012.

Soit l’ensemble de déclarations suivant :

Source Ada : 

package P is

type Index_Type is range 1 .. 1000;
type Text_Type is array (Index_Type range <>) of Character;

subtype Tiny_Index_Type is Index_Type range 1 .. 200;
subtype Tiny_Text_Type is Text_Type (Tiny_Index_Type range <>);

end P;


Cette spécification est rejetée, pourquoi ?

La réponse est dans la référence, section Subtype Declarations [Ada RM 2005 3.2.2].

On y voit que la définition d’un sous‑type, requière des contraintes explicites, et que la petite boite noir, le <>, qui signifie que cette partie est variable, n’est permise que pour une définition de type, mais pas pour la définition d’un sous‑type.

Remarque N°1. Attention, il y a un petit piège (un des rares petits pièges de Ada, l’autre principale ayant à voir avec les discriminants par défaut)

Source Ada : 

subtype Tiny_Text_Type is Text_Type (Tiny_Index_Type);


… n’aura pas le résultat que vous attendez. Cette construction équivaut en effet à :

Source Ada : 

subtype Tiny_Text_Type is Text_Type
(Tiny_Index_Type'First ..
Tiny_Index_Type'Last);


qui fixe les contraintes et ne les rend pas libres.

Remarque N°2. Définir un type dérivé au lieu d’un sous‑type ne sera pas non‑plus une solution.

Source Ada : 

type Tiny_Text_Type is new Text_Type (Tiny_Index_Type range <>);


Ça n’est pas de l’Ada valide non‑plus, comme le confirme la référence Derived Types and Classes [Ada RM 2005 3.4(2/2)] qui montre que la définition d’un type dérivé repose sur celle d’un sous‑type.

Si nous souhaitons que Tiny_Text_Type soit un sous‑type de Text_Type, mais ne voulons pas fixer les bornes du tableau définitivement, comment faire alors ?

Ada 2012 apporte la solution Petit sourire

Depuis Ada 2012, nous pouvons donner au type, un prédicat, qui précisera le nouvel intervalle permis pour les bornes du tableau, sans les geler.

Cette nouvelle construction se nomme « Prédicat de sous‑type ».
Voir : Subtype Predicates [Ada RM 2012 3.2.4].
Sa notation repose sur celle déjà connue des clauses de Spécifications d’Aspect.
Voir : Aspect Specifications [Ada RM 2012 13.3.1].

Deux type de prédicats existent pour les sous‑types. Les prédicats dynamiques et les prédicats statiques. Ici, un prédicat statique suffira, puisque le prédicat reposera sur une expression statique. Il faudra vous assurer de compiler votre programme avec le contrôle des prédicats activé et ne pas oublier que s’ils ne sont pas vérifiés, les prédicats renvoient des erreurs à l’exécution et non‑pas à la compilation, même s’il reste possible qu’un compilateur renvoie des avertissement à la compilation lorsqu’il a la certitude qu’un prédicat ne sera pas vérifié.

Voici finalement la manière de faire :

Source Ada : 

package P is

type Index_Type is range 1 .. 1000;
type Text_Type is array (Index_Type range <>) of Character;

subtype Tiny_Index_Type is Index_Type range 1 .. 200;

subtype Tiny_Text_Type is Text_Type
with Static_Predicate =>
(Tiny_Text_Type'First in Tiny_Index_Type) and
(Tiny_Text_Type'Last in Tiny_Index_Type);

end P;


Attention ! L’écriture suivante, même si on en devine le sens, n’est pas valide :

Source Ada : 

package P is

type Index_Type is range 1 .. 1000;
type Text_Type is array (Index_Type range <>) of Character;

subtype Tiny_Index_Type is Index_Type range 1 .. 200;

subtype Tiny_Text_Type is Text_Type
with Static_Predicate =>
Tiny_Text_Type'Range in Tiny_Index_Type;

end P;


La raison en est que le prédicat statique doit être une expression (booléenne), et il n’est pas permis d’utiliser l’attribut Range dans une expression. En effet, un intervalle, n’est pas une expression, mais une construction. Il faut en écrire un peu plus, et faire porter l’expression sur First et Last.

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Beau Parleur
Beau Parleur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 320
Dim 10 Avr 2016 01:13
Message Re: Restreindre les contraintes d’un sous‑type sans les fixer
Bonjour Hibou, j'essayer ton astuce mais sans y parvenir.
Le compilateur me dit que mon tableau n'est pas un scalaire.
Profil
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 22210
Dim 10 Avr 2016 01:52
Message Re: Restreindre les contraintes d’un sous‑type sans les fixer
Hello,

Peut‑être une erreur de syntaxe. Le message d’erreur signifie probablement que tu as utilisé un type inapproprié.

Il ne faut pas prendre le dernier exemple, qui est justement un exemple d’écriture semblant correcte mais ne l’étant pas. C’est l’avant dernier exemple, qui est correcte.

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Beau Parleur
Beau Parleur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 320
Dim 10 Avr 2016 15:37
Message Re: Restreindre les contraintes d’un sous‑type sans les fixer
J'ai pris le bon exemple, par d'erreur de syntaxe.
Je n'ai plus le code sous la main.

C'était un tableau de character tout normal comme toi.
Profil
cron