Pascal Tri fusion en pascal [Fermé]

- - Dernière réponse :  chahbane - 8 mai 2011 à 11:44
Bonjour,
Je dois réaliser une fonction permettant de trier dans l'ordre croissant un tableau par la méthode du tri par fusion.
Seulement lorsque j'éxécute mon code, le tableau n'est pas trié ...
Merci de m'aider :
procedure TRFusC ({R} n, i, j: integer; {M} var t : TReleve);
		Var t2: TReleve;
		d,m,k,x,y: integer;

begin
     d:=n;
     m:=(i+1);
	 k:=j;

     while ( (d<=i) and (k<=n)) do
		begin
            if (t[d].tempMax<T[m].tempMax) then
				begin
                        t2[k]:=t[d];
                        d:=d+1;
                end
            else
                begin
                    t2[k]:=t[m];
                    m:=m+1;
				end;
            k:=k+1;
		end;
     if (d>i) then
		begin
            for x:=m to j do
				begin
                    t2[k]:=t[x] ;
					k:=k+1  ;
				end;
        end;
     if (m>j) then
		begin
              for x:=d to i do
				begin
                      t2[k]:=t[x] ;
                      k:=k+1;
                end;
		end;
    for y:=j to n do
		begin
			t[y]:=t2[y];
		end;
 
end;
 
procedure TRTriFusC ({R} n : integer; {M} var t : TReleve);
	var p,k:integer;

  begin
	
	p := 1;
	while p < n do
		begin
			k := 1;
			while k+p < n do
				begin
					TRFusC(k, k+p-1, MinInteger(k+2*p-1, n), t);
					k := k+2*p
				end;
			p := 2*p
		end;
  end;


 TReleve = array[1..366] of Releve;


et
type Releve = 
                              record
            annee : integer ;
            mois : 1..12;
            jour : 1..31;
            tempMax : real ;
            tempMin : real ;
            precipitation : real ;
            ensoleillement : real ;
  end;


Merci d'avance

Afficher la suite 

2 réponses

0
Merci
c'est peut etre que tu as alloue 366 Releves!!!! c'est trooop!! essaye toujours d'allouer au plus 10 elements (surtout si ils sont du type enregistrement ou chaines de caracteres). c'est un defaut pour le pascal. mais je vous propose une autre fonction recursive qui tri par fusion, un tableau des entiers, vous pouvez le modifier!


procedure fusionner_rec (var t:tab; tmp:tab; deb,fin:integer);
var m:integer;
procedure fusion (var t:tab; tmp:tab; d,m,f:integer);
var i,j,k:integer;
begin
i:=d;
j:=m+1;
for k:=d to f do
if ((j>f) or ((j<=m) and (t[i]<t[j]))) then
begin
tmp[k]:=t[i];
i:=i+1
end
else
begin
tmp[k]:=t[j];
j:=j+1;
End;
for k:=d to f do
t[k]:=tmp[k];
end;
begin
if deb<fin then
begin
m:=(deb+fin) div 2;
fusionner_rec(t,tmp,deb,m);
fusionner_rec(t,tmp,m+1,fin);
fusion(t,tmp,deb,m,fin);
end;
end;
Messages postés
16075
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 novembre 2019
2455
0
Merci
Il n'y a aucune raison que la borne 366 de l'array pose problème...
Par contre j'aimerais bien savoir ce que sont les directives {R} et {M} pour savoir si elles n'opéreraient pas une action de recopie auquel cas modifier le tableau est inutile !
Sinon il faudrait regarder le code en détail mais il va falloir mettre des commentaires en particulier sur les valeurs des très nombreuses variables...
ca pose le "runtime error" essaye d'utiliser un array[1..100] of string; et tu verras
KX
Messages postés
16075
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 novembre 2019
2455 -
Ça dépend des compilateurs...
Personnellement avec Dev-Pascal je peux utiliser des variables qui atteignent 4Go de données.
Donc puisque le string est représenté par 256 octets, je peux avoir un tableau avec 8 388 863 string !!!
Et avec le type Releve (codé sur 38 octets), on peut avoir un tableau de 56 512 765 Releves...
Alors avoir 366 ça ne devrait pas poser de problème... Ou alors changez de compilateur !!!
ahhhhhh merci pour l'information!! :)