यहाँ सी में फ़ंक्शन पॉइंटर्स का एक विशिष्ट उपयोग किया गया है। मैं फोरट्रान में कुछ ऐसा ही करना चाहूंगा। मेरे पास कुछ विचार हैं, लेकिन मैं जानना चाहूंगा कि क्या ऐसा करने के लिए कुछ विहित तरीका है।
उपयोगकर्ता द्वारा पारित फ़ंक्शन पॉइंटर्स और संदर्भों को संग्रहीत किया जाता है, फिर बाद में कहा जाता है।
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);
यह एक "फ़्लिस्ट" में सृजन दिनचर्या को पंजीकृत करता है, फिर PCSetFromOptions () अन्य तरीकों में से किसी एक के द्वारा इस पद्धति को चुनने की क्षमता प्रदान करता है। यदि सिस्टम डायनेमिक लोडिंग का समर्थन करता है, तो आप PCCreate_GAMG प्रतीक पर संकलन-समय की निर्भरता को छोड़ सकते हैं और बस NULL पास कर सकते हैं, तो रन टाइम में साझा लाइब्रेरी में प्रतीक दिखाई देगा।
ध्यान दें कि यह एक "कारखाने" से परे एक कदम है, यह नियंत्रण उपकरण का उलटा है जो मार्टिन फाउलर "सेवा लोकेटर" कहता है।
नोट: यह जेड ब्राउन के साथ मेरे निजी पत्राचार में सामने आया, जहां उन्होंने मुझसे यह सवाल पूछा। मैंने इसे आउटसोर्स करने का फैसला किया और देखा कि लोग क्या जवाब दे सकते हैं।