Menu
Coddy logo textTech

Comparaison générique

Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 52 sur 61.

Les fonctions génériques comme qsort et bsearch dans la bibliothèque standard du C ont besoin d'un moyen de comparer des éléments sans connaître leurs types. La solution est une fonction de comparaison — une fonction que vous écrivez et que l'algorithme générique appelle chaque fois qu'il doit comparer deux éléments.

La signature standard pour les fonctions de comparaison est :

int compare(const void* a, const void* b);

Les deux paramètres sont const void* car la fonction générique ne connaît pas le type que vous triez. La valeur de retour suit une convention spécifique :

Valeur de retourSignification
Négativea vient avant b
Zéroa est égal à b
Positivea vient après b

À l'intérieur de votre fonction de comparaison, vous transtypez les pointeurs void* vers le type réel et comparez les valeurs. Voici comment comparer des entiers :

int compare_ints(const void* a, const void* b) {
    int val_a = *(const int*)a;
    int val_b = *(const int*)b;
    return val_a - val_b;
}

L'astuce de la soustraction fonctionne bien pour les entiers : si a est plus petit, le résultat est négatif ; s'ils sont égaux, zéro ; s'il est plus grand, positif. Cette fonction peut maintenant être transmise à qsort pour trier un tableau d'entiers par ordre croissant.

challenge icon

Défi

Facile

Écrivez une fonction compare_ints qui compare deux entiers en suivant la convention standard des fonctions de comparaison utilisée par les algorithmes génériques comme qsort.

Votre fonction doit comparer les deux valeurs et renvoyer un résultat qui indique leur relation d'ordre.

Convention de valeur de retour :

  • Renvoie une valeur négative si le premier entier vient avant le second (first < second)
  • Renvoie zéro si les deux entiers sont égaux
  • Renvoie une valeur positive si le premier entier vient après le second (first > second)

Paramètres :

  • a (int) : Le premier entier à comparer
  • b (int) : Le second entier à comparer

Retourne : Un entier indiquant l'ordre : négatif si a < b, zéro si a == b, positif si a > b.

Astuce : L'astuce de la soustraction vue dans la leçon permet d'obtenir une solution élégante en une seule ligne.

Aide-mémoire

Les fonctions de comparaison permettent aux algorithmes génériques comme qsort et bsearch de comparer des éléments sans connaître leurs types.

La signature standard pour les fonctions de comparaison :

int compare(const void* a, const void* b);

Les paramètres sont const void* car la fonction générique ne connaît pas le type en cours de tri.

Convention de valeur de retour :

Valeur de retourSignification
Négativea vient avant b
Zéroa est égal à b
Positivea vient après b

À l'intérieur de la fonction de comparaison, transtypez les pointeurs void* vers le type réel et comparez les valeurs :

int compare_ints(const void* a, const void* b) {
    int val_a = *(const int*)a;
    int val_b = *(const int*)b;
    return val_a - val_b;
}

L'astuce de la soustraction fonctionne pour les entiers : si a est plus petit, le résultat est négatif ; s'ils sont égaux, zéro ; s'il est plus grand, positif.

Essayez vous-même

int compare_ints(int a, int b) {
    // Écrire le code ici
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Object Oriented Programming