Salut,
J'ai fait une fonction de tri à bulle universelle. Je me suis inspiré des méthodes du bouquin O'reilly "Maîtrise des algorithmes en C).
Impossible de compiler avec visual c++ : il a des pb avec les types void*
Par contre, gcc win32 (djgpp) le prend sans pb (les erreurs deviennent des warnings, et l'exécution se déroule sans soucis).
Quelqu'un peut-il m'expliquer ce paradoxe ? (autrement que par "Normal, M$ suxxxx"
Marchi bien ^_^
Fazouye
allez plop, voici le code source :
#include <stdio.h>
#include <stdlib.h>
/* mes prototypes de fonctions */
void tri_bulle(void *,
int,
int(*compare)(void *a, void *b),
void(*inverse)(void *a, void *b),
int taille_elt);
int cmp_int(int *, int *);
int cmp_char(char *, char *);
void inv_int(int *, int *);
void inv_char(char *, char *);
/* le code en lui meme */
main()
{
int tableau[10] = {10,9,8,7,6,5,4,3,2,1};
int i;
char *chaine = (char*) malloc(9);
chaine = "hgfedcba";
tri_bulle ((void *) tableau, 10, &cmp_int, &inv_int, sizeof(int));
for (i=0 ; i<10 ; i++)
printf("%d ", tableau[i]);
tri_bulle ((void *) chaine, 8, &cmp_char, &inv_char, sizeof(char));
printf("\n%s", chaine);
getchar();
}
void tri_bulle(void *tab,
int max,
int(*compare)( void *a, void *b),
void(*inverse)( void *a, void *b),
int taille_elt
)
{
int i, j, max_j=max-1;
for (i=0 ; i < max ; i++)
{
for (j=0 ; j <max_j ; j++)
//avec visual, la compilation merde ici
if (compare(&tab[(j+1)*taille_elt], &tab[j*taille_elt]) <0)
//ici aussi
inverse(&tab[(j+1)*taille_elt], &tab[j*taille_elt]);
max_j--;
}
}
int cmp_int(int *un , int *deux)
{
if (*un > *deux )
return 1;
else
if (*un < *deux)
return -1;
else
return 0;
}
int cmp_char(char *un , char *deux)
{
if (*un > *deux)
return 1;
else
if (*un < *deux)
return -1;
else
return 0;
}
void inv_int(int *un, int *deux)
{
int tempon;
tempon = *un;
*un = *deux;
*deux = tempon;
}
void inv_char(char *un, char *deux)
{
char tempon;
tempon = *un;
*un = *deux;
*deux = tempon;
}