Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Tutoriel] Apprendre à programmer avec Ada

problème lors de la lecture au clavier

Sujet résolu
    19 juin 2019 à 11:52:46

    Bonjour, en suivant le tutoriel Ada, je me suis retrouvé confronté à un problème. Pour le TP : gestion d'une bibliothèque, il faut récupérer un titre d'oeuvre pour après l'enregistrer dans un fichier. On utilise pour cela la fonction get_line. Le problème c'est que j'ai beau écrire n'importe quoi (en majuscule, en minuscule, avec des espaces ou sans), en mettant un skipline après l'instruction (car sinon il passe à l'instruction suivant sans récupérer mon texte), le programme n'enregistre rien (ou une chaine vide).

     function get_text(size : integer) return string is
          U : Unbounded_String := Null_Unbounded_String ;
          T : string(1..size) := (others => ' ') ;
       begin
          U := to_unbounded_string(get_line);
          Put("commande saisie : "&To_String(U));New_Line;
          if length(U) > size
             then T := to_string(U)(1..size) ;
             else T(1..length(U)) := to_string(U) ;
                  for i in length(U)+1..size loop
                     T(i) := ' ' ; 
                  end loop ; 
          end if ;
         return T ;
       end get_text ;
    
     function Saisie_Oeuvre(cat : T_Categorie) return T_Oeuvre is
          oeuvre : T_Oeuvre(cat);
          choixNote : Integer;
          choix : Character;
          support : Integer := 0;
       begin
          Put("Quel est le titre de votre oeuvre ? ");
          oeuvre.titre := get_text(50);--Skip_Line;
          Put("Quelle note donneriez-vous ? (entre 0 et 3) ");
          loop 
             get(choixNote);Skip_Line;
             if choixNote in 0..3
                then oeuvre.note := choixNote;
                exit;
             else Put_Line("ERREUR ! La note doit être comprise entre 0 et 3 !");
             end if;
          end loop;
          
    ....

    Le problème se situe au niveau de la ligne 24. Si je ne met pas le Skip_Line, le programme me demande directement la note, lorsque je met le skip_line, je peux rentrer du texte mais le programme ne l'enregistre pas.

    J'avais déjà eu le problème dans le chapitre consacré au unbounded string.

    Merci d'avance

    -
    Edité par Ryumizuhi 19 juin 2019 à 11:53:34

    • Partager sur Facebook
    • Partager sur Twitter
      21 juin 2019 à 20:40:07

      Salut Ryumizuhi,
      Déjà, bienvenue dans le magnifique monde d'Ada :D
      Pour ton problème:
      J'ai testé de mon coté, et ça fonctionne. Ton problème doit venir de l'endroit où tu appel « Saise_Oeuvre ». Tu as dû oublié un Skip_Line avant.
      Le Skip_Line après le Get_Text n'est pas nécessaire car tu lit une ligne entière dans le Get_Text.
      Et rigoureusement parlant, ça devrait être à Get_Text de rajouter son Skip_Line si tu faisait un Get au lieu d'un Get_Line dedans.
      Ensuite pour parler du code en lui même :
      Tu te complique beaucoup la vie dans Get_text.
      Ligne 7 plutôt que de faire une condition de si l'un est supérieur à l'autre, tu n'a qu'a affecter le résultat dans une variable et l'utiliser par la suite pour remplir la variable de type String.
      Ligne 10 à 12, tu fait mes des espaces après la zone écrite par le Unbounded, Ok, mais tu l'avais déjà fait ligne 3.
      Enfin, plutôt que de lui passer une taille tu pourrais directement lui passer la variable. Ça évitera d'aller changer dans tous le code par la suite si tu veux changer la taille de cette chaîne.
      Voila un exemple minimal fonctionnel :
      with Ada.Text_IO;
      with Ada.Strings.Unbounded;
      
      procedure Main is
         use Ada.Text_IO;
         
         package Integer_IO is new Ada.Text_IO.Integer_IO (Integer);
         use Integer_IO;
         
         subtype Name_String is String (1 .. 50);
      
         procedure Get_Text (Result : out Name_String);
         
         procedure Get_Text (Result : out Name_String) is
            use Ada.Strings.Unbounded;
            Terminal_Result : Unbounded_String := Null_Unbounded_String;
            Max_Size        : Natural          := 0;
         begin
            Result          := (others => ' ');
            Terminal_Result := To_Unbounded_String (Get_Line);
            
            Max_Size :=
             (if Length (Terminal_Result) > Result'Last then
                  Result'Last
              else Length (Terminal_Result));
            Result (Result'First .. Max_Size) :=
             To_String (Terminal_Result) (Name_String'First .. Max_Size);
         end Get_Text;
         
         choixNote : Integer;
         Name      : Name_String;
      begin
         Put ("Quel est le titre de votre oeuvre ? ");
         Get_Text (Name);
         Put_Line ("Nom de l'oeuvre: " & Name);
         Put ("Quelle note donneriez-vous ? (entre 0 et 3) ");
         loop
            Get (choixNote);
            Skip_Line;
            if choixNote in 0 .. 3 then
               Put_Line ("Choix:" & choixNote'Image);
               exit;
            else
               Put_Line ("ERREUR ! La note doit être comprise entre 0 et 3 !");
            end if;
         end loop;
      end Main;
      

      -
      Edité par Heziode 21 juin 2019 à 20:40:49

      • Partager sur Facebook
      • Partager sur Twitter
      Ensemble créons l'avenir !
        24 juin 2019 à 14:41:31

        Bonjour,

        j'ai rajouter un Skip_Line à chaque fois que je faisais un get_immediate dans mon code et cela fonctionne à présent.

        J'ai vais faire également l'optimisation que tu me conseille pour la fonction get_Text.

        Merci

        • Partager sur Facebook
        • Partager sur Twitter

        [Tutoriel] Apprendre à programmer avec Ada

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown