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 :

missing argument for parameter "item" in call to "get" avec une variable de type enum


Sujet :

Ada

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut missing argument for parameter "item" in call to "get" avec une variable de type enum
    Bonjour,

    J'ai le message d'erreur cité dans le titre je ne vois pas comment résoudre ce problème.

    Voici mon code :

    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
    20
    21
    with ada.text_io, ada.integer_text_io;
    use ada.text_io, ada.integer_text_io;
     
    procedure Main is
       type genre is (masculin, feminin);
       type perso is record
          name : string(1..5);
          birth : natural;
          sex : genre;
          tel : string(1..10);
       end record;
       employe : perso;
     
    begin
       get(employe.name);
       get(employe.birth);
       get(employe.sex); -- ligne 17:4
       get(employe.tel);
       put(employe.name); put(employe.birth); put(employe.tel);
     
    end Main;
    Le message d'erreur est le suivant :

    17:4 no candidate interpretations match the actuals :
    missing argument for parametre "item" in call to "get"
    17:15 exected type "standard.integer"
    found type "genre" define at line 5
    Je comprends que get attend un integer en paramètre mais comment faire pour que l'utilisateur rentre son genre dans la variable employe.sex.

    Merci.

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 29
    Par défaut
    bonjour hbx360,

    Il y a plusieurs choses qui ne vont pas dans ton code.

    En réalité, le système de résolution de surcharge ne trouve pas de procédure Get capable de lire ton énumération.

    En effet, tu as fait un « Ada.Text_IO » qui permet de lire des (chaînes de ) caractères, et « Ada.Integer_Text_IO » qui permet de lire des entiers.

    Or, tu n'a définis à aucun endroit comment lire ton type énumérer. Pour ce faire, en ce référant à l'annexe A.10.10 il faut instancié le package générique « Ada.Text_IO.Enumeration_IO » (qui est dans « Ada.Text_IO », donc pas besoins de faire un with suplémentaire) sur ton type énuméré « Genre » (et de faire un use de ce package instancié). De ce fait, tu rend visible une procédure Get capable de lire ton type.

    Ainsi avec quelque chose comme ceci, ça dois fonctionner.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    with Ada.Text_IO, Ada.Integer_Text_IO;
    use Ada.Text_IO, Ada.Integer_Text_IO;
     
    procedure Main is
       type Genre is (Masculin, Feminin);
       package Genre_IO is new Ada.Text_IO.Enumeration_IO (Genre);
       use Genre_IO;
       type Perso is record
          Name        : String (1 .. 5);
          Birth       : Natural;
          Sex         : Genre;
          Tel         : String (1 .. 10);
       end record;
       Employe : Perso;
     
    begin
       Get (Employe.Name);
       Get (Employe.Birth);
       Get (Employe.Sex);
       Get (Employe.Tel);
       Skip_Line;
     
       Put_Line ("Name: " & Employe.Name);
       Put_Line ("Sex: " & Employe.Sex'Image);
     
       Put ("Birth: ");
       Put (Employe.Birth);
       New_Line;
     
       Put ("Tel: ");
       Put (Employe.Tel);
       New_Line;
    end Main;
    Enfin, il n'y a absolument aucun contrôle de fait sur les entrées, donc il est très facile de faire planter le programme par exemple en saisissant un nom qui ne fait pas 5 caractères.

    Une solution pour se prémunir de ce genre de problème est de faire une boucle qui contient un bloc déclaratif permettant de gérer l'exception levée lors de la lecture, et de ne sortir de la boucle que lorsque tu obtiens résultat qui ne déclenche pas d'exception.

    Citation Envoyé par hbx360
    Je comprends que get attend un integer en paramètre
    Alors là… il n'y a absolument aucun raison d'attendre un entier pour lire un énumératif. Ada fournis un vrai type enémérer (cf 3.5.1).

    Pour bien comprendre, si je prend ton exemple, Masculin et Feminin sont des litéraux de ton type Genre, au même titre que 0, 1, 2, etc. sont des litéraux de Integer. Lorsqu'on parle de valeur numérique avec un énumératif, on parle alors de la position du litéral. De ce fait, tu ne peux pas faire :

    En revanche, tu peux faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Employe.Sex := Gender'Val (1);

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    Effectivement j'ai sapé le package.

    Merci pour ta réponse

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

Discussions similaires

  1. awk ou sed : Supprimer argument entre doubles quotes sur une ligne de fichier
    Par SuperJoker dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 18/05/2014, 22h08
  2. Invalid web service call, missing value for parameter
    Par lutecefalco dans le forum ASP.NET
    Réponses: 4
    Dernier message: 10/03/2010, 16h01
  3. [AC-2002] Quotes dans une variable
    Par Domi2 dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/06/2009, 17h51
  4. [VB]probleme double quote dans une ressource de type string
    Par JulienCEA dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/02/2006, 13h38
  5. quotes dans une variable
    Par requiemforadream dans le forum ASP
    Réponses: 3
    Dernier message: 09/05/2005, 10h55

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