cerhu > comp.lang.* > comp.lang.ada

Frédéric Praca (20/08/2019, 18h19)
Bonjour les gens :)

Alors que je m'amusais avec les Formal_Hashed_Maps, je suis tombé sur une
erreur que je ne comprends pas.
Le code ci-dessous renvoie un message "discriminant check failed".
Que se passe-t-il ? Où ai-je fait une erreur ?

with Ada.Containers.Formal_Hashed_Maps;
with Ada.Strings; use Ada.Strings;
with Ada.Strings.Hash;

procedure Formal_Map is
MAX_SIZE : constant := 128;
subtype size_range is Integer range 1 .. MAX_SIZE;

type Bounded_String is record
Len : size_range;
Data : String (size_range'Range);
end record;

function "=" (X, Y : Bounded_String) return Boolean is
(X.Len = Y.Len and then X.Data (1 .. X.Len) = Y.Data (1 .. Y.Len));

function SBHash (X : Bounded_String) return Ada.Containers.Hash_Type is
(Ada.Strings.Hash (X.Data (1 .. X.Len)));

function to_Bounded_String (source : String) return Bounded_String is
result : Bounded_String :=
Bounded_String'(Len => source'Length, Data => (others => ' '));
begin
result.Data (1 .. result.Len) := source (source'First ..
source'Last);
return result;
end to_Bounded_String;

package Structures_Map is new Ada.Containers.Formal_Hashed_Maps
(Key_Type => Bounded_String, Element_Type => Integer, Hash => SBHash,
Equivalent_Keys => "=");

MAX_RECORDS : constant Ada.Containers.Count_Type := MAX_SIZE;
Repository : Structures_Map.Map (MAX_RECORDS,
Structures_Map.Default_Modulus (MAX_RECORDS)) :=
Structures_Map.Empty_Map;

begin
null;
end Formal_Map;

Pour info, je compile avec GNAT Community 2018 (20180524-73) sur une
Ubuntu 18.04 LTS.

Fred
J-P. Rosen (20/08/2019, 20h48)
Le 20/08/2019 à 18:19, Frédéric Praca a écrit :
> Le code ci-dessous renvoie un message "discriminant check failed".
> Que se passe-t-il ? Où ai-je fait une erreur ?

Peux-tu nous mettre le numéro de ligne? Ca simplifiera pour chercher...
Frédéric Praca (21/08/2019, 08h17)
Je m'en suis rendu compte après avoir posté et je n'ai pas eu le temps de
refaire un message.

C'est la déclaration ligne 34 qui renvoie l'exception:
Repository : Structures_Map.Map (MAX_RECORDS,
Structures_Map.Default_Modulus (MAX_RECORDS)) :=
Structures_Map.Empty_Map;

Le Tue, 20 Aug 2019 20:48:48 +0200, J-P. Rosen a écrit :
[..]
J-P. Rosen (21/08/2019, 09h29)
Le 21/08/2019 à 08:17, Frédéric Praca a écrit :
> Je m'en suis rendu compte après avoir posté et je n'ai pas eu le temps de
> refaire un message.
> C'est la déclaration ligne 34 qui renvoie l'exception:
> Repository : Structures_Map.Map (MAX_RECORDS,
> Structures_Map.Default_Modulus (MAX_RECORDS)) :=
> Structures_Map.Empty_Map;

Max_Records n'est pas nul, Empty_Map a un discriminant "capacity" qui
est nul, donc c'est normal de lever Constraint_Error.

Ceci-dit, c'est quoi ce Formal_Hashed_Maps? Vraisemblablement un truc
interne à Gnat, en tout cas ce n'est pas dans la norme. Pourquoi ne pas
utiliser les conteneurs normaux?
Frédéric PRACA (21/08/2019, 10h35)
Le mercredi 21 août 2019 09:29:28 UTC+2, J-P. Rosen a écrit :

> Max_Records n'est pas nul, Empty_Map a un discriminant "capacity" qui
> est nul, donc c'est normal de lever Constraint_Error.


Ah ! Bien vu !! Pour moi, Empty_Map était un moyen d'initialiser ma Map mais en fait, cela ne doit pas être ça. On dirait plutôt un truc à la Null_qqchose :D
Forcément, cela ne peut que m'exploser à la figure.

> Ceci-dit, c'est quoi ce Formal_Hashed_Maps? Vraisemblablement un truc
> interne à Gnat, en tout cas ce n'est pas dans la norme. Pourquoi ne pas
> utiliser les conteneurs normaux?


Formal_Hashed_Maps, c'est un conteneur pour Spark parce qu'à l'origine, le code qui contient cette déclaration est un code Spark. Il utilisait autrefois un conteneur standard mais forcément, le passage à Spark a un peu tout changé :)

En tout cas, je suis d'accord qu'il est assez maladroit d'avoir placé ça dans un package standard.

Merci, je vais essayer ça dès que j'ai un créneau
Discussions similaires
session "gnome" runnable check failed

Lenght check failed

isolinux: Failed to locate CD-ROM device; boot failed.

Volume check failed with error 7


Fuseau horaire GMT +2. Il est actuellement 20h02. | Privacy Policy