Voici une utilisation typique des pointeurs de fonction en C. Je voudrais faire quelque chose de similaire dans Fortran. J'ai quelques idées, mais j'aimerais savoir s'il existe un moyen canonique de le faire.
Les pointeurs de fonction et les contextes transmis par l'utilisateur sont stockés, puis appelés ultérieurement.
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
La fonction de l'utilisateur est rappelée à l'aide de son contexte à différents moments ultérieurs.
Dans PETSc, ils font également un usage intensif des tables de pointeurs chaîne -> fonction. Tout est un plugin, donc l'utilisateur peut enregistrer ses propres implémentations et ils sont de première classe.
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
Cela enregistre la routine de création dans un "FList", puis PCSetFromOptions () offre la possibilité de choisir cette méthode par rapport à tout autre choix. Si le système prend en charge le chargement dynamique, vous pouvez ignorer la dépendance au moment de la compilation sur le symbole PCCreate_GAMG et simplement passer NULL, puis le symbole sera recherché dans la bibliothèque partagée au moment de l'exécution.
Notez que cette étape au-delà d'une "usine", c'est une inversion du dispositif de contrôle similaire à ce que Martin Fowler appelle "localisateur de service".
Remarque: cela est venu dans ma correspondance privée avec Jed Brown, où il m'a posé cette question. J'ai décidé de l'externaliser et de voir quelles réponses les gens peuvent trouver.