aide sur appel de fonction en pascal

aide sur appel de fonction en pascal - Delphi/Pascal - Programmation

Marsh Posté le 08-12-2005 à 21:23:31    

Salut, je cherche à coder une fonction quicksort. Mon problème, c'est que j'ai une erreur à la compilation et je n'arrive pas à savoir pourquoi, quand j'appelle en récursif ma fonction: quicksort(liste_voiture,j + 1, sup);
il ne reconnait pas le j+1. Pourtant sur les quelques codes que j'ai pu récupérer ca marche bien comme ca. Alors pourquoi pas pour moi?
 
Voici mon code pour info:
liste_voiture est un tableau de 20 élement, et tab voiture une structure de donné.
 

Code :
  1. procedure quicksort(var liste_voiture : Tab_voiture; var inf : integer; var sup : integer);
  2.           var
  3.               i,j : integer;
  4.               annee : string;
  5.           begin
  6.                if inf < sup then
  7.                   begin
  8.                        i := inf + 1;
  9.                        j := sup;
  10.                        while ( i < j) do
  11.                              begin
  12.                                   writeln('i:',i,' j:',j);
  13.                                   while ((i = j) or (liste_voiture[inf].annee_immatriculation > liste_voiture[i].annee_immatriculation)) do
  14.                                         begin
  15.                                              inc(i);
  16.                                         end;
  17.                                   while ((j = i - 1) or (liste_voiture[inf].annee_immatriculation <= liste_voiture[j].annee_immatriculation)) do
  18.                                         begin
  19.                                              dec(j);
  20.                                         end;
  21.                                   if i < j then
  22.                                      begin
  23.                                           //permutation des valeurs du vecteur
  24.                                           annee := liste_voiture[i].annee_immatriculation;
  25.                                           liste_voiture[i].annee_immatriculation := liste_voiture[j].annee_immatriculation;
  26.                                           liste_voiture[j].annee_immatriculation := annee;
  27.                                           //j := j - 1;
  28.                                      end;
  29.                              end;
  30.                            
  31.                              //appels récursif de la fonction
  32.                              //Traitement des valeurs plus petites que le pivot
  33.                              if (liste_voiture[j].annee_immatriculation < liste_voiture[inf].annee_immatriculation) then
  34.                                 begin
  35.                                      //dec(j);
  36.                                      quicksort(liste_voiture,inf, j - 1);
  37.                                      //Traitement des valeurs plus grandes que le pivot
  38.                                      //inc(j);
  39.                                      quicksort(liste_voiture,j + 1, sup);
  40.                                 end;
  41.                   end;
  42.           end;


Message édité par bossgama le 08-12-2005 à 21:26:26
Reply

Marsh Posté le 08-12-2005 à 21:23:31   

Reply

Marsh Posté le 08-12-2005 à 23:12:23    

Y'a vraiment personne pour me dire pourquoi mon appel de fonction pourrait clocher, pourquoi il accepte de temps en temps une opération dans l'appel et parfois non?

Reply

Marsh Posté le 09-12-2005 à 11:16:50    

Le param est en "var", donc ça veut dire que la fonction peut modifier la variable pour que l'appelant reçoive la nouvelle valeur.
Si tu passes "j+1" et que la fonction le modifie, ça va être un peu compliqué à gérer :D Donc tu dois soit virer le var soit mettre ton j+1 dans une variable temporaire que tu passes à la fonction, selon que la fonction doit pouvoir modifier la valeur de j ou non (à toi de voir ; j'ai pas lu tout le code)
 
Mais vu que t'as mis tous les paramètres en "var" je suppose que c'est une erreur : var dans ce cas-ci ne veut pas dire que tu déclares un param, mais plutôt que la valeur du param doit être renvoyée à l'appelant.
Pour les params,
- soit tu ne mets rien : fonction(param: integer)
dans ce cas il copie la valeur sur la pile pour apeler la fonction, et les modifs que la fonction fait à param sont perdues quand on sort de la fonction
- soit tu mets var : fonction(var param: integer)
dans ce cas il passe le pointeur et si la fonction modifie param la nouvelle valeur sera également appliquée à l'appelant (vu que fonction modifie la variable de l'appelant plutôt d'avoir son propre param)
- soit tu mets out : fonction(out param: integer)
idem que var sauf que la valeur d'origine n'est pas prise en compte, à utiliser si fonction modifie param à tous les coups sans se soucier de la valeur antérieure
- soit tu mets const : fonction(const param: integer)
dans ce cas on passe aussi par pointeur, mais la fonction ne peut pas modifier le param
Dans la majorité des cas il vaut mieux préciser var/out/const (passage par pointeur, plus efficace), sauf si la fonction doit pouvoir modifier le paramètre sans que cette modif n'ait d'influence à l'extérieur


Message édité par antp le 09-12-2005 à 11:21:43

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 09-12-2005 à 19:57:56    

coooool, maintenant ca marche. C'est effectivement le var qui posait problème. Merci antp :).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed