Probleme d'execution pascal

Résolu/Fermé
bach01 Messages postés 13 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 9 février 2009 - 10 juil. 2008 à 22:23
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 11 juil. 2008 à 16:30
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 vendredi 20 janvier 2006 Statut Membre Dernière intervention 20 mars 2013 3
10 juil. 2008 à 23:37
"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 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
11 juil. 2008 à 01:40
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 mardi 10 juin 2008 Statut Membre Dernière intervention 9 février 2009 2
11 juil. 2008 à 16:28
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 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
11 juil. 2008 à 16:30
De rien... c'était pas trop dur cette fois !
0

Discussions similaires