problème de get sur les chaines de caracteres (buffer) - Ada - Programmation
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 :
|
Dis moi ce que t'en pense
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
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.
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.