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   -
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.
A voir également:

3 réponses

B Messages postés 9 Date d'inscription   Statut Membre Dernière intervention   3
 
"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
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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é :
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 !
0
bach01 Messages postés 13 Date d'inscription   Statut Membre Dernière intervention   2
 
j'ai placé un end la ou il ne fallait pas aussi et maintenant ke je lai remis au bon endroit sa marche.merci pr l'aide KX!
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
De rien... c'était pas trop dur cette fois !
0