Discussion:
End_Error.
(trop ancien pour répondre)
Blady
2015-10-31 09:58:08 UTC
Permalink
Bonjour,

Petit problème tout bête, je lis les caractères d'un fichier texte tant
que je n'arrive pas à la fin du fichier avec Text_IO Get et End_Of_File.
Tout va bien si le fichier se termine par un caractère alphanumérique.
Mais si le fichier texte se termine avec des retours à la ligne
j'obtiens un End_Error !!

Le RM dit de Get :
After skipping any line terminators and any page terminators, reads the
next character from the specified input file and returns the value of
this character in the out parameter Item.

Je veux bien que les retours à la ligne soient sautés mais alors comment
déterminer la fin du fichier pour ne pas provoquer l'exception.

Source :
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Command_Line; use Ada.Command_Line;
procedure grep_cxx_pxx is
Source : File_Type;
C : Character;
begin
if Argument_Count = 0 then
Put_Line ("Usage : grep_cxx_pxx fichier_texte");
return;
end if;
Open (Source, In_File, Argument (1));
while not End_Of_File (Source) loop
Get (Source, C); -- END_ERROR
end loop;
Close (Source);
exception
when others =>
Put_Line ("Error &" & C & '&');
end grep_cxx_pxx;


Merci pour vos réponses, Pascal.
http://blady.pagesperso-orange.fr
Jeffrey R. Carter
2015-10-31 18:17:20 UTC
Permalink
Petit problème tout bête, je lis les caractères d'un fichier texte tant que je
n'arrive pas à la fin du fichier avec Text_IO Get et End_Of_File.
Tout va bien si le fichier se termine par un caractère alphanumérique.
Mais si le fichier texte se termine avec des retours à la ligne j'obtiens un
End_Error !!
After skipping any line terminators and any page terminators, reads the next
character from the specified input file and returns the value of this character
in the out parameter Item.
ARM A.10.5:

24
function End_Of_File(File : in File_Type) return Boolean;
function End_Of_File return Boolean;
25/3
Operates on a file of mode In_File. Returns True if a file terminator is next,
or if the combination of a line, a page, and a file terminator is next;
otherwise, returns False.

Donc, c'est possible pour End_Of_File d'être False mais pour Get de donner un
End_Error. En tout cas avec Text_IO il faut anticiper End_Error.
--
Jeff Carter
"Monsieur Arthur King, who has the brain of a duck, you know."
Monty Python & the Holy Grail
09
J-P. Rosen
2015-11-01 08:15:54 UTC
Permalink
Post by Blady
Je veux bien que les retours à la ligne soient sautés mais alors comment
déterminer la fin du fichier pour ne pas provoquer l'exception.
Et pourquoi ne pas accepter l'exception? Perso, je ne teste pas
End_Of_File, je laisse venir End_Error et je la traite.

Raison: mis à part qu'il faut bien connaître les fonctions d'E/S pour
traiter correctement les fins de fichiers, le comportement n'est défini
que pour les fichiers correctement formattés au sens Ada (théoriquement,
qui se terminent par un termine-ligne suivi d'un termine-page suivi d'un
termine-fichier), sachant que la définition des termine-XX dépend de
l'implémentation.

En particulier, ça marche assez mal pour les fichiers qui ne se
terminent pas par une fin de ligne. Alors que l'exception, ça marche
toujours...
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
Blady
2015-11-01 09:31:37 UTC
Permalink
Post by J-P. Rosen
Post by Blady
Je veux bien que les retours à la ligne soient sautés mais alors comment
déterminer la fin du fichier pour ne pas provoquer l'exception.
Et pourquoi ne pas accepter l'exception? Perso, je ne teste pas
End_Of_File, je laisse venir End_Error et je la traite.
Raison: mis à part qu'il faut bien connaître les fonctions d'E/S pour
traiter correctement les fins de fichiers, le comportement n'est défini
que pour les fichiers correctement formattés au sens Ada (théoriquement,
qui se terminent par un termine-ligne suivi d'un termine-page suivi d'un
termine-fichier), sachant que la définition des termine-XX dépend de
l'implémentation.
En particulier, ça marche assez mal pour les fichiers qui ne se
terminent pas par une fin de ligne. Alors que l'exception, ça marche
toujours...
Merci Jeff et Jean-Pierre pour vos précisions.
Je comprends, mais c'est pas du tout cool ça !
Car dans mon esprit, l'exception est ... exceptionnelle voire la
manifestation d'une situation erronée.
Je me souviens de nombreuses réponses sur CLA où il est écrit que le
comportement suite à une exception est indéterminé...

Bref, j'ai essayé avec succès :
Get_Immediate (Source, C);
Plus de END_ERROR :-)

Ce qui vérifie l'adage : "Ada a toujours de la ressource, il y a
toujours une bonne issue.".

Pascal.
J-P. Rosen
2015-11-01 12:23:38 UTC
Permalink
Post by Blady
Je comprends, mais c'est pas du tout cool ça !
Car dans mon esprit, l'exception est ... exceptionnelle voire la
manifestation d'une situation erronée.
Je sais que j'ai une vue des exceptions qui n'est pas partagée par tout
le monde, m'enfin voilà...

