C++ में कॉलबैक फंक्शन

Callback Function C

कॉलबैक फ़ंक्शन एक फ़ंक्शन है, जो एक तर्क है, पैरामीटर नहीं, किसी अन्य फ़ंक्शन में। दूसरे फलन को प्रधान फलन कहा जा सकता है। तो दो कार्य शामिल हैं: मुख्य कार्य और कॉलबैक फ़ंक्शन स्वयं। प्रिंसिपल फ़ंक्शन की पैरामीटर सूची में, बिना किसी परिभाषा के कॉलबैक फ़ंक्शन की घोषणा मौजूद है, जैसे असाइनमेंट के बिना ऑब्जेक्ट घोषणाएं मौजूद हैं। प्रिंसिपल फ़ंक्शन को तर्कों के साथ बुलाया जाता है (मुख्य () में)। प्रिंसिपल फ़ंक्शन कॉल में तर्कों में से एक कॉलबैक फ़ंक्शन की प्रभावी परिभाषा है। सी ++ में, यह तर्क कॉलबैक फ़ंक्शन की परिभाषा का संदर्भ है; यह वास्तविक परिभाषा नहीं है। कॉलबैक फ़ंक्शन को वास्तव में प्रिंसिपल फ़ंक्शन की परिभाषा के भीतर बुलाया जाता है।

सी ++ में मूल कॉलबैक फ़ंक्शन किसी प्रोग्राम में एसिंक्रोनस व्यवहार की गारंटी नहीं देता है। अतुल्यकालिक व्यवहार कॉलबैक फ़ंक्शन योजना का वास्तविक लाभ है। एसिंक्रोनस कॉलबैक फ़ंक्शन स्कीम में, कॉलबैक फ़ंक्शन के परिणाम प्राप्त होने से पहले प्रोग्राम के लिए प्रिंसिपल फ़ंक्शन का परिणाम प्राप्त किया जाना चाहिए। सी ++ में ऐसा करना संभव है; हालांकि, सी ++ में एसिंक्रोनस कॉलबैक फ़ंक्शन स्कीम के व्यवहार की गारंटी के लिए भविष्य नामक लाइब्रेरी है।







यह आलेख मूल कॉलबैक फ़ंक्शन योजना की व्याख्या करता है। इसमें से बहुत कुछ शुद्ध सी ++ के साथ है। जहां तक ​​कॉलबैक का संबंध है, भविष्य के पुस्तकालय के मूल व्यवहार को भी समझाया गया है। इस आर्टिकल को समझने के लिए C++ और उसके पॉइंटर्स का बेसिक नॉलेज जरूरी है।



लेख सामग्री

मूल कॉलबैक फ़ंक्शन योजना

कॉलबैक फ़ंक्शन योजना को एक प्रमुख फ़ंक्शन और कॉलबैक फ़ंक्शन की आवश्यकता होती है। कॉलबैक फ़ंक्शन की घोषणा प्रिंसिपल फ़ंक्शन की पैरामीटर सूची का हिस्सा है। कॉलबैक फ़ंक्शन की परिभाषा प्रिंसिपल फ़ंक्शन के फ़ंक्शन कॉल में इंगित की गई है। कॉलबैक फ़ंक्शन को वास्तव में प्रिंसिपल फ़ंक्शन की परिभाषा के भीतर बुलाया जाता है। निम्नलिखित कार्यक्रम इसे दर्शाता है:



#शामिल

का उपयोग करते हुए नाम स्थानघंटे;



NSमुख्य एफएन(charचौधरी[],NS (*पीटीआर)(NS))

{

NSआईडी1= 1;

NSआईडी 2= 2;

NSआमतौर पर= (*पीटीआर)(आईडी 2);

लागत<<'मुख्य कार्य:'<<आईडी1<<''<<चौधरी<<''<<आमतौर पर<<'एन';

वापसीआईडी1;

}


NSसीबी(NSपहचान)

{

लागत<<'कॉलबैक फ़ंक्शन'<<'एन';

वापसीपहचान;

}


NSमुख्य()

{

NS (*पीटीआर)(NS) = औरसीबी;

charनहीं[] = 'तथा';

मुख्य एफएन(पिता, सीबीआई);



वापसी 0;

}

आउटपुट है:





कॉलबैक फ़ंक्शन

मुख्य कार्य: 1 तथा 2

प्रिंसिपल फंक्शन की पहचान प्रिंसिपल एफएन () द्वारा की जाती है। कॉलबैक फ़ंक्शन की पहचान cb () द्वारा की जाती है। कॉलबैक फ़ंक्शन को प्रिंसिपल फ़ंक्शन के बाहर परिभाषित किया गया है लेकिन वास्तव में प्रिंसिपल फ़ंक्शन के भीतर कहा जाता है।

मुख्य फ़ंक्शन घोषणा की पैरामीटर सूची में एक पैरामीटर के रूप में कॉलबैक फ़ंक्शन की घोषणा पर ध्यान दें। कॉलबैक फ़ंक्शन की घोषणा int (*ptr)(int) है। मुख्य फ़ंक्शन की परिभाषा में, फ़ंक्शन कॉल की तरह, कॉलबैक फ़ंक्शन अभिव्यक्ति पर ध्यान दें; कॉलबैक फ़ंक्शन कॉल के लिए कोई तर्क वहां पारित किया जाता है। इस फ़ंक्शन कॉल के लिए कथन है:



NSआमतौर पर= (*पीटीआर)(आईडी 2);

जहां id2 एक तर्क है। ptr पैरामीटर का हिस्सा है, एक पॉइंटर, जो मुख्य () फ़ंक्शन में कॉलबैक फ़ंक्शन के संदर्भ से जुड़ा होगा।

अभिव्यक्ति पर ध्यान दें:

NS (*पीटीआर)(NS) = औरसीबी;

मुख्य () फ़ंक्शन में, जो कॉलबैक फ़ंक्शन की घोषणा (बिना परिभाषा के) को उसी कॉलबैक फ़ंक्शन की परिभाषा के नाम से जोड़ता है।

मुख्य () फ़ंक्शन में, मुख्य फ़ंक्शन को इस प्रकार कहा जाता है:

मुख्य एफएन(पिता, सीबीआई);

जहां चा एक स्ट्रिंग है और सीबी बिना किसी तर्क के कॉलबैक फ़ंक्शन का नाम है।

कॉलबैक फ़ंक्शन का तुल्यकालिक व्यवहार

निम्नलिखित कार्यक्रम पर विचार करें:

#शामिल

का उपयोग करते हुए नाम स्थानघंटे;



शून्यमुख्य एफएन(शून्य (*पीटीआर)())

{

लागत<<'प्रमुख कार्य'<<'एन';

(*पीटीआर)();

}


शून्यसीबी()

{

लागत<<'कॉलबैक फ़ंक्शन'<<'एन';

}


शून्यएफएन()

{

लागत<<'देखा'<<'एन';

}


NSमुख्य()

{

शून्य (*पीटीआर)() = औरसीबी;

मुख्य एफएन(सीबी);

एफएन();



वापसी 0;

}

आउटपुट है:

मुख्य कार्य

कॉलबैक फ़ंक्शन

देखा

यहां एक नया कार्य है। सभी नया कार्य करता है, आउटपुट को प्रदर्शित करना, देखा गया। मुख्य () फ़ंक्शन में, प्रिंसिपल फ़ंक्शन को कहा जाता है, फिर नया फ़ंक्शन, fn () कहा जाता है। आउटपुट से पता चलता है कि प्रिंसिपल फ़ंक्शन के लिए कोड निष्पादित किया गया था, फिर कॉलबैक फ़ंक्शन के लिए निष्पादित किया गया था, और अंत में fn() फ़ंक्शन के लिए निष्पादित किया गया था। यह तुल्यकालिक (एकल-थ्रेडेड) व्यवहार है।

यदि यह अतुल्यकालिक व्यवहार था, जब तीन कोड खंडों को क्रम में कहा जाता है, तो पहले कोड खंड को निष्पादित किया जा सकता है, इसके बाद दूसरे कोड खंड को निष्पादित करने से पहले तीसरे कोड खंड के निष्पादन के बाद किया जा सकता है।

खैर, फ़ंक्शन, fn () को मुख्य फ़ंक्शन की परिभाषा के भीतर से मुख्य () फ़ंक्शन के बजाय, निम्नानुसार कहा जा सकता है:

#शामिल

का उपयोग करते हुए नाम स्थानघंटे;



शून्यएफएन()

{

लागत<<'देखा'<<'एन';

}


शून्यमुख्य एफएन(शून्य (*पीटीआर)())

{

लागत<<'प्रमुख कार्य'<<'एन';

एफएन();

(*पीटीआर)();

}


शून्यसीबी()

{

लागत<<'कॉलबैक फ़ंक्शन'<<'एन';

}


NSमुख्य()

{

शून्य (*पीटीआर)() = औरसीबी;

मुख्य एफएन(सीबी);



वापसी 0;

}

आउटपुट है:

मुख्य कार्य

देखा

कॉलबैक फ़ंक्शन

यह अतुल्यकालिक व्यवहार की नकल है। यह अतुल्यकालिक व्यवहार नहीं है। यह अभी भी तुल्यकालिक व्यवहार है।

साथ ही, प्रिंसिपल फ़ंक्शन के कोड सेगमेंट के निष्पादन का क्रम और कॉलबैक फ़ंक्शन के कोड सेगमेंट को प्रिंसिपल फ़ंक्शन की परिभाषा में स्वैप किया जा सकता है। निम्नलिखित कार्यक्रम इसे दर्शाता है:

#शामिल

का उपयोग करते हुए नाम स्थानघंटे;



शून्यमुख्य एफएन(शून्य (*पीटीआर)())

{

(*पीटीआर)();

लागत<<'प्रमुख कार्य'<<'एन';

}


शून्यसीबी()

{

लागत<<'कॉलबैक फ़ंक्शन'<<'एन';

}


शून्यएफएन()

{

लागत<<'देखा'<<'एन';

}


NSमुख्य()

{

शून्य (*पीटीआर)() = औरसीबी;

मुख्य एफएन(सीबी);

एफएन();



वापसी 0;

}

आउटपुट अब है,

कॉलबैक फ़ंक्शन

मुख्य कार्य

देखा

यह भी अतुल्यकालिक व्यवहार की नकल है। यह अतुल्यकालिक व्यवहार नहीं है। यह अभी भी तुल्यकालिक व्यवहार है। सच्चे अतुल्यकालिक व्यवहार को अगले भाग में या पुस्तकालय, भविष्य में बताए अनुसार प्राप्त किया जा सकता है।

कॉलबैक फ़ंक्शन के साथ अतुल्यकालिक व्यवहार

मूल अतुल्यकालिक कॉलबैक फ़ंक्शन योजना के लिए छद्म कोड है:

आउटपुट टाइप करें;

सीबी . टाइप करें(आउटपुट टाइप करें)

{

// बयान

}


प्रिंसिपल टाइप करेंFn(इनपुट टाइप करें, cb टाइप करें(आउटपुट टाइप करें))

{

// बयान

}

छद्म कोड के विभिन्न स्थानों में इनपुट और आउटपुट डेटा की स्थिति पर ध्यान दें। कॉलबैक फ़ंक्शन का इनपुट इसका आउटपुट है। प्रिंसिपल फ़ंक्शन के पैरामीटर सामान्य कोड के लिए इनपुट पैरामीटर और कॉलबैक फ़ंक्शन के लिए पैरामीटर हैं। इस योजना के साथ, कॉलबैक फ़ंक्शन के आउटपुट को पढ़ने से पहले मुख्य () फ़ंक्शन में एक तीसरा फ़ंक्शन निष्पादित (कॉल) किया जा सकता है (अभी भी मुख्य () फ़ंक्शन में)। निम्नलिखित कोड इसे दिखाता है:

#शामिल

का उपयोग करते हुए नाम स्थानघंटे;

char *उत्पादन;


शून्यसीबी(charबाहर[])

{

उत्पादन=बाहर;

}



शून्यमुख्य एफएन(charइनपुट[],शून्य (*पीटीआर)(char[पचास]))

{

(*पीटीआर)(इनपुट);

लागत<<'प्रमुख कार्य'<<'एन';

}


शून्यएफएन()

{

लागत<<'देखा'<<'एन';

}


NSमुख्य()

{

charइनपुट[] = 'कॉलबैक फ़ंक्शन';

शून्य (*पीटीआर)(char[]) = औरसीबी;

मुख्य एफएन(इनपुट, सीबी);

एफएन();

लागत<<उत्पादन<<'एन';



वापसी 0;

}

कार्यक्रम आउटपुट है:

मुख्य कार्य

देखा

कॉलबैक फ़ंक्शन

इस विशेष कोड में, आउटपुट और इनपुट डेटम एक ही डेटम होते हैं। मुख्य () फ़ंक्शन में तीसरे फ़ंक्शन कॉल का परिणाम कॉलबैक फ़ंक्शन के परिणाम से पहले प्रदर्शित किया गया है। कॉलबैक फ़ंक्शन को निष्पादित, समाप्त, और इसके परिणाम (मान) को चर, आउटपुट को सौंपा गया है, जिससे प्रोग्राम को इसके हस्तक्षेप के बिना जारी रखने की अनुमति मिलती है। मुख्य () फ़ंक्शन में, कॉलबैक फ़ंक्शन के आउटपुट का उपयोग (पढ़ने और प्रदर्शित) किया जाता था, जब इसकी आवश्यकता होती थी, जिससे पूरी योजना के लिए अतुल्यकालिक व्यवहार होता था।

यह शुद्ध सी ++ के साथ कॉलबैक फ़ंक्शन एसिंक्रोनस व्यवहार प्राप्त करने का एकल-थ्रेडेड तरीका है।

भविष्य के पुस्तकालय का मूल उपयोग

अतुल्यकालिक कॉलबैक फ़ंक्शन योजना का विचार यह है कि मुख्य फ़ंक्शन कॉलबैक फ़ंक्शन के वापस आने से पहले वापस आ जाता है। यह परोक्ष रूप से, प्रभावी ढंग से, उपरोक्त कोड में किया गया था।

उपरोक्त कोड से ध्यान दें कि कॉलबैक फ़ंक्शन कोड के लिए मुख्य इनपुट प्राप्त करता है और कोड के लिए मुख्य आउटपुट उत्पन्न करता है। सी ++ लाइब्रेरी, भविष्य में, सिंक () नामक एक फ़ंक्शन है। इस फ़ंक्शन का पहला तर्क कॉलबैक फ़ंक्शन संदर्भ है; दूसरा तर्क कॉलबैक फ़ंक्शन का इनपुट है। सिंक () फ़ंक्शन कॉलबैक फ़ंक्शन के पूरा होने की प्रतीक्षा किए बिना वापस आ जाता है, लेकिन कॉलबैक फ़ंक्शन को पूरा करने की अनुमति देता है। यह अतुल्यकालिक व्यवहार प्रदान करता है। जबकि कॉलबैक फ़ंक्शन निष्पादित करना जारी रखता है, चूंकि सिंक () फ़ंक्शन पहले ही वापस आ चुका है, इसके नीचे दिए गए कथन निष्पादित होते रहते हैं। यह आदर्श अतुल्यकालिक व्यवहार की तरह है।

भविष्य के पुस्तकालय और इसके सिंक () फ़ंक्शन को ध्यान में रखते हुए उपरोक्त कार्यक्रम को नीचे फिर से लिखा गया है:

#शामिल

#शामिल

#शामिल

का उपयोग करते हुए नाम स्थानघंटे;

भविष्य<डोरी>उत्पादन;

स्ट्रिंग सीबी(स्ट्रिंग स्ट्री)

{

वापसीकाटें;

}



शून्यमुख्य एफएन(स्ट्रिंग इनपुट)

{

उत्पादन=अतुल्यकालिक(सीबी, इनपुट);

लागत<<'प्रमुख कार्य'<<'एन';

}


शून्यएफएन()

{

लागत<<'देखा'<<'एन';

}


NSमुख्य()

{

स्ट्रिंग इनपुट=डोरी('कॉलबैक फ़ंक्शन');

मुख्य एफएन(इनपुट);

एफएन();

स्ट्रिंग रेट=आउटपुटपाना(); // यदि आवश्यक हो तो कॉलबैक के लौटने की प्रतीक्षा करें

लागत<<अधिकार<<'एन';



वापसी 0;

}

सिंक () फ़ंक्शन अंततः कॉलबैक फ़ंक्शन के आउटपुट को भविष्य की वस्तु में संग्रहीत करता है। भविष्य की वस्तु के प्राप्त () सदस्य फ़ंक्शन का उपयोग करके, मुख्य () फ़ंक्शन में अपेक्षित आउटपुट प्राप्त किया जा सकता है।

निष्कर्ष

कॉलबैक फ़ंक्शन एक फ़ंक्शन है, जो एक तर्क है, पैरामीटर नहीं, किसी अन्य फ़ंक्शन में। कॉलबैक फ़ंक्शन योजना को एक प्रमुख फ़ंक्शन और कॉलबैक फ़ंक्शन की आवश्यकता होती है। कॉलबैक फ़ंक्शन की घोषणा प्रिंसिपल फ़ंक्शन की पैरामीटर सूची का हिस्सा है। कॉलबैक फ़ंक्शन की परिभाषा प्रिंसिपल फ़ंक्शन (मुख्य () में) के फ़ंक्शन कॉल में इंगित की गई है। कॉलबैक फ़ंक्शन को वास्तव में प्रिंसिपल फ़ंक्शन की परिभाषा के भीतर कहा जाता है।

कॉलबैक फ़ंक्शन योजना आवश्यक रूप से अतुल्यकालिक नहीं है। यह सुनिश्चित करने के लिए कि कॉलबैक फ़ंक्शन योजना अतुल्यकालिक है, कोड में मुख्य इनपुट, कॉलबैक फ़ंक्शन में इनपुट करें; कोड का मुख्य आउटपुट बनाएं, कॉलबैक फ़ंक्शन का आउटपुट; कॉलबैक फ़ंक्शन के आउटपुट को एक चर या डेटा संरचना में संग्रहीत करें। मुख्य () फ़ंक्शन में, प्रिंसिपल फ़ंक्शन को कॉल करने के बाद, एप्लिकेशन के अन्य स्टेटमेंट निष्पादित करें। जब कॉलबैक फ़ंक्शन के आउटपुट की आवश्यकता होती है, तो मुख्य () फ़ंक्शन में, इसे वहां और फिर उपयोग (पढ़ें और प्रदर्शित करें)।