Bonjour.
Je suis un intermittent de la programmation et plus très jeune (73 ans) Alors soyez indulgents...
Avant de le porter dans un composant j'essaie de mettre au point un tri de Grille avec la possibilité d'avoir une fonction de comparaison dont je passe le nom en paramètre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int compare(TMyGrid *Grille1, int SortCol, int row1, int row2);
int comparebis(TMyGrid *Grille1, int SortCol, int row1, int row2);
void __fastcall swap(TMyGrid *Grille1, int SortCol, int row1, int row2);
void __fastcall quicksort(TMyGrid *Grille1, int col, int bottom, int top,
               int (&fcomp)(TMyGrid *Grille1, int SortCol, int row1, int row2));
 
void __fastcall quicksort(TMyGrid *Grille1, int col, int bottom, int top,
               int (&fcomp)(TMyGrid *Grille1, int SortCol, int row1, int row2))
{ int up, down, pivot;
  String s;
 
  down = top;
  up = bottom;
  pivot = (top + bottom) / 2;
 
  do
   { //while (compare(Grille1, col, up, pivot) < 0) up++;
     while (fcomp(Grille1, col, up, pivot) < 0) up++;
     //while (compare(Grille1, col, down, pivot) > 0) down--;
     while (fcomp(Grille1, col, down, pivot) < 0) down--;
     if (up <= down)
      {swap(Grille1, col, up, down);
       if (pivot == up)
         pivot = down;
       else if (pivot == down)
         pivot = up;
       up++;
       down--;
      };
   } while (up<=down); // until up > down;
 
   if (bottom < down)
    quicksort(Grille1,col, bottom, down, fcomp);
 
   if (up < top)
    quicksort(Grille1,col, up, top, fcomp);
}
 
Appel du tri:
 quicksort(Grille1,1,1,Grille1->RowCount,compare);
Quand j'utilise le nom directement "while(compare(Grille1... " le tri s'effectue et le résultat est bon. Quand je le passe en paramètre "while(fcomp(Grille1..." le tri s'effectue mais le résultat n'est pas bon. Et je ne vois pas bien pourquoi. Quand je fais la trace, je passe par la fonction "compare" avec les bons paramètres...

Merci d'avance pour votre aide.