[ADA][Résolu]raised ADA.IO_EXCEPTIONS.STATUS_ERROR et get()

raised ADA.IO_EXCEPTIONS.STATUS_ERROR et get() [ADA][Résolu] - Ada - Programmation

Marsh Posté le 24-05-2007 à 07:59:49    

Bonjour, lorsque j'utilise ma fonction Charger() (qui sert à charger une sauvegarde contenue dans un fichier) il n'y a strictement aucun problème... sauf quand j'utilise par la suite get(): si j'utilise get(C) avec C un integer, je n'ai aucun problème si je n'utilise pas Charger() ou si j'utilise Charger() après le get(C). Mais si j'utilise le get(C) après le Charger() j'ai cette erreur:
raised ADA.IO_EXCEPTIONS.STATUS_ERROR : s-fileio.adb:166
Si j'ai bien compris, cette erreur arrive quand on tente une action dans un fichier fermé ou lorsqu'on essaye d'ouvrir un fichier déjà ouvert:
- Lorsque j'utilise get(C) avant Charger(), ça me lit C sur l'entrée standard.
- Mais lorsque j'utilise get(C) après Charger(), ça à l'air de vouloir lire C dans le fichier que j'ai ouvert puis fermé avec Charger(), malgré le fait que ce fichier soit fermé.
Je pense donc savoir d'où vient le problème... mais je ne sait pas comment le régler...
 
 
Voici la fonction Charger():
 

Code :
  1. procedure Charger(Nom_Fichier: String; pl : out ptr_plateau; tab_p : out ptr_pion; j1, j2: out joueur) is
  2.       temp: integer;
  3.       Texte: File_Type;
  4.       j : integer;
  5.       taille1, taille2: integer;
  6.       begin
  7.      
  8.      
  9.       for i in pl'range(1) loop   -- Initialiser le plateau avec des cases vides.
  10.      for j in pl'range(2) loop
  11.       pl(i,j).etat := false;
  12.   pl(i,j).p := 0;
  13.  end loop;
  14. end loop;
  15.      
  16.  -- Debut de lecture du fichier Nom_Fichier
  17.  Open(Texte, In_File, Nom_Fichier);
  18.  Set_Input(Texte);
  19.  Avancer;
  20.  Ignorer_Separateurs;
  21.      
  22.         -- Lecture de la premiere ligne concernant le joueur1 (voir infos dans sauvegarde.ads)
  23.         Lire_entier(j1.num);
  24.  Avancer;
  25.  Ignorer_Separateurs;
  26.  -- Lit la taille du string, un nombre qui peut être à plusieurs chiffres. Je créerai sûrement une fonction
  27.  -- pour lire les entiers à plusieurs chiffres.
  28.  taille1 := 0;
  29.  while Caractere_courant in '0'..'9' loop
  30.   Lire_entier(j);
  31.   Avancer;
  32.   taille1 := taille1 * 10 + j;
  33.  end loop;
  34.  Ignorer_Separateurs;
  35.        
  36.  j1.nom := new String(1..taille1);
  37.  j := 1;
  38.  while j <= taille1 loop
  39.   j1.nom.all(j) := Caractere_courant;
  40.  Avancer;
  41.  j := j + 1;
  42.  end loop;
  43.  Ignorer_Separateurs;
  44.        
  45.  Lire_entier(j1.nb_point);
  46.  Avancer;
  47.  Avancer;
  48.  Ignorer_Separateurs;
  49.  -- Lecture de la seconde ligne concernant le joueur2 (voir infos dans sauvegarde.ads)
  50.  Lire_entier(j2.num);
  51.  Avancer;
  52.  Ignorer_Separateurs;
  53.  taille2 := 0;
  54.  while Caractere_courant in '0'..'9' loop
  55.   Lire_entier(j);
  56.   Avancer;
  57.   taille2 := taille2 * 10 + j;
  58.  end loop;
  59.  Ignorer_Separateurs;
  60.        
  61.  j2.nom := new String(1..taille2);
  62.  j := 1;
  63.  while j <= taille2 loop
  64.   j2.nom.all(j) := Caractere_courant;
  65.  Avancer;
  66.  j := j + 1;
  67.  end loop;
  68.  Ignorer_Separateurs;
  69.          Lire_entier(j2.nb_point);
  70.  Avancer;
  71.  Avancer;
  72.  Ignorer_Separateurs;
  73.        
  74.  -- Lecture des 14 lignes concernant les 14 pions.
  75.         for j in 1..14 loop
  76.           Lire_entier(temp);
  77.  if temp = 0 then
  78.   tab_p(j).balle := false;
  79.  else
  80.   tab_p(j).balle := true;
  81.  end if;
  82.           Avancer;
  83.   Ignorer_Separateurs;
  84.          Lire_entier(tab_p(j).pos.x);
  85.          Avancer;
  86.   Ignorer_Separateurs;
  87.           Lire_entier(tab_p(j).pos.y);
  88.        
  89.   if tab_p(j).pos.x > 0 then
  90.            pl(tab_p(j).pos.x, tab_p(j).pos.y).etat := true;
  91.            pl(tab_p(j).pos.x, tab_p(j).pos.y).p := j;
  92.   end if;
  93.  Avancer;
  94.  Avancer;
  95.  Ignorer_Separateurs;
  96.         end loop;
  97.       Close(Texte);
  98.    end Charger;


 
Voici l'appel de la fonction, ici il appelle le fichier "essai":
 

Code :
  1. .... début du programme ...
  2. C: integer;
  3. begin
  4. Charger("essai", plat, tab_p, joueurs(1), joueurs(2));
  5.    get(C);
  6. ... suite du programme ...


Message édité par FrenchFrogger le 24-05-2007 à 09:35:14
Reply

Marsh Posté le 24-05-2007 à 07:59:49   

Reply

Marsh Posté le 24-05-2007 à 09:18:55    

Je l'ai résolu. Il fallait terminer la fonction Charger() avec:

Code :
  1. Set_Input(Standard_Input);
  2. Close(Texte);


 
au lieu de:
 

Code :
  1. Close(Texte);


 
En effet au début de la fonction Charger je définissait le fichier définit par la variable Texte comme étant la nouvelle entrée standard. Il faut donc à la fin que je remette l'entrée standard par défaut (Standard_Input) comme étant l'entrée standard courante....
 
 
 
PS: le lien (bon lien) qui ma permit de capter le pb:
http://ina2.eivd.ch/collaborateurs [...] ts1Ada.pdf
Cherchez Standard_Input...


Message édité par FrenchFrogger le 24-05-2007 à 09:22:19
Reply

Sujets relatifs:

Leave a Replay

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