Pascal Tri fusion en pascal

Lilila -  
 chahbane -
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

2 réponses

  1. chahbane
     
    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;
    0
  2. KX Messages postés 19031 Statut Modérateur 3 020
     
    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...
    0
    1. chahbane
       
      ca pose le "runtime error" essaye d'utiliser un array[1..100] of string; et tu verras
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      Ç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 !!!
      0
    3. chahbane
       
      ahhhhhh merci pour l'information!! :)
      0