다음은 C에서 함수 포인터의 일반적인 사용법입니다. Fortran에서 비슷한 작업을하고 싶습니다. 몇 가지 아이디어가 있지만 정식 방법이 있는지 알고 싶습니다.
사용자가 전달한 함수 포인터와 컨텍스트는 저장되고 나중에 호출됩니다.
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
사용자의 기능은 다양한 상황에서 컨텍스트를 사용하여 다시 호출됩니다.
PETSc에서는 문자열-> 함수 포인터 테이블을 많이 사용합니다. 모든 것이 플러그인이므로 사용자는 자신의 구현을 등록 할 수 있으며 일류입니다.
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
이것은 생성 루틴을 "FList"에 등록한 다음 PCSetFromOptions ()는 다른 방법과 비교하여이 방법을 선택할 수있는 기능을 제공합니다. 시스템이 동적 로딩을 지원하는 경우 PCCreate_GAMG 심볼에 대한 컴파일 타임 종속성을 건너 뛰고 NULL 만 전달하면 심볼이 런타임에 공유 라이브러리에서 조회됩니다.
"공장"을 넘어서는이 단계는 Martin Fowler가 "서비스 로케이터"라고 부르는 것과 유사한 제어 장치의 역전입니다.
참고 : 이것은 Jed Brown과의 개인적인 서신에서 나 에게이 질문을했습니다. 나는 그것을 아웃소싱하고 사람들이 어떤 답변을 얻을 수 있는지 확인하기로 결정했습니다.