problème de get sur les chaines de caracteres (buffer)

problème de get sur les chaines de caracteres (buffer) - Ada - Programmation

Marsh Posté le 11-05-2005 à 10:40:58    

bonjour,
 
Je voudrai savoir si il y a un moyen de vider le buffer en ada, j'ai un petit problème quand je fais une succession de get_line et get.
 
voilà un petit exemple:
 
with Text_Io,ada.Integer_text_Io,ada.Strings.Unbounded;
use Text_Io,ada.Integer_text_Io,ada.Strings.Unbounded;
 
procedure Principale is
   
   procedure Lire is
      Ch1,Ch2,ch3:String(1..100);
      nb_car1,nb_car2,nb_car3:integer:=0;
      Chx:Integer;
      Unb1,unb2,unb3:Unbounded_String:=null_unbounded_string;
   begin
      Put("chaine1:" );
      Get_Line(Ch1,Nb_Car1);
      Unb1:=To_Unbounded_String(Ch1(1..Nb_Car1));
      put(to_string(unb1));
      new_line(2);
       
      Put("choix en entier:" );
      Get(Chx);
      new_line;    
 
      Put("chaine2:" );
      Get_Line(Ch2,Nb_Car2);
      Unb2:=To_Unbounded_String(Ch2(1..Nb_Car2));
      put(to_string(unb2));
      New_Line(2);
       
      Put("chaine3:" );
      Get_Line(Ch3,Nb_Car3);
      Unb3:=To_Unbounded_String(Ch3(1..Nb_Car3));
      put(to_string(unb3));
      New_Line(2);
       
      Put("chaine1:" );Put(to_string(unb1));new_line;
      Put("chaine2:" );Put(to_string(unb2));new_line;
      put("choix:" );put(chx,0);new_line;
      Put("chaine3:" );Put(to_string(unb3));new_line;
       
   end Lire;
       
--***************************************************************************
begin
   lire;
end principale
 
J'obtient chaine1,chx mais ça saute l'instruction pour obtenir la chaine2 et après j'obtient correctement la chaine3, je pense qu'il s'agit d'un problème au niveau du buffer.
Le problème est que je voudrais aussi obtenir la chaine2.
 
Merci d'avance pour votre aide.

Reply

Marsh Posté le 11-05-2005 à 10:40:58   

Reply

Marsh Posté le 11-05-2005 à 11:43:28    

Salut... petites questions:  
(1) Peux tu m'expliquer pourquoi tu récupères des strings que tu transformes en unbounded_string ?
 
(2) As-tu réellement besoin de ces strings et unbounded string ? les Unb ne te suffiraient-elles pas ?
 
(3) J'ai fait quelques tests et avec cette version ça marche...

Code :
  1. with Text_Io,ada.Integer_text_Io,ada.Strings.Unbounded, Ada.Strings.Unbounded.Text_Io;
  2. use Text_Io,ada.Integer_text_Io,ada.Strings.Unbounded,Ada.Strings.Unbounded.Text_Io;
  3. procedure Principale is
  4.    procedure Lire is
  5.       Ch1            : String(1..100);
  6.       Chx            : Integer;
  7.       Last           : Positive;
  8.       Unb1,unb2,unb3 :Unbounded_String;
  9.    begin
  10.       Put("chaine1:" );
  11.       Unb1 := Get_Line;
  12.       Put_line(unb1);
  13.       Put("choix en entier:" );
  14.       Get_line(Ch1,Nb_car1);
  15.       New_Line;
  16.       Get(Ch1,Chx,Last);
  17.      
  18.       Put("chaine2:" );
  19.       Unb2 := Get_Line;
  20.       Put_line(unb2);
  21.       Put("chaine3:" );
  22.       Unb3 := Get_Line;
  23.       Put_line(unb3);
  24.       Put("chaine1:" );Put_Line(Unb1);
  25.       Put("chaine2:" );Put_line(unb2);
  26.       put("choix:" );put(chx,0);new_line;
  27.       Put("chaine3:" );Put_line(unb3);
  28.    end Lire;
  29. --***************************************************************************
  30. begin
  31.    lire;
  32. end Principale;


Dis moi ce que t'en pense ;)


Message édité par babar9160 le 11-05-2005 à 11:45:21
Reply

Marsh Posté le 11-05-2005 à 23:23:10    

(1) Peux tu m'expliquer pourquoi tu récupères des strings que tu transformes en unbounded_string ?
Je ne connaissais pas le package ada.strings.unbounded.text_io; :-)
 
(2) As-tu réellement besoin de ces strings et unbounded string ? les Unb ne te suffiraient-elles pas ?
Non, maintenant avec ce package j'ai plus besoin de passer par des strings.Les Unb suffissent.
 
(3) J'ai fait quelques tests et avec cette version ça marche...
Merci beaucoup pour l'aide.
 
Par contre à quoi correspond le type des paramètres dans le get de la ligne 19?
Voilà ce que j'ai trouvé. Est ce que c'est ça?
procedure Get(From : in String; Item : out Num; Last : out Positive);
 
 
@+ et bonne continuation

Reply

Marsh Posté le 12-05-2005 à 08:53:37    

Oui, c'est bien cette fonction que j'ai utilisé...
Euh par contre pour te dire exactement a quoi correspond le dernier paramètre, je ne sais pas vraiment.  
Son type, "Positive" se déduit tès facilement, c'est un entier positif... donc 0<=n qui est différent d'un "Natural" 0<N.
 
Les deux autres sont simples : String, ça tu connais...
et Num qui est déclaré comme ça, si je ne m'abuse
 
type Num is range <>;
 
Je ne m'avance pas trop en te disant que c'est un type interne au package qui correspond juste a un Integer ;)
 
En fait, j'ai un peu triché, en demandant que l'utilisateur saisisse non pas un entier directement, mais plutôt une chaine de caractère contenant cet entier... ce qui permet en fait de capter aussi le retour à la ligne - "get_line(String,Integer)" - et donc de laisser un buffer vide. Voilà...
 
Ah oui une petite astuce.. dans ton code original il y avait des new_line un peu partout.
en Ada si tu veux avoir un saut à la ligne dans l'affichage il y a trois manière :
- le new_line(x), pratique.
- le put_line(str).
- et l'utilisation du caractère de retour à la ligne "ASCII.LF". Il correspond à "\n" donc peut s'averer très utile. ;)
 
Sur ce, bon courage et vive Ada.


Message édité par babar9160 le 12-05-2005 à 08:58:53
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed