IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ada Discussion :

Constraint_error avec des strings


Sujet :

Ada

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 32
    Points : 25
    Points
    25
    Par défaut Constraint_error avec des strings
    Bonjour !

    Voilà j'ai quelques difficultés avec la manipulation des strings: je déclare des entiers de 40 caractères comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type Nom_Prenom is record
       Prenom,nom: String(1..40);
    end record;
    Mais par la suite je reçois des "constraints_errors" lorsque je veux affecter des chaînes de moins de 40 caractères, par exemple ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Defaut_nom:Nom_Prenom:=("0","0");
    Est_il possible d'avoir des strings déclarés à 40 caractères mais contenant moins en pratique? (mon 40 correspondant à une borne supérieure) Et si oui comment faire ?

  2. #2
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 119
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par Helifyl
    Bonjour !

    Voilà j'ai quelques difficultés avec la manipulation des strings: je déclare des entiers de 40 caractères comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type Nom_Prenom is record
       Prenom,nom: String(1..40);
    end record;
    Mais par la suite je reçois des "constraints_errors" lorsque je veux affecter des chaînes de moins de 40 caractères, par exemple ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Defaut_nom:Nom_Prenom:=("0","0");
    Est_il possible d'avoir des strings déclarés à 40 caractères mais contenant moins en pratique? (mon 40 correspondant à une borne supérieure) Et si oui comment faire ?
    La reponse est non. Une String de 40 caracteres fera toujours 40 caracteres, d'ou l'explosion dans ton code.
    Dans ce cas, tu peux toujours faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Defaut_nom : Nom_Prenom := (Prenom => ('0' , others => ' '),
                                Nom     => ('0' , others => ' '));
    Sinon, pour etre plus "sioux", tu peux utiliser un type variant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    subtype Length_T is Integer range 0 .. 40;
     
    type Boxed_String_T(Length : Length_T := 0) is
      record 
         Data : String(1 .. Length);
      end record;
     
    type Nom_Prenom is record
       Prenom : Boxed_String_T;
       Nom     : Boxed_String_T;
    end record;
     
    Value : Nom_Prenom := (Prenom => (Length => 1 , Data => "0"),
                           Nom    => (Length => 1 , Data => "0"));
    Dans ce cas, ta chaine a une taille qui varie de 0 a 40 (conditionnee par le discriminant Length).
    On peut aussi regler le probleme avec des pointeurs, mais beurk.

    Enfin, une autre possibilite est d'utiliser des Unbounded_String plutot que des String.

    A+

    Juan

    EDIT : boulette de copier/coller

  3. #3
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    ...... et pour être carrément Cheyenne, tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    type String_Reference_Type is access String;
     
    type Name_Surname_Type is
    record
        Name : String_Reference_Type;
        Surname : String_Reference_Type;
    end record;
     
    -- Hint : les chaîne peuvent êtres soit créées dynamiquement par
    -- allocation avec new (si par exemple elles sont lues d'un fichier ou
    -- interactivement fourni par l'utilisateur(ice), soit créées statiquement
    -- quand il s'agit de chaînes constantes ou connues avant l'execution
    -- du programme.
    --
    -- Exemple...
    -- My_Name : aliased String := "Enought";
    -- My_Surname : aliased String := "Clever";
    -- My_Identification : Name_Surname_Type := (My_Name'Access, My_Surname'Access);
    ... méthode de loin la plus efficace en terme de gestion, comme de gestion mémoire aussi. Et c'est bien connu, les Sioux et les Cheyennes savaient gérer leurs ressources... Eux...

    Avec cette méthode, non seulement tu ne gaspie pas des octets inutilisés par des chaînes inférieur à 40 caractères (cas qui sera évidement le plus fréquent), tu tombe pas dans un travers avec une chaîne dépassant 40 caractère (cas tout à fait possible).. tout ceci étant important si l'application doit pouvoir créer et/ou gérer un grand nombe d'instance de ta structure.

    Plus encore même : si tu as plusieurs membres d'une même famille, tu ne duplique pas les nom inutilement d'où économie d'execution, économie de mémoire, et même fiabilité accrue. Idem pour les prénoms qui ne sont pas en nombre infini, mais qui définissent un ensemble fixé (ou presque), et tu pourra au lieu de copier à chaque fois des prénoms, plutôt faire référence à des prénoms dans un pool de prénoms existants et connu par le système (avec là aussi, avantage en terme de gestion et de fiabilité).

    Maintenant Sioux et Cheyenne fumer calumet (en cachette)...
    ------------------------------------------------------------
    Sur le web, c'est la liberté qui est gratuite, mais bien évidement pas la consomation ... et encore moins la consomation à outrance
    ------------------------------------------------------------
    Language shapes the way we think, and determines what we can think about [ B. Lee Whorf ] ... mais ce n'est pas tout à fait vrai à 100%...
    ------------------------------------------------------------
    Pascal (FreePascal?) - Ada (Gnat-3.15p)
    XSLT (XSLTProc) - CGI binaires (Ada/C) [ Clavier Arabe ]
    ------------------------------------------------------------

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Merci pour vos réponses!

    Je vais plutôt pencher pour la méthode des "Sioux" (je ne savais pas qu'on pouvait faire des types variants) qui m'a l'air plus à mon niveau.

    Je ne comprends pas tout dans ta méthode Hibou57: à quoi correspondent les termes "access" et "aliased" ??

    Et même en ce qui concerne la méthode de jc-miranda, comment fait-on pour récupérer la longueur d'une chaîne? Prenom(length) ? Prenom.length ?

    Désolé si mes questions sont un peu bêtes, je débute en ADA...

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 119
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par Helifyl
    Et même en ce qui concerne la méthode de jc-miranda, comment fait-on pour récupérer la longueur d'une chaîne? Prenom(length) ? Prenom.length ?
    Avec la structure Boxed_String_T que je t'ai propose, tu as deux solutions :
    - Lire le discriminant Length ---> Value.Prenom.Length
    - Lire la taille de data directement ---> Value.Prenom.Data'Length


    Désolé si mes questions sont un peu bêtes, je débute en ADA...
    Pas de souci, pense juste a jeter un oeil sur les cours presents sur ce site (le lien est indique dans un des sticky), surtout si tu veux jouer avec des variants qui doivent s'appeler type article a discriminant ou quelque chose du genre dans les cours.

    A+

    Juan

  6. #6
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par Helifyl
    [...] Je ne comprends pas tout dans ta méthode Hibou57: à quoi correspondent les termes "access" et "aliased" ??
    [..]
    Beh, désolé, j'avais pensé que ce serait plus simple pour toi que les structures avec variant (et je maintiens que c'est plus efficace, mais bon... c'est pas ta priorité je pense... si tu apprends)

    Alors, aliased signifie que la variable en question pourra être accédée par référence (en Ada, contrairement à ce qui est avec d'autres langages, on ne peut pas faire des références à tous-et-n'importe-quoi). Ce mot clé ne serait d'aucune utilité sans access, qui renvoi la référence à la variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    My_Name : aliased String; -- My_Name est déclaré comme pouvant être
    -- accédée par référence. On pourra par la suite, utiliser My_Name'Access,
    -- qui renverra la référence à My_Name.
    Voili-voilou...

    Bon, à part ça, comment va Juan ? Pas trop faché j'espère que je prenne toujours plaisir à le contredire ...
    ------------------------------------------------------------
    Sur le web, c'est la liberté qui est gratuite, mais bien évidement pas la consomation ... et encore moins la consomation à outrance
    ------------------------------------------------------------
    Language shapes the way we think, and determines what we can think about [ B. Lee Whorf ] ... mais ce n'est pas tout à fait vrai à 100%...
    ------------------------------------------------------------
    Pascal (FreePascal?) - Ada (Gnat-3.15p)
    XSLT (XSLTProc) - CGI binaires (Ada/C) [ Clavier Arabe ]
    ------------------------------------------------------------

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 119
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par Hibou57
    Bon, à part ça, comment va Juan ? Pas trop faché j'espère que je prenne toujours plaisir à le contredire ...
    Non, pas de probleme.

    Je prefere des solutions sans pointeurs pour des raisons de fiabilité.
    Je n'y fais appel que si c'est absolument nécessaire.... parce qu'on peut très vite arriver à des énormes catas... références dans l'espace et j'en passe.

    Si mon applicatif peut se permettre de perdre 500Ko alors je préfère largement passer par un code statiquement défini.
    Si je n'ai pas le choix, alors oui, je fais dans le pointeur (smart pointer de préférence pour éviter les références dans le vide intersidéral)

    Maintenant chacun sa soupe.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    J'ai regardé le cours proposé sur le site et j'y vois un peu plus clair.

    J'opte définitivement pour la solution "Sioux" ( ) car bien que la méthode de Hibou57 soit intéressante elle fait appel non seulement aux pointeurs mais aussi à quelques notions de POO, et comme mon cours d'ADA (et le projet qui va avec) s'inscrit dans une initiation à la programmation, ça risque d'être un peu déplacé, et quelque peu prétentieux aussi.

    Encore merci à vous deux. Je ne clotûre pas tout de suite le sujet, je préfère attendre d'être sûr que ça marche

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. faire un switch avec des String
    Par samplaid dans le forum Langage
    Réponses: 1
    Dernier message: 03/03/2008, 16h46
  2. [XSLT]Problème sur une comparaison if avec des strings
    Par LoDev dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 18/01/2008, 09h27
  3. [C++/CLI] Problème avec des String^
    Par Kansuu dans le forum Windows
    Réponses: 1
    Dernier message: 02/08/2007, 09h25
  4. function stripslashes() avec des string
    Par rigel dans le forum Langage
    Réponses: 2
    Dernier message: 04/07/2006, 08h53
  5. comment faire switch avec des strings ?
    Par ilimo dans le forum C++
    Réponses: 2
    Dernier message: 18/04/2006, 21h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo