Re: Affectation avec Standard_Output.
Pascal <[email protected]>
| Newsgroups | gmane.comp.lang.ada.france |
|---|---|
| Message-ID | <[email protected]> |
Merci Ludovic pour ta solution.
Je ne suis pas familier des Streams vu que Text_IO me suffisait jusque là.
Le problème : en fait suivant la nature du fichier de type Text, Write va écrire sur stdout, un fichier disque ou une fenêtre avec GTK.TextView.
Le nom me permet de faire l'aiguillage.
Qqs questionq :
Conserver le champ File est-il utile (pas utilisé dans Write) ?
Donc le type record doit-il alors rester limited ?
Comment se fait la gestion des lignes Put_Line, New_Line, Get_Line... ?
PS : pour simplifier l'exemple, la taille de Name est juste un clin d'oeil à un ancien système de trois lettres...
Merci, Pascal.
http://blady.pagesperso-orange.fr
Le 16 sept. 2011 à 15:52, Ludovic Brenta a écrit :
> Bonjour Pascal,
>
> Il me semble que c'est un de ces cas où l'on décrit la solution qui ne marche pas plutôt que le problème... Par exemple, comme Standard_Output n'a pas de nom, il me semble que la définition du problème n'inclut *pas* de toujours associer un nom avec le fichier externe (et surtout pas un nom limité à 11 caractères...) Donc le type Text tel que tu le définis ne répond pas au problème. Si tu dissocies le nom du fichier de son File, le problème de l'affectation dans Rewrite disparaît de lui-même, non?
>
> Personnellement je préconiserais l'utilisation des Streams de préférence à Ada.Text_IO. Outre que les Streams sont cent fois plus rapides, un des avantages est que tu peux affecter à une variable de type Ada.Streams.Stream_IO.Stream_Access une valeur accès vers n'importe quel stream, même limité. Tu peux utiliser Ada.Streams.Stream_IO.{Create,Open,Close} en lieu et place des sous-programmes de Ada.Text_IO. D'autre part tu peux appeler Ada.Text_IO.Text_Streams (Ada.Text_IO.Standard_Output) pour obtenir un Stream vers Standard_Output. La procédure Write que tu écris pourrait tout simplement être remplacée par String'Write (voir ARM 13.13.2(12/2)). Ton type Text pourrait très bien devenir:
>
> type Text is limited record
> Optional_Name : Ada.Strings.Unbounded.Unbounded_String;
> Stream : Ada.Streams.Stream_IO.Stream_Access;
> File : Ada.Streams.Stream_IO.File_Type;
> end record;
>
> procedure Open (Name : in String; Result : out Text) is
> begin
> if Name = "" then -- standard output
> Result.Stream := Ada.Text_IO.Text_Streams.Stream (Ada.Text_IO.Standard_Output);
> else -- named file
> Ada.Streams.Stream_IO.Open (File => Result.File,
> Mode => Ada.Streams.Stream_IO.Out_File,
> Name => Name);
> Result.Optional_Name := Ada.Strings.Unbounded.To_Unbounded_String (Name);
> Result.Stream := Ada.Streams.Stream_IO.Stream (F));
> end if;
> end Open;
>
> procedure Write (T : in Text; Item : in String) is
> begin
> String'Write (Stream => T.Stream, Item => Item);
> end Write;
>
> --
> Ludovic Brenta.
>
> _______________________________________________
> Site WWW de l'association Ada-France: http://www.ada-france.org/
> [email protected]
> http://www.ada-france.org/mailman/listinfo/ada-france
_______________________________________________
Site WWW de l'association Ada-France: http://www.ada-france.org/
[email protected]
http://www.ada-france.org/mailman/listinfo/ada-france