Loading lang_c_11_fnctptr...

enib_small.png LANG-C 11_FnctPtr — Pointeurs sur fonctions

Toutes les fonctions réalisées jusqu'alors produisaient des résultats qui ne dépendaient que des données qui leur étaient transmises.
Les fonctions et la façon dont elles s'enchaînent dans le déroulement d'un programme semblent donc intrinsèquement figées, contrairement aux données qui peuvent être produites dynamiquement.
Toutefois, comme vous le découvrirez dans les matières S5-MIP et S6-MIP de l'ENIB, les fonctions sont des séquences d'octets, représentant les instructions destinées au processeur, qui sont placées dans la mémoire de la machine informatique ; elles ont donc une adresse et peuvent par conséquent être désignées par cette dernière.
Les types qui sont des pointeurs sur fonctions permettent à ce propos de créer des variables qui désignent tantôt une fonction tantôt une autre et donc de provoquer l'appel de l'une ou de l'autre comme s'il s'agissait de simples données.
Ceci peut être exploité pour réaliser des algorithmes génériques qui invoquent des traitements spécifiquement choisis selon les besoins applicatifs.

Mise en place du programme d'expérimentation
{1 #declar } Déclaration et utilisation d'un pointeur sur fonctions
{2 #general } Généralisation d'un traitement
{3 #generic } Paramétrage des traitements génériques

Ici s'achève ce chapitre pratique dans lequel nous avons découvert les pointeurs sur fonctions.
Nous nous sommes appuyés dans le cas présent sur un unique exemple applicatif particulier, l'intégration de fonctions mathématiques, mais cette notion est utilisable dans bien d'autres contextes.
À chaque fois que nous savons exprimer un algorithme générique qui s'appuie sur l'invocation d'une fonctionnalité spécifique, cette dernière peut être transmise à l'algorithme générique par un pointeur sur fonctions, éventuellement accompagné d'un pointeur de type void * pour lui fournir des paramètres applicatifs supplémentaires sans que l'algorithme générique n'ait à en connaître les détails.
Voici quelques autres cas applicatifs très classiques :
En langage C++, même si les pointeurs sur fonctions restent utilisables, il existe encore d'autres facilités (templates, lambda-closures...) qui encouragent fortement l'écriture de fonctionnalités génériques réutilisables dans des contextes variés.

Code source de l'expérimentation