Petite explication d'une erreur en pascal

Résolu
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. 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.
    1. 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!
      1. 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+.
        1. 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 +.
          1. 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!
            1. 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+.
              1. ......
                ......
                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;
                .......
                ......
                1. 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?
                  1. 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;
                    
                    1. 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
                    2. @espaceinfoBonjour,

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