Pointeurs de fonction
La fonction appliquer_tableau
définie dans appliquer.c est un exemple
de fonction appliquant une fonction f à tous les
éléments d'un tableau d'entiers. La fonction f est passée en
paramètre sous la forme d'un pointeur de fonction. Le type de ce
pointeur est int (*)(int).
Dans la fonction main, on
utilise appliquer_tableau
avec comme valeur pour f
le pointeur fois_deux.
Plus généralement, si une fonction f retourne une valeur de type t et a pour paramètres
des variables de type t1,
t2, ..., tk, alors f est une constante de type t (*)(t1, ... tk). Cette
constante peut être affectée à une variable comme
le montre la deuxième version d'appliquer.c.
Le programme somme_tableau.c montre
comment utiliser appliquer_tableau
pour calculer la somme des éléments d'un tableau
d'entiers à l'aide d'une variable statique.
Les pointeurs de fonctions sont un outil essentiel pour la généricité des programmes. Un exemple en est
donné avec les tris.
Noter que l'algorithme utilisé est très simple, mais
d'une complexité plus élevée que les meilleurs
algorithmes connus.
La première version de la fonction tri
trie un tableau d'entiers en ordre croissant.
La deuxième version de tri, qui
prend en paramètre une fonction de comparaison, permet d'obtenir
facilement un tri croissant, un tri décroissant ou encore une
séparation des entiers pairs et impairs.
Les fonctions de la bibliothèque standard
void qsort(void *t, size_t n,
size_t s, int (*
compare)(const void *, const void *));
et
void *bsearch(const void *x,
const void *t, size_t n,
size_t s, int (* compare)(const void *, const void *));
permettent respectivement de trier un tableau et de rechercher par
dichotomie un élément dans un tableau trié. Dans
les deux fonctions,
- t désigne le
tableau à traiter,
- n le nombre
d'éléments du tableau,
- s la taille en octet
d'un élément du tableau,
- compare la fonction
de comparaison de deux éléments. Cette fonction prend en
paramètre les adresses des éléments à
comparer et renvoie une valeur :
- positive si le contenu du premier paramètre est
supérieur strictement au second,
- négative si le contenu du premier paramètre est
inférieur strictement au second,
- nulle si les deux contenus sont égaux.
Le paramètre x de bsearch est une adresse
contenant la valeur de l'élément à chercher. bsearch renvoie l'adresse dans
le tableau t de l'élément recherché, NULL si aucun
élément ne correspond.
Ces fonctions sont illustrées par les programmes tri.c et cherche.c.
Enfin, la dernière version du programme tri.c
montre l'utilisation de qsort
avec une fonction de comparaison sur une structure représentant
des immatriculations. Ces immatriculations sont triées
- d'abord selon le numéro du département,
- puis en fonction de l'ordre lexicographique de leurs lettres,
- puis en fonction du premier nombre.