Probleme d'execution pascal
Résolu
bach01
Messages postés
13
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
j'ai fait un programme ki exécute 3 tri:le tri bulle,sélection et rapide.Mais chak fois que j'essaye d'exécuter le dernier le message "stack overflow error" s'affiche.Comment le résoudre?
PROGRAM TRI;
Uses CRT;
type tab = ARRAY[1..1] of INTEGER;
var t: ^tab;
k,j,i,n: INTEGER;
choix:byte;
Procedure Dimension(var n: Integer);
begin
Repeat
writeln('Entrez le nombre d''elements');
read(n); getmem (t, n* sizeof (tab));
Until (n>= 1);
end;
Procedure Saisir;
begin
writeln('Entrez les elements du tableau');
For i := 1 to n do
begin
write('t[',i,']=');
readln(t^[i]);
end;
end;
Procedure affichage;
begin
writeln('Les elements du tableau sont: ');
For i :=1 to n do
begin
writeln('t[',i,']=', t^[i]);
end;
end;
Procedure Tri_Bulle(n: Integer);
var a, j: Integer;
begin
For j :=1 to i do
begin
if t^[j - 1] > t^[j] then
begin
a := t^[j];
t^[j] := t^[j - 1];
t^[j - 1]:= a;
end;
end;
if (n >= 2) then
begin
Tri_Bulle(n - 1);
end;
end;
function pos_min(j,n:integer):integer;
var i,min:integer;
begin
for i:=j to n do
begin
if t^[i]<t^[min] then
begin
min:=i;
end;
end;
pos_min:=min;
end;
procedure tri_selection(k,n:integer);
var j,a:integer;
begin
j:=pos_min(k,n);
a:=t^[k];
t^[k]:=t^[j];
t^[j]:=a;
if (k= n-1) then
begin
tri_selection(k+1,n);
end;
end;
procedure tri_rapide(deb,x:integer);
var mid,aux,p:integer;
begin
if (deb<x) then
begin
mid:=(deb+x) div 2;
aux:=t^[mid];
t^[mid]:=t^[deb];
t^[deb]:=aux;
p:=deb;
end;
for i:=(deb+1) to x do
begin
if (t^[i]<t^[deb]) then
begin
p:=p+1;
aux:=t^[i];
t^[p]:=aux;
end;
end;
aux:=t^[p];
t^[p]:=t^[deb];
t^[deb]:=aux;
tri_rapide(deb,p);
tri_rapide(P+1,x);
end;
procedure menu(var choix:byte);
begin
writeln('1:saisir les elements du tableau');
writeln('2:afficher les elements du tableau');
writeln('3:faire un tri bulle');
writeln('4:faire un tri selection');
writeln('5:faire un tri rapide');
writeln('6:sortir du programme');
writeln('donnez votre choix');
readln(choix);
end;
BEGIN{P_P}
textbackground(red);textcolor(green);clrscr;
repeat
clrscr;
menu (choix);
case choix of
1:begin
Dimension(n);
Saisir;
end;
2:begin
affichage;
end;
3:begin
Tri_Bulle(n);
affichage;
end;
4:begin
k:=1;
tri_selection(k,n);
affichage;
end;
5:begin
k:=1;
tri_rapide(k,n);
affichage;
end;
6:exit;
end;
writeln('voulez vous continuer? info taper o=oui ou n=non');
until (readkey='n') or (readkey=upcase('n'));
END.
j'ai fait un programme ki exécute 3 tri:le tri bulle,sélection et rapide.Mais chak fois que j'essaye d'exécuter le dernier le message "stack overflow error" s'affiche.Comment le résoudre?
PROGRAM TRI;
Uses CRT;
type tab = ARRAY[1..1] of INTEGER;
var t: ^tab;
k,j,i,n: INTEGER;
choix:byte;
Procedure Dimension(var n: Integer);
begin
Repeat
writeln('Entrez le nombre d''elements');
read(n); getmem (t, n* sizeof (tab));
Until (n>= 1);
end;
Procedure Saisir;
begin
writeln('Entrez les elements du tableau');
For i := 1 to n do
begin
write('t[',i,']=');
readln(t^[i]);
end;
end;
Procedure affichage;
begin
writeln('Les elements du tableau sont: ');
For i :=1 to n do
begin
writeln('t[',i,']=', t^[i]);
end;
end;
Procedure Tri_Bulle(n: Integer);
var a, j: Integer;
begin
For j :=1 to i do
begin
if t^[j - 1] > t^[j] then
begin
a := t^[j];
t^[j] := t^[j - 1];
t^[j - 1]:= a;
end;
end;
if (n >= 2) then
begin
Tri_Bulle(n - 1);
end;
end;
function pos_min(j,n:integer):integer;
var i,min:integer;
begin
for i:=j to n do
begin
if t^[i]<t^[min] then
begin
min:=i;
end;
end;
pos_min:=min;
end;
procedure tri_selection(k,n:integer);
var j,a:integer;
begin
j:=pos_min(k,n);
a:=t^[k];
t^[k]:=t^[j];
t^[j]:=a;
if (k= n-1) then
begin
tri_selection(k+1,n);
end;
end;
procedure tri_rapide(deb,x:integer);
var mid,aux,p:integer;
begin
if (deb<x) then
begin
mid:=(deb+x) div 2;
aux:=t^[mid];
t^[mid]:=t^[deb];
t^[deb]:=aux;
p:=deb;
end;
for i:=(deb+1) to x do
begin
if (t^[i]<t^[deb]) then
begin
p:=p+1;
aux:=t^[i];
t^[p]:=aux;
end;
end;
aux:=t^[p];
t^[p]:=t^[deb];
t^[deb]:=aux;
tri_rapide(deb,p);
tri_rapide(P+1,x);
end;
procedure menu(var choix:byte);
begin
writeln('1:saisir les elements du tableau');
writeln('2:afficher les elements du tableau');
writeln('3:faire un tri bulle');
writeln('4:faire un tri selection');
writeln('5:faire un tri rapide');
writeln('6:sortir du programme');
writeln('donnez votre choix');
readln(choix);
end;
BEGIN{P_P}
textbackground(red);textcolor(green);clrscr;
repeat
clrscr;
menu (choix);
case choix of
1:begin
Dimension(n);
Saisir;
end;
2:begin
affichage;
end;
3:begin
Tri_Bulle(n);
affichage;
end;
4:begin
k:=1;
tri_selection(k,n);
affichage;
end;
5:begin
k:=1;
tri_rapide(k,n);
affichage;
end;
6:exit;
end;
writeln('voulez vous continuer? info taper o=oui ou n=non');
until (readkey='n') or (readkey=upcase('n'));
END.
A voir également:
- Probleme d'execution pascal
- Turbo pascal - Télécharger - Édition & Programmation
- My pascal - Télécharger - Édition & Programmation
- Dev pascal - Télécharger - Édition & Programmation
- Le service spouleur d'impression local n'est pas en cours d'exécution - Guide
- Uses crt pascal - Forum Pascal
3 réponses
"stack" est le mot anglais de pile. Donc "stackoverflow error" veut dire que ton programme essaie d'empiler alors que la pile est pleine. Ce qu'il faut faire c'est d'augmenter la taille de la pile. Tu peux le faire de 2 façons:
- en utilisant la directive {M+, si j'ai bonne mémoire car ça fait longtemps que je ne programme plus en Pascal. En tout cas, regard dans l'aide de ton compilateur et chercher une directive de ce genre. Là tu verra comment augment la taille de la pile lors de l'exécution de ton programme.
- tu peux aussi augmenter la taille du segment de pile alloué aux programmes par ton compilateur à partir de l'interface de ce dernier. Regard dans le menu options et cherche stack segment, je pense
J'espère que tu pourra te retrouver même comme je ne suis pas très explicit
- en utilisant la directive {M+, si j'ai bonne mémoire car ça fait longtemps que je ne programme plus en Pascal. En tout cas, regard dans l'aide de ton compilateur et chercher une directive de ce genre. Là tu verra comment augment la taille de la pile lors de l'exécution de ton programme.
- tu peux aussi augmenter la taille du segment de pile alloué aux programmes par ton compilateur à partir de l'interface de ce dernier. Regard dans le menu options et cherche stack segment, je pense
J'espère que tu pourra te retrouver même comme je ne suis pas très explicit
J'ai compilé ton code sous Dev-Pascal, et j'obtiens le message d'avertissement concernant la fonction pos_min que j'ai donc corrigé :
Ça règle pas ton problème mais ça t'évitera déjà quelques autres erreurs...
Pour le reste il faudrait revoir tout ton code :
En effet tri_rapide(deb,p); et tri_rapide(p+1,x); tournent alors à l'infini !
function pos_min(j,n:integer):integer; var i:integer; begin pos_min:=j; for i:=j+1 to n do if t^[i]<t^[pos_min] then pos_min:=i; end;De plus ta variable globale j (5è ligne) n'est jamais utilisée
Ça règle pas ton problème mais ça t'évitera déjà quelques autres erreurs...
Pour le reste il faudrait revoir tout ton code :
procedure tri_rapide(deb,x:integer); var mid,aux,p:integer; begin if (deb<x) then begin mid:=(deb+x) div 2; aux:=t^[mid]; t^[mid]:=t^[deb]; t^[deb]:=aux; p:=deb; end; for i:=(deb+1) to x do begin if (t^[i]<t^[deb]) then begin p:=p+1; aux:=t^[i]; t^[p]:=aux; end; end; aux:=t^[p]; t^[p]:=t^[deb]; t^[deb]:=aux; tri_rapide(deb,p); tri_rapide(p+1,x); end;Au cas où deb>x, p n'est pas initialisé, ce qui fait planter le programme
En effet tri_rapide(deb,p); et tri_rapide(p+1,x); tournent alors à l'infini !