Petite explication d'une erreur en pascal

Résolu
espaceinfo Messages postés 251 Statut Membre -  
espaceinfo Messages postés 251 Statut Membre -
Bonjour,
dans mon prog pas, j'ai l'erreur d'execution 105, voila la solution que j'ai trouvé:

"Cette erreur ne concerne que les fichiers texte. Elle indique que le fichier sur lequel vous voulez effectuer une opération d'écriture (Write ou WriteLn) n'est pas ouvert en écriture.
Pour éviter un arrêt brutal du programme suite à cette erreur d'exécution, utilisez la directive de compilation {$I-} et récupérez le résultat de l'opération par la fonction IOResult."

qqn pourrait il m'expliqué de quelle façon la placer dans mon programme ??

merci!
Configuration: Windows XP
Internet Explorer 7.0

11 réponses

  1. amigo
     
    Bonjour,

    La fonction IORESULT retourne la valeur entière 0 si aucune erreur n'a été détectée, sinon elle retourne le numéro d'erreur pour permettre le traitement et éviter l'interruption du programme.
    Les directives {-I} et {+I} encadrent l'instruction susceptible de provoquer une erreur.

    Exemple:
    assign(fichier,nom_fichier);
    rewrite(fichier); {création nouveau fichier}
    {-I}
    writeln(fichier, texte); {cette instruction est susceptible de provoquer une erreur}
    {+I}
    code:=IORESULT; {on interroge IORESULT pour savoir si l'opération s'est bien passée}
    if (code<>0) then
       begin
          writeln('erreur d'écriture dans le fichier ', nom_fichier); {message d'erreur}
          writeln('le programme va être interrompu');
          close(fichier);
          readln;
          Exit; {mettre fin au programme, ou appel d'une procédure de traitement d'erreur}
       end;
    
    0
    1. espaceinfo Messages postés 251 Statut Membre 24
       
      salut,

      juste une clarification..j'ai pas de fichier dans mon programme; pour utiliser cette solution, dois je en créer un spécifique pour ça?

      merci
      0
      1. amigo > espaceinfo Messages postés 251 Statut Membre
         
        Bonjour,

        Si tu n'as pas de fichiers dans ton programme, la fonction IORESULT ne sert à rien puisque justement elle sert à controler les entrées/sorties sur fichiers.

        Ton problème vient peut etre du fait d'une mauvaise utilisation des instructions write et writeln.

        A+.
        0
  2. espaceinfo Messages postés 251 Statut Membre 24
     
    merci beaucoup amigo!
    0
  3. espaceinfo Messages postés 251 Statut Membre 24
     
    c'est sans doute ça, parceque le curseur pointe sur write;writeln; au moment de l'erreur....je te mets cette partie de mon programme?
    0
  4. espaceinfo Messages postés 251 Statut Membre 24
     
    ......
    ......
    if g=0 then g:=j;
    j:=j+1; cpt:=cpt+1;
    until (cpt=w); CherchVide;
    for j:=f+1 to g do
    begin
    h:=h+1;
    for i:=1 to n do
    begin
    if k=1 then mat[i,j]:=t1[i,h]
    else
    if k=2 then mat[i,j]:=t2[i,h]
    else
    mat[i,j]:=t3[i,h];
    end;
    end;
    writeln;writeln;textcolor(15); {******c'est ici que le programme m'indique l'erreur}
    for j:=1 to f do
    begin
    for i:=1 to n do
    write(mat[i,j]); writeln;
    end;
    textcolor(2);
    for j:=f+1 to g do
    begin
    for i:=1 to n do
    write(mat[i,j]); writeln;
    end;
    textcolor(6);
    for j:=g+1 to m do
    begin
    for i:=1 to n do
    write(mat[i,j]); writeln;
    end;
    writeln; textcolor(15);
    write('Press Enter');
    readln(x); clrscr;
    end;
    .......
    ......
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. amiggo
     
    Bonjour,

    A première vue, le code est tout à fait correct.

    Mais, si tu utilise une version de TurboPascal pour windows (TPW 1.5 par exemple), il faut savoir que l'unité Wincrt ne supporte pas les instructions TextColor et TextBackground, ça pourrait être une explication.

    Si par contre c'est une version DOS, alors là je ne vois pas. Tu peux toujours poster le coce de ton programme en entier, je le testerais chez moi pour voir si l'erreur se reproduit avec ma version TP 5.0

    A+.
    0
  7. espaceinfo Messages postés 251 Statut Membre 24
     
    bonjour!

    Program SE;
    uses crt;

    const m=23; n=8; a=4; b=6; c=4; d=9;
    type matrice=array[1..n,1..m]of integer;
    tb1=array[1..n,1..a]of integer;
    tb2=array[1..n,1..b]of integer;
    tb3=array[1..n,1..c]of integer;
    tb=array[1..d]of integer;

    var i, j, h, w, k, f, g, cpt, fin: integer;
    mat:matrice; t1:tb1; t2:tb2; t3:tb3; t:tb;
    x:char;

    Procedure Job1;
    begin
    for j:=1 to a do
    for i:=1 to n do
    t1[i,j]:=1;
    end;
    Procedure Job2;
    begin
    for j:=1 to b do
    for i:=1 to n do
    t2[i,j]:=1;
    end;
    Procedure Job3;
    begin
    for j:=1 to c do
    for i:=1 to n do
    t3[i,j]:=1;
    end;

    Procedure Indices;
    begin
    writeln;
    t[1]:=4; t[4]:=8; t[7]:=19;
    t[2]:=5; t[5]:=15; t[8]:=22;
    t[3]:=7; t[6]:=18; t[9]:=23;
    end;

    Procedure Affectation;
    begin
    Indices; writeln;
    j:=4; k:=1;
    while j<=m do
    begin
    if j=t[k] then
    begin
    for i:=1 to n do
    mat[i,j]:=1; k:=k+1;
    end
    else j:=j+1;
    end;
    end;

    Procedure Initialiser;
    begin
    clrscr; textcolor(15);
    for i:=1 to n do
    for j:=1 to 3 do
    mat[i,j]:=1;
    Affectation; job1; job2; job3;
    k:=0; f:=1;
    for j:=1 to m do
    begin
    for i:=1 to n do
    write(mat[i,j]);
    write(' ');
    if k=0 then
    begin
    writeln('Jobs:'); k:=k+1;
    end
    else
    if k=1 then
    begin
    writeln; k:=k+1;
    end
    else
    if k<=5 then
    begin
    textcolor(3);
    for i:=1 to n do
    write(t1[i,k]); k:=k+1;
    writeln; textcolor(15);
    end
    else
    if (k=6) or (k=7) then
    begin
    writeln; k:=k+1;
    end
    else
    if k<=13 then
    begin
    textcolor(6);
    for i:=1 to n do
    write(t2[i,k]);
    write(' '); textcolor(15);
    if f<=4 then
    begin
    textcolor(9);
    for i:=1 to n do
    write(t3[i,f]);
    textcolor(15);
    f:=f+1; k:=k+1; writeln;
    end
    else
    begin
    textcolor(15);
    k:=k+1; writeln;
    end;
    end
    else writeln;
    end;
    textcolor(15); writeln;
    write('Press Enter'); read(x);
    clrscr;
    end;

    Procedure CherchVide;
    begin
    clrscr;
    cpt:=0; j:=4; i:=1;
    while (j<=m) and (cpt<w) do
    begin
    if mat[i,j]=1 then
    begin f:=j; j:=j+1; i:=1; cpt:=0; end
    else
    begin g:=j; j:=j+1; cpt:=cpt+1; end;
    end;
    h:=0;
    end;

    Procedure InsertJob;
    begin
    CherchVide;
    for j:=f+1 to g do
    begin
    h:=h+1;
    for i:=1 to n do
    begin
    if k=1 then mat[i,j]:=t1[i,h]
    else
    if k=2 then mat[i,j]:=t2[i,h]
    else
    mat[i,j]:=t3[i,h];
    end;
    end;
    writeln; writeln;
    for j:=1 to f do
    begin
    textcolor(15);
    for i:=1 to n do
    write(mat[i,j]); writeln;
    end;
    textcolor(2);
    for j:=f+1 to g do
    begin
    for i:=1 to n do
    write(mat[i,j]); writeln;
    end;
    textcolor(15);
    for j:=g+1 to m do
    begin
    for i:=1 to n do
    write(mat[i,j]); writeln;
    end;
    if (j=m) and (cpt<w) then
    begin
    textcolor(4);
    writeln(' Ce Job doit avoir recours au d‚calage');
    write(' Si m‚moire pleine; statut Job: en attente');
    end;
    writeln; textcolor(15);
    write('Press Enter'); read(x); clrscr;
    end;

    Procedure Insertion;
    begin
    clrscr;
    writeln; write(' '); textcolor(15);
    writeln('JOB en entr‚: 1,2,3');
    textcolor(3);
    writeln; write('Choisir:'); textcolor(15);
    readln(k);
    if k=1 then
    begin job1; w:=4; end
    else
    if k=2 then
    begin job2; w:=6; end
    else
    begin job3;w:=4; end;
    InsertJob;
    end;

    Procedure Decalage;
    var cpt:integer;
    begin
    clrscr; writeln; textcolor(15);
    writeln('JOB qui a besoin d''Insertion avec D‚calage: 1,2,3:'); writeln;
    writeln; textcolor(3); write('Choisir:');
    read(k); textcolor(15);
    if k=1 then
    begin job1; w:=4; end
    else
    if k=2 then
    begin job2; w:=6; end
    else
    begin job3; w:=4; end;
    j:=4; g:=0; cpt:=0;
    repeat i:=1;
    while i<=n do
    begin
    if mat[i,j]=1 then
    begin
    if g<>0 then
    begin
    for i:=1 to n do
    mat[i,g]:=mat[i,j];
    for i:=1 to n do
    mat[i,j]:=0; g:=g+1; j:=j+1; i:=1;
    end
    else
    begin j:=j+1; i:=1; end;
    end
    else i:=i+1;
    end;
    if g=0 then g:=j;
    j:=j+1; cpt:=cpt+1;
    until (cpt=w); CherchVide;
    for j:=f+1 to g do
    begin
    h:=h+1;
    for i:=1 to n do
    begin
    if k=1 then mat[i,j]:=t1[i,h]
    else
    if k=2 then mat[i,j]:=t2[i,h]
    else
    mat[i,j]:=t3[i,h];
    end;
    end;
    writeln;textcolor(15);
    for j:=1 to f do
    begin
    for i:=1 to n do
    write(mat[i,j]); writeln;
    end;
    textcolor(2);
    for j:=f+1 to g do
    begin
    for i:=1 to n do
    write(mat[i,j]); writeln;
    end;
    textcolor(6);
    for j:=g+1 to m do
    begin
    for i:=1 to n do
    write(mat[i,j]); writeln;
    end;
    writeln; textcolor(15);
    write('Press Enter');
    readln(x); clrscr;
    end;

    Procedure Main;
    begin
    clrscr; writeln; writeln;
    repeat
    write(' ');textcolor(3);
    writeln(' Principal Main');
    writeln;writeln;writeln;writeln;
    write(' ');textcolor(15);
    writeln('1:Initialisation');writeln;
    write(' ');
    writeln('2:Insertion Directe');writeln;
    write(' ');
    writeln('3:Insertion avec D‚calage');writeln;
    write(' ');
    writeln('4:Exit');writeln;writeln;
    write(' ');textcolor(3);
    writeln;writeln;writeln;
    writeln;writeln;writeln; writeln;
    write(' Entrer Nø:');
    readln(Fin);
    case Fin of
    1:Initialiser;
    2:Insertion;
    3:Decalage;
    4:Exit;
    end;
    until Fin=4;
    end;

    Begin
    Accueil;
    textbackground(0); clrscr;
    Main;
    End.

    (je travaille avec tp7, et jusque là ça supporte bien textcolor.. textbackground)

    ^^merci!
    0
  8. amigo
     
    RE,

    J'ai essayé ton programme avec PT7 et j'ai les mêmes erreurs que toi à l'exécution. Je vais tester avec une autre version, et voir ce qui ne va pas.

    A +.
    0
  9. amigo
     
    Bonjour,

    J'ai réussi à localiser la source de l'erreur, mais sans pouvoir la corriger. Je n'ai pas réussi à comprendre ce que fait ton programme. Apparemment, ça vient d'une erreur de calcul d'indices de tableaux.
    En isolant cette partie de programme, dans la procédure Decalage, l'erreur ne survient plus:
    ....
    h:=h+1;
    for i:=1 to n do
    begin
    {
       if k=1 then mat[i,j]:=t1[i,h]
       else
       if k=2 then mat[i,j]:=t2[i,h]
       else
       mat[i,j]:=t3[i,h];
    }
    end;
    end;
    writeln;textcolor(15);h:=h+1;
    ....


    Pour déboguer ton programme, dans le menu Options -> Compiler -> Runtime Errors, il faut cocher Range Checking

    Bonne continuation. A+.
    0
  10. espaceinfo Messages postés 251 Statut Membre 24
     
    bonsoir,
    j'ai pas encore essayer ta solution mais c'est juste pour t'expliquer un peu le programme, donc voila c'est dans le domaine du SE, donc on a la grande matrice qui represente la memoire dont les 3premieres lignes sont reservées au systeme (je leur est affecté des uns) et le reste des lignes remplis aleatoirement (celles qui ont des 0 sont vides).
    et on a les 3jobs, l'un entre dans la memoire directement et sera run, le deuxieme doit avoir recours au dacalage de cases memoires et le troisieme job sera en etat wait...je ne sais pas si je suis clair là^^
    enfin bref.. merci enormement pour l'aide et le temps que je t'ai pris!
    0
  11. amigo
     
    Bonjour,

    Merci pour les explications, je comprend un peu mieux. Ce qui se passe dans ton programme, c'est que les indices des tableaux ne sont pas vérifiés par défaut à l'execution. Donc tu peux écrire en dehors de l'espace mémoire réservé aux tableaux (matrices) déclarés. Cette possibilité est laissée aux programmeurs qui peuvent y trouver un intéret, mais quand ce n'est pas voulu ni controlé, gare aux plantages ou aux réactions bizarres . Pour éviter ça, il faut activer le contole des indices à l'exécution, de cette façon le compilateur signalera tout débourdement de la mémoire et arrêtera le programme.

    Si tu as besoin d'un coup de main pour en venir à bout, ce sera avec plaisir,

    Salut.
    0
  12. espaceinfo Messages postés 251 Statut Membre 24
     
    merci bien amigo..à d'autres problemes^^
    0