Auteur | Message |
---|---|
Administrateur
![]() |
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 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 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 ![]() 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 Attention ! L’écriture suivante, même si on en devine le sens, n’est pas valide : Source Ada :package P is 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. |
Beau Parleur
![]() |
Bonjour Hibou, j'essayer ton astuce mais sans y parvenir.
Le compilateur me dit que mon tableau n'est pas un scalaire. |
Administrateur
![]() |
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. |
Beau Parleur
![]() |
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. |