Burada C'deki işlev işaretlerinin tipik bir kullanımı. Fortran'da benzer bir şey yapmak istiyorum. Bazı fikirlerim var, ama bunu yapmanın bazı kanonik yolları olup olmadığını bilmek istiyorum.
Kullanıcı tarafından iletilen işlev işaretçileri ve bağlamları saklanır ve daha sonra çağrılır.
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
Kullanıcının işlevi, daha sonraki çeşitli zamanlarda bağlamları kullanılarak geri çağrılır.
PETSc'de, string -> fonksiyon işaretçi tablolarını da yoğun bir şekilde kullanırlar. Her şey bir eklentidir, böylece kullanıcı kendi uygulamalarını kaydedebilir ve birinci sınıftır.
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
Bu, oluşturma rutinini bir "FList" e kaydeder, ardından PCSetFromOptions () bu yöntemi diğer seçeneklerden herhangi birine göre seçme olanağı sunar. Sistem dinamik yüklemeyi destekliyorsa, PCCreate_GAMG sembolüne derleme zamanı bağımlılığını atlayabilir ve sadece NULL iletebilirsiniz, ardından sembol çalışma zamanında paylaşılan kitaplıkta aranacaktır.
Bu bir "fabrika" ötesinde bir adım ötesinde, Martin Fowler "servis bulucu" olarak adlandırılan benzer bir kontrol cihazının ters olduğunu unutmayın.
Not: Bu, Jed Brown ile özel yazışmamda ortaya çıktı, burada bu soruyu bana sordu. Dış kaynak kullanmaya ve insanların hangi cevapları bulabileceğini görmeye karar verdim.