Oui, les exceptions sont pour traiter les situations "exceptionnelles".
C'est à dire que normalement, un programme boucle (cas normal), et
parfois doit sortir du traitement "normal" pour traiter des cas
"exceptionnels" (I.e l'exception par rapport à la règle définie par la
boucle).

Bien sûr, les erreurs sont des cas exceptionnels, mais ce ne sont pas
les seuls. Et la fin de fichier correspond très bien à ma définition.
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
l***@icloud.com
2015-11-01 14:01:32 UTC
Permalink
Post by J-P. Rosen
Je sais que j'ai une vue des exceptions qui n'est pas partagée par tout
le monde, m'enfin voilà...
Je crois que je me rappelle de ces discussions sur CLA. Et si j'appris une chose alors c'est qu'il y a toujours plusieurs façons de résoudre un problem en programmation.

Alors pourquoi ne pas utiliser qqch qui fonctionne toujours.
Pascal Obry
2015-11-01 18:10:17 UTC
Permalink
Post by l***@icloud.com
Post by J-P. Rosen
Je sais que j'ai une vue des exceptions qui n'est pas partagée par tout
le monde, m'enfin voilà...
Je crois que je me rappelle de ces discussions sur CLA. Et si
j'appris une chose alors c'est qu'il y a toujours plusieurs façons de
résoudre un problem en programmation.
Alors pourquoi ne pas utiliser qqch qui fonctionne toujours.
L'utilisation des exceptions comme control d'execution d'un programme
est une très mauvaise idée. Les exceptions (comme Jean-Pierre l'a dit)
sont pour les cas exceptionnels uniquement.

Prend par exemple le programme suivant:

with Ada.Text_IO; use Ada.Text_IO;

procedure Except is

   procedure Add (V : in out Natural) is
   begin
      V := V + 1;
   exception
      when others =>
         V := 0;
   end Add;

   A : Natural := Natural'Last;
begin
   Add (A);
   Put_Line ("A " & Natural'Image (A));
end Except;

$ gnatmake -f -q -gnatp except.adb && ./except
A -2147483648

$ gnatmake -f -q except.adb && ./except
A  0

Donc le comportement du programme change en fonction de l'activation ou
non des vérifications!!!!
--
Pascal Obry / Magny Les Hameaux (78)

The best way to travel is by means of imagination

http://v2p.fr.eu.org
http://www.obry.net

gpg --keyserver keys.gnupg.net --recv-key F949BD3B
Jeffrey R. Carter
2015-11-01 20:34:30 UTC
Permalink
Post by Pascal Obry
$ gnatmake -f -q -gnatp except.adb && ./except
A -2147483648
$ gnatmake -f -q except.adb && ./except
A 0
Donc le comportement du programme change en fonction de l'activation ou
non des vérifications!!!!
Avec -gnatp on n'utilise pas Ada.
--
Jeff Carter
"It's symbolic of his struggle against reality."
Monty Python's Life of Brian
78
Pascal Obry
2015-11-01 21:06:50 UTC
Permalink
Post by Jeffrey R. Carter
Avec -gnatp on n'utilise pas Ada.
Vaste débat, car pratiquement tous les projets que je connais
suppriment les vérifications en mode production. Alors Ada ou pas, le
fait est que c'est bien souvent l'usage et pour moi les exceptions ne
sont pas des if déguisés :)
--
Pascal Obry / Magny Les Hameaux (78)

The best way to travel is by means of imagination

http://v2p.fr.eu.org
http://www.obry.net

gpg --keyserver keys.gnupg.net --recv-key F949BD3
Jeffrey R. Carter
2015-11-01 22:00:21 UTC
Permalink
Post by Pascal Obry
Vaste débat, car pratiquement tous les projets que je connais
suppriment les vérifications en mode production. Alors Ada ou pas, le
fait est que c'est bien souvent l'usage et pour moi les exceptions ne
sont pas des if déguisés :)
Pour un programme correct, il faut avoir les vérifications, ou automatique ou
manuelle. Quelle sorte de personne veut créer un programme incorrect? Donc, nous
qui ne sont pas des idiots les avons.

En plus de 30 ans d'utiliser Ada je n'ai jamais vu un cas où il était nécessaire
de suprimer les vérifications.
--
Jeff Carter
"It's symbolic of his struggle against reality."
Monty Python's Life of Brian
78
J-P. Rosen
2015-11-01 22:24:58 UTC
Permalink
Post by Pascal Obry
Donc le comportement du programme change en fonction de l'activation ou
non des vérifications!!!!
Mouais, mais formellement, de l'Ada sans les vérifications, ce n'est
plus de l'Ada... Et un algorithme qui repose sur les détections
implicites du compilateur peut utiliser le pragma Unsuppress pour être
sûr que les vérifs ont lieu.
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
Jeffrey R. Carter
2015-11-01 17:58:59 UTC
Permalink
Post by Blady
Je comprends, mais c'est pas du tout cool ça !
Car dans mon esprit, l'exception est ... exceptionnelle voire la manifestation
d'une situation erronée.
Comme Rosen a dit, il y a des cas exceptionnels qui ne sont pas des erreurs.
Mais le problème est vraiment avec Text_IO.
--
Jeff Carter
"It's symbolic of his struggle against reality."
Monty Python's Life of Brian
78
Continuer la lecture sur narkive:
Loading...