Oto typowe użycie wskaźników funkcji w C. Chciałbym zrobić coś podobnego w Fortranie. Mam kilka pomysłów, ale chciałbym wiedzieć, czy istnieje jakiś kanoniczny sposób.
Wskaźniki funkcji i konteksty przekazane przez użytkownika są przechowywane, a następnie wywoływane później.
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
Funkcja użytkownika jest wywoływana za pomocą kontekstu w późniejszym czasie.
W PETSc często wykorzystują tabele wskaźników string -> function. Wszystko jest wtyczką, więc użytkownik może zarejestrować własne implementacje i są one najwyższej klasy.
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
To rejestruje procedurę tworzenia w „FList”, a następnie PCSetFromOptions () oferuje możliwość wyboru tej metody w porównaniu z innymi opcjami. Jeśli system obsługuje ładowanie dynamiczne, możesz pominąć zależność czasu kompilacji od symbolu PCCreate_GAMG i po prostu przekazać NULL, wówczas symbol zostanie wyszukany w udostępnionej bibliotece w czasie wykonywania.
Zauważ, że ten krok poza „fabryką” jest odwróceniem urządzenia sterującego podobnego do tego, co Martin Fowler nazywa „lokalizatorem usług”.
Uwaga: pojawiło się to w mojej prywatnej korespondencji z Jedem Brownem, gdzie zadał mi to pytanie. Postanowiłem to zlecić na zewnątrz i zobaczyć, jakie odpowiedzi ludzie mogą wymyślić.