Petite explication d'une erreur en pascal

Résolu/Fermé
espaceinfo Messages postés 237 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 12 juin 2010 - 26 mai 2008 à 19:14
espaceinfo Messages postés 237 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 12 juin 2010 - 3 juin 2008 à 15:53
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!
A voir également:

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:
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
espaceinfo Messages postés 237 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 12 juin 2010 24
29 mai 2008 à 18:45
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
amigo > espaceinfo Messages postés 237 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 12 juin 2010
30 mai 2008 à 22:25
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
espaceinfo Messages postés 237 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 12 juin 2010 24
29 mai 2008 à 15:41
merci beaucoup amigo!
0
espaceinfo Messages postés 237 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 12 juin 2010 24
30 mai 2008 à 23:07
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
espaceinfo Messages postés 237 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 12 juin 2010 24
31 mai 2008 à 00:13
......
......
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

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+.
0
espaceinfo Messages postés 237 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 12 juin 2010 24
31 mai 2008 à 20:05
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
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
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
espaceinfo Messages postés 237 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 12 juin 2010 24
2 juin 2008 à 01:20
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
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
espaceinfo Messages postés 237 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 12 juin 2010 24
3 juin 2008 à 15:53
merci bien amigo..à d'autres problemes^^
0