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 retour | Signification |
|---|---|
| Négative | a vient avant b |
| Zéro | a est égal à b |
| Positive | a 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.
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 à comparerb(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 retour | Signification |
|---|---|
| Négative | a vient avant b |
| Zéro | a est égal à b |
| Positive | a 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
}
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
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète7Pointeurs sur fonctions
Déclaration de pointeurs sur fonctionsAppel de pointeurs sur fonctionsTypedef pour les pointeurs sur fonctionsPassage de fonctions en argumentsRécapitulatif : Dispatcher de calculatrice10Conteneurs génériques
Rappel sur les pointeurs voidWrapper génériqueÉchange génériqueComparaison génériqueRappel : tableaux génériques2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercle