Petite explication d'une erreur en pascal
Résolu
espaceinfo
Messages postés
237
Date d'inscription
Statut
Membre
Dernière intervention
-
espaceinfo Messages postés 237 Date d'inscription Statut Membre Dernière intervention -
espaceinfo Messages postés 237 Date d'inscription Statut Membre Dernière intervention -
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!
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!
A voir également:
- Petite explication d'une erreur en pascal
- Turbo pascal - Télécharger - Édition & Programmation
- My pascal - Télécharger - Édition & Programmation
- Dev pascal - Télécharger - Édition & Programmation
- Petite amie virtuelle en français gratuit - Accueil - Intelligence artificielle
- Instagram une erreur s'est produite ✓ - Forum Instagram
11 réponses
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:
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;
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?
......
......
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;
.......
......
......
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;
.......
......
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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+.
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+.
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!
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!
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 +.
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 +.
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:
Pour déboguer ton programme, dans le menu Options -> Compiler -> Runtime Errors, il faut cocher Range Checking
Bonne continuation. A+.
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+.
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!
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!
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.
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.
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
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+.