Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

début avec fichiers textes... OPEN cause "file already open" mais lsof ne montre rien

7 views
Skip to first unread message

0012...@gmail.com

unread,
Feb 5, 2021, 9:27:13 AM2/5/21
to
Première fois que je manipule des fichiers mais quand même...  est-ce que j'ai loupé quelque chose d'évident ?
/bin/sh -c /home/mehdi/obj/compression
raised ADA.IO_EXCEPTIONS.STATUS_ERROR : System.File_IO.Open: file already open
[2021-02-05 13:51:31] process exited with status 1, elapsed time: 00.24s
 FICHIER: File_Type;
   FICHIER_ECRIRE: File_Type;
begin
   Open(FICHIER, In_File, "LECTURE");
-- exception lancée ici précisément

Et quand je met un CLOSE au début... il me dit que le fichier n'est pas ouvert.

J-P. Rosen

unread,
Feb 5, 2021, 10:15:50 AM2/5/21
to
Donne-nous le programme en entier, le problème doit être ailleurs...

--
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

0012...@gmail.com

unread,
Feb 5, 2021, 10:40:53 AM2/5/21
to
Ce qui est drôle c'est que le programme arrête juste après le morceau montré !

with ada.Text_IO;
use ada.Text_IO;
with ada.Integer_Text_IO; use ada.Integer_Text_IO;
procedure compression is
type Tableau is array(Positive) of Natural;
FICHIER: File_Type;
FICHIER_ECRIRE: File_Type;
factor, number: Natural;
Col_1: count := 1;
type etat is (facteur, virgule, fois, valeur);
etat_is: etat := facteur;
begin
begin
Open(FICHIER, In_File, "LECTURE");
exception
when others => Put_Line("ici ?"); CLOSE(FICHIER);
---------------------------
end;
create(FICHIER, Out_File,"ECRITURE");

Set_Input(fichier); Set_Output(FICHIER_ECRIRE);
c
while not End_Of_File(FICHIER) loop
declare
C: Character;
begin
Get_Immediate(C);
if c not in '0'..'9' then raise Constraint_Error; end if;
case etat_is is
when facteur =>
case C is
when '*' =>
Set_Col(Current_Input,col_1);
Get(Current_Input,factor);
Col_1 := col + 1;
Set_Col(col_1);
etat_is := fois;
when '0'..'9' => null;
when others => raise Constraint_Error;
end case;
when virgule =>
case C is
when '0'..'9' => null;
when others => raise Constraint_Error;
end case;
when fois =>
case C is
when '0'..'9' =>
col_1 := Col(File => Current_Input);
etat_is := facteur;
when others => raise Constraint_Error;
end case;
when valeur =>
case C is
when '0'..'9' => null;
when ',' =>
set_col(File => Current_Input,
To =>Col_1) ;
get(number);
col_1 := col+1;
Set_Col(File => Current_Input,
To => col_1);
for Ind in 1..factor loop
put(number,Width => 1);
end loop;
etat_is := virgule;
when others => raise Constraint_Error;
end case;
end case;
exception
when others =>
Close(FICHIER_ECRIRE);
close(FICHIER);
raise;
end;
end loop;
close(FICHIER);
if etat_is = valeur then
set_col(File => Current_Input,
To =>Col_1) ;
get(number);
col_1 := col+1;
Set_Col(File => Current_Input,
To => col_1);
for Ind in 1..factor loop
put(number,Width => 1);
end loop;
end if;
close(FICHIER_ECRIRE);
end compression;

J-P. Rosen

unread,
Feb 5, 2021, 11:31:12 AM2/5/21
to
Le 05/02/2021 à 16:40, 0012...@gmail.com a écrit :
> procedure compression is
> type Tableau is array(Positive) of Natural;
Ceci déclare un tableau de 2**31 éléments. Heureusement, tu n'utilises
pas ce type...

begin
Open(FICHIER, In_File, "LECTURE");
exception
when others => Put_Line("ici ?"); CLOSE(FICHIER);
---------------------------
end;
create(FICHIER, Out_File,"ECRITURE");

Ca devrait être create (FICHIER_ECRIRE, ....
Effectivement, FICHIER est déjà ouvert.

C'est le genre d'erreur qui est tellement grosse qu'on ne la voit pas ;-)

Thomas

unread,
Jan 18, 2022, 9:35:34 PM1/18/22
to
In article <rvjrsf$b7s$1...@dont-email.me>, "J-P. Rosen" <ro...@adalog.fr>
wrote:

> Le 05/02/2021 à 16:40, 0012...@gmail.com a écrit :
> > procedure compression is
> > type Tableau is array(Positive) of Natural;
> Ceci déclare un tableau de 2**31 éléments. Heureusement, tu n'utilises
> pas ce type...
>
> begin
> Open(FICHIER, In_File, "LECTURE");
> exception
> when others => Put_Line("ici ?"); CLOSE(FICHIER);
> ---------------------------
> end;
> create(FICHIER, Out_File,"ECRITURE");
>
> Ca devrait être create (FICHIER_ECRIRE, ....
> Effectivement, FICHIER est déjà ouvert.
>

> C'est le genre d'erreur qui est tellement grosse qu'on ne la voit pas ;-)

:-D


je dirais que c'est une bonne raison pour :
- simplifier son programme au max avant de le montrer aux autres, afin
de ne pas encombrer les autres avec du code inutile,
- vérifier si le programme simplifié reproduit effectivement l'erreur.

si ça n'est pas le cas, ça veut dire qu'elle n'est pas localisée où on
croyait.
et en poursuivant les investigations pour la localiser correctement,
c'est souvent suffisant pour la comprendre complètement et la corriger.


c'est un peu comme se relire et reformuler autant qu'il faut pour être
certain d'être bien compris par les autres :
quelques fois, c'est suffisant pour nous permettre de trouver nous même
la solution au pb formulé.

--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/
0 new messages