gratifiant > 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 :
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