Ecco un uso tipico dei puntatori a funzione in C. Vorrei fare qualcosa di simile in Fortran. Ho alcune idee, ma vorrei sapere se esiste un modo canonico per farlo.
I puntatori e contesti di funzione passati dall'utente vengono memorizzati, quindi chiamati in seguito.
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
La funzione dell'utente viene richiamata utilizzando il loro contesto in vari momenti successivi.
In PETSc, usano anche pesantemente le tabelle dei puntatori di funzione string ->. Tutto è un plugin, quindi l'utente può registrare le proprie implementazioni e sono di prima classe.
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
Ciò registra la routine di creazione in un "FList", quindi PCSetFromOptions () offre la possibilità di scegliere questo metodo rispetto a qualsiasi altra scelta. Se il sistema supporta il caricamento dinamico, è possibile saltare la dipendenza in fase di compilazione dal simbolo PCCreate_GAMG e passare semplicemente NULL, quindi il simbolo verrà cercato nella libreria condivisa in fase di esecuzione.
Si noti che questo passo oltre una "fabbrica", è un'inversione del dispositivo di controllo simile a quello che Martin Fowler chiama "localizzatore di servizio".
Nota: questo è emerso nella mia corrispondenza privata con Jed Brown, dove mi ha fatto questa domanda. Ho deciso di esternalizzarlo e vedere quali risposte le persone possono trovare.