C ++ এ কলব্যাক ফাংশন

Callback Function C



একটি কলব্যাক ফাংশন হল একটি ফাংশন, যা একটি আর্গুমেন্ট, প্যারামিটার নয়, অন্য ফাংশনে। অন্যান্য ফাংশনকে প্রধান ফাংশন বলা যেতে পারে। সুতরাং দুটি ফাংশন জড়িত: প্রধান ফাংশন এবং কলব্যাক ফাংশন নিজেই। প্রিন্সিপাল ফাংশনের প্যারামিটার লিস্টে, কলব্যাক ফাংশনের ডিক্লেয়ারেশন তার সংজ্ঞা ছাড়া উপস্থিত থাকে, যেমন অ্যাসাইনমেন্ট ছাড়া অবজেক্ট ডিক্লারেশন উপস্থিত থাকে। প্রিন্সিপাল ফাংশনকে আর্গুমেন্ট দিয়ে বলা হয় (in main ())। প্রিন্সিপাল ফাংশন কলের একটি যুক্তি হল কলব্যাক ফাংশনের কার্যকর সংজ্ঞা। C ++ এ, এই যুক্তিটি কলব্যাক ফাংশনের সংজ্ঞার একটি রেফারেন্স; এটি প্রকৃত সংজ্ঞা নয়। কলব্যাক ফাংশন নিজেই আসলে প্রধান ফাংশনের সংজ্ঞার মধ্যে বলা হয়।

C ++ এ মৌলিক কলব্যাক ফাংশন একটি প্রোগ্রামে অসিঙ্ক্রোনাস আচরণের গ্যারান্টি দেয় না। অসিঙ্ক্রোনাস আচরণ কলব্যাক ফাংশন স্কিমের আসল সুবিধা। অসিঙ্ক্রোনাস কলব্যাক ফাংশন স্কিমে, কলব্যাক ফাংশনের ফলাফল পাওয়ার আগে প্রোগ্রামের জন্য প্রধান ফাংশনের ফলাফল পাওয়া উচিত। C ++ এ এটি করা সম্ভব; যাইহোক, সি ++ এর অ্যাসিঙ্ক্রোনাস কলব্যাক ফাংশন স্কিমের আচরণের নিশ্চয়তা দেওয়ার জন্য ভবিষ্যত নামে একটি লাইব্রেরি রয়েছে।







এই নিবন্ধটি মৌলিক কলব্যাক ফাংশন স্কিম ব্যাখ্যা করে। এর অনেকটা বিশুদ্ধ C ++ এর সাথে। যতদূর কলব্যাক সম্পর্কিত, ভবিষ্যতের লাইব্রেরির মৌলিক আচরণও ব্যাখ্যা করা হয়েছে। এই নিবন্ধটি বোঝার জন্য C ++ এবং এর পয়েন্টারগুলির প্রাথমিক জ্ঞান প্রয়োজনীয়।



নিবন্ধ বিষয়বস্তু

বেসিক কলব্যাক ফাংশন স্কিম

একটি কলব্যাক ফাংশন স্কিম একটি প্রধান ফাংশন প্রয়োজন, এবং কলব্যাক ফাংশন নিজেই। কলব্যাক ফাংশনের ঘোষণা প্রধান ফাংশনের প্যারামিটার তালিকার একটি অংশ। কলব্যাক ফাংশনের সংজ্ঞা প্রধান ফাংশনের ফাংশন কলে নির্দেশিত হয়। কলব্যাক ফাংশন আসলে প্রধান ফাংশনের সংজ্ঞার মধ্যেই বলা হয়। নিম্নলিখিত প্রোগ্রামটি এটিকে ব্যাখ্যা করে:



#অন্তর্ভুক্ত

ব্যবহার নামস্থানঘন্টার;



intmainFn(গৃহস্থালিসিএইচ[],int (*পিটিআর)(int))

{

intid1= ;

intid2= 2;

intসাধারণত= (*পিটিআর)(id2);

খরচ<<'প্রধান কাজ:'<<id1<<''<<সিএইচ<<''<<সাধারণত<<'n';

প্রত্যাবর্তনid1;

}


intcb(intiden)

{

খরচ<<'কলব্যাক ফাংশন'<<'n';

প্রত্যাবর্তনiden;

}


intপ্রধান()

{

int (*পিটিআর)(int) = &cb;

গৃহস্থালিনা[] = 'এবং';

mainFn(বাবা, সিবি);



প্রত্যাবর্তন 0;

}

আউটপুট হল:





কলব্যাক ফাংশন

প্রধান কাজ: এবং 2

প্রধান ফাংশন প্রিন্সিপালএফএন () দ্বারা চিহ্নিত করা হয়। কলব্যাক ফাংশনটি cb () দ্বারা চিহ্নিত করা হয়। কলব্যাক ফাংশনটি প্রধান ফাংশনের বাইরে সংজ্ঞায়িত করা হয় কিন্তু প্রকৃতপক্ষে প্রধান ফাংশনের মধ্যেই বলা হয়।

মূল ফাংশন ঘোষণার প্যারামিটার তালিকায় একটি প্যারামিটার হিসাবে কলব্যাক ফাংশনের ঘোষণাটি লক্ষ্য করুন। কলব্যাক ফাংশনের ঘোষণা হল int (*ptr) (int)। প্রধান ফাংশনের সংজ্ঞায় কলব্যাক ফাংশন এক্সপ্রেশন, যেমন একটি ফাংশন কল; কলব্যাক ফাংশন কল জন্য কোন যুক্তি সেখানে পাস করা হয়। এই ফাংশন কল জন্য বিবৃতি হল:



intসাধারণত= (*পিটিআর)(id2);

যেখানে id2 একটি যুক্তি। ptr হল প্যারামিটারের অংশ, একটি পয়েন্টার, যা মূল () ফাংশনে কলব্যাক ফাংশনের রেফারেন্সের সাথে যুক্ত হবে।

অভিব্যক্তিটি লক্ষ্য করুন:

int (*পিটিআর)(int) = &cb;

মূল () ফাংশনে, যা কলব্যাক ফাংশনের ঘোষণাকে (সংজ্ঞা ছাড়া) একই কলব্যাক ফাংশনের সংজ্ঞার নামের সাথে সংযুক্ত করে।

প্রধান ফাংশনকে প্রধান () ফাংশনে বলা হয়, যেমন:

mainFn(বাবা, সিবি);

যেখানে cha হল একটি স্ট্রিং এবং cb হল তার কোন যুক্তি ছাড়াই কলব্যাক ফাংশনের নাম।

কলব্যাক ফাংশনের সিঙ্ক্রোনাস আচরণ

নিম্নলিখিত প্রোগ্রাম বিবেচনা করুন:

#অন্তর্ভুক্ত

ব্যবহার নামস্থানঘন্টার;



শূন্যmainFn(শূন্য (*পিটিআর)())

{

খরচ<<'প্রধান কাজ'<<'n';

(*পিটিআর)();

}


শূন্যcb()

{

খরচ<<'কলব্যাক ফাংশন'<<'n';

}


শূন্যfn()

{

খরচ<<'দেখা'<<'n';

}


intপ্রধান()

{

শূন্য (*পিটিআর)() = &cb;

mainFn(cb);

fn();



প্রত্যাবর্তন 0;

}

আউটপুট হল:

প্রধান কাজ

কলব্যাক ফাংশন

দেখা

এখানে একটি নতুন ফাংশন আছে। সমস্ত নতুন ফাংশন, দেখা আউটপুট প্রদর্শন করা হয়। প্রধান () ফাংশনে, প্রধান ফাংশন বলা হয়, তারপর নতুন ফাংশন, fn () বলা হয়। আউটপুট দেখায় যে প্রধান ফাংশনের জন্য কোডটি কার্যকর করা হয়েছিল, তারপরে কলব্যাক ফাংশনটি কার্যকর করা হয়েছিল এবং অবশেষে fn () ফাংশনটি কার্যকর করা হয়েছিল। এটি সিঙ্ক্রোনাস (একক থ্রেডেড) আচরণ।

যদি এটি অসিঙ্ক্রোনাস আচরণ ছিল, যখন তিনটি কোড সেগমেন্টকে ক্রমানুসারে বলা হয়, প্রথম কোড সেগমেন্টটি কার্যকর করা যেতে পারে, তারপরে দ্বিতীয় কোড সেগমেন্ট কার্যকর করার আগে তৃতীয় কোড সেগমেন্টের এক্সিকিউশন অনুসরণ করা যেতে পারে।

ভাল, ফাংশন, fn () প্রধান ফাংশনের সংজ্ঞা থেকে বলা যেতে পারে, পরিবর্তে প্রধান () ফাংশনের মধ্যে থেকে, নিম্নরূপ:

#অন্তর্ভুক্ত

ব্যবহার নামস্থানঘন্টার;



শূন্যfn()

{

খরচ<<'দেখা'<<'n';

}


শূন্যmainFn(শূন্য (*পিটিআর)())

{

খরচ<<'প্রধান কাজ'<<'n';

fn();

(*পিটিআর)();

}


শূন্যcb()

{

খরচ<<'কলব্যাক ফাংশন'<<'n';

}


intপ্রধান()

{

শূন্য (*পিটিআর)() = &cb;

mainFn(cb);



প্রত্যাবর্তন 0;

}

আউটপুট হল:

প্রধান কাজ

দেখা

কলব্যাক ফাংশন

এটি অসিঙ্ক্রোনাস আচরণের অনুকরণ। এটি অসিঙ্ক্রোনাস আচরণ নয়। এটি এখনও সিঙ্ক্রোনাস আচরণ।

এছাড়াও, প্রিন্সিপাল ফাংশনের কোড সেগমেন্ট এবং কলব্যাক ফাংশনের কোড সেগমেন্টের এক্সিকিউশনের অর্ডার প্রিন্সিপাল ফাংশনের সংজ্ঞায় অদলবদল করা যায়। নিম্নলিখিত প্রোগ্রামটি এটিকে ব্যাখ্যা করে:

#অন্তর্ভুক্ত

ব্যবহার নামস্থানঘন্টার;



শূন্যmainFn(শূন্য (*পিটিআর)())

{

(*পিটিআর)();

খরচ<<'প্রধান কাজ'<<'n';

}


শূন্যcb()

{

খরচ<<'কলব্যাক ফাংশন'<<'n';

}


শূন্যfn()

{

খরচ<<'দেখা'<<'n';

}


intপ্রধান()

{

শূন্য (*পিটিআর)() = &cb;

mainFn(cb);

fn();



প্রত্যাবর্তন 0;

}

আউটপুট এখন,

কলব্যাক ফাংশন

প্রধান কাজ

দেখা

এটিও অসিঙ্ক্রোনাস আচরণের অনুকরণ। এটি অসিঙ্ক্রোনাস আচরণ নয়। এটি এখনও সিঙ্ক্রোনাস আচরণ। সত্যিকারের অসিঙ্ক্রোনাস আচরণ পরবর্তী বিভাগে বা লাইব্রেরি, ভবিষ্যতে ব্যাখ্যা করা যেতে পারে।

কলব্যাক ফাংশন সহ অসিঙ্ক্রোনাস আচরণ

মৌলিক অ্যাসিঙ্ক্রোনাস কলব্যাক ফাংশন স্কিমের জন্য ছদ্ম-কোড হল:

আউটপুট টাইপ করুন;

cb টাইপ করুন(আউটপুট টাইপ করুন)

{

// বিবৃতি

}


প্রিন্সিপালএফএন টাইপ করুন(টাইপ ইনপুট, টাইপ সিবি(আউটপুট টাইপ করুন))

{

// বিবৃতি

}

ছদ্ম-কোডের বিভিন্ন জায়গায় ইনপুট এবং আউটপুট ডেটার অবস্থানগুলি লক্ষ্য করুন। কলব্যাক ফাংশনের ইনপুট হল এর আউটপুট। প্রধান ফাংশনের প্যারামিটার হল সাধারণ কোডের ইনপুট প্যারামিটার এবং কলব্যাক ফাংশনের প্যারামিটার। এই স্কিমের মাধ্যমে, কলব্যাক ফাংশনের আউটপুট পড়ার আগে মেইন () ফাংশনে একটি তৃতীয় ফাংশন চালানো যেতে পারে (বলা হয়) (এখনও মেইন () ফাংশনে)। নিচের কোডটি এটিকে ব্যাখ্যা করে:

#অন্তর্ভুক্ত

ব্যবহার নামস্থানঘন্টার;

গৃহস্থালি *আউটপুট;


শূন্যcb(গৃহস্থালিবাইরে[])

{

আউটপুট=বাইরে;

}



শূন্যmainFn(গৃহস্থালিইনপুট[],শূন্য (*পিটিআর)(গৃহস্থালি[পঞ্চাশ]))

{

(*পিটিআর)(ইনপুট);

খরচ<<'প্রধান কাজ'<<'n';

}


শূন্যfn()

{

খরচ<<'দেখা'<<'n';

}


intপ্রধান()

{

গৃহস্থালিইনপুট[] = 'কলব্যাক ফাংশন';

শূন্য (*পিটিআর)(গৃহস্থালি[]) = &cb;

mainFn(ইনপুট, cb);

fn();

খরচ<<আউটপুট<<'n';



প্রত্যাবর্তন 0;

}

প্রোগ্রাম আউটপুট হল:

প্রধান কাজ

দেখা

কলব্যাক ফাংশন

এই নির্দিষ্ট কোডে, আউটপুট এবং ইনপুট ডেটাম একই ডেটাম হয়। মেইন () ফাংশনে তৃতীয় ফাংশন কলের ফলাফল কলব্যাক ফাংশনের ফলাফলের আগে প্রদর্শিত হয়েছে। কলব্যাক ফাংশন এক্সিকিউট, ফিনিশ, এবং ভেরিয়েবল, আউটপুটে তার রেজাল্ট (ভ্যালু) নির্ধারিত করে, প্রোগ্রামটিকে তার হস্তক্ষেপ ছাড়াই চালিয়ে যেতে দেয়। প্রধান () ফাংশনে, কলব্যাক ফাংশনের আউটপুট ব্যবহার করা হয়েছিল (পড়ুন এবং প্রদর্শিত) যখন এটি প্রয়োজন হয়, যা পুরো স্কিমের জন্য অসিঙ্ক্রোনাস আচরণের দিকে পরিচালিত করে।

বিশুদ্ধ C ++ দিয়ে কলব্যাক ফাংশন অ্যাসিঙ্ক্রোনাস আচরণ পাওয়ার জন্য এটি একক-থ্রেড উপায়।

ভবিষ্যতের লাইব্রেরির মৌলিক ব্যবহার

অ্যাসিঙ্ক্রোনাস কলব্যাক ফাংশন স্কিমের ধারণা হল কলব্যাক ফাংশন ফেরার আগে প্রধান ফাংশন ফিরে আসে। এটি উপরের কোডে পরোক্ষভাবে, কার্যকরভাবে করা হয়েছিল।

উপরের কোড থেকে লক্ষ্য করুন যে কলব্যাক ফাংশন কোডের জন্য প্রধান ইনপুট গ্রহণ করে এবং কোডের জন্য প্রধান আউটপুট উৎপন্ন করে। সি ++ লাইব্রেরি, ভবিষ্যতে, সিঙ্ক () নামে একটি ফাংশন রয়েছে। এই ফাংশনের প্রথম যুক্তি হল কলব্যাক ফাংশন রেফারেন্স; দ্বিতীয় যুক্তি হল কলব্যাক ফাংশনের ইনপুট। সিঙ্ক () ফাংশনটি কলব্যাক ফাংশনটি সম্পন্ন হওয়ার জন্য অপেক্ষা না করে ফিরে আসে কিন্তু কলব্যাক ফাংশনটি সম্পূর্ণ করতে দেয়। এটি অ্যাসিঙ্ক্রোনাস আচরণ প্রদান করে। যদিও কলব্যাক ফাংশনটি চলতে থাকে, যেহেতু সিঙ্ক () ফাংশন ইতিমধ্যে ফিরে এসেছে, এর নীচের বিবৃতিগুলি কার্যকর করা অব্যাহত রয়েছে। এটি আদর্শ অসিঙ্ক্রোনাস আচরণের মতো।

ভবিষ্যতের লাইব্রেরি এবং এর সিঙ্ক () ফাংশন বিবেচনায় নিয়ে উপরের প্রোগ্রামটি নীচে পুনরায় লেখা হয়েছে:

#অন্তর্ভুক্ত

#অন্তর্ভুক্ত

#অন্তর্ভুক্ত

ব্যবহার নামস্থানঘন্টার;

ভবিষ্যৎ<স্ট্রিং>আউটপুট;

স্ট্রিং cb(স্ট্রিং স্ট্রি)

{

প্রত্যাবর্তনstri;

}



শূন্যmainFn(স্ট্রিং ইনপুট)

{

আউটপুট=async(cb, ইনপুট);

খরচ<<'প্রধান কাজ'<<'n';

}


শূন্যfn()

{

খরচ<<'দেখা'<<'n';

}


intপ্রধান()

{

স্ট্রিং ইনপুট=স্ট্রিং('কলব্যাক ফাংশন');

mainFn(ইনপুট);

fn();

স্ট্রিং ret=আউটপুটপাওয়া(); // প্রয়োজনে কলব্যাক ফিরে আসার জন্য অপেক্ষা করে

খরচ<<ঠিক<<'n';



প্রত্যাবর্তন 0;

}

সিঙ্ক () ফাংশন অবশেষে কলব্যাক ফাংশনের আউটপুট ভবিষ্যতের বস্তুর মধ্যে সংরক্ষণ করে। ভবিষ্যতের বস্তুর get () সদস্য ফাংশন ব্যবহার করে প্রত্যাশিত আউটপুট প্রধান () ফাংশনে পাওয়া যাবে।

উপসংহার

একটি কলব্যাক ফাংশন হল একটি ফাংশন, যা একটি আর্গুমেন্ট, প্যারামিটার নয়, অন্য ফাংশনে। একটি কলব্যাক ফাংশন স্কিম একটি প্রধান ফাংশন প্রয়োজন, এবং কলব্যাক ফাংশন নিজেই। কলব্যাক ফাংশনের ঘোষণা প্রধান ফাংশনের প্যারামিটার তালিকার একটি অংশ। কলব্যাক ফাংশনের সংজ্ঞা প্রিন্সিপাল ফাংশনের ফাংশন কলে (প্রধান ()) নির্দেশিত হয়। কলব্যাক ফাংশন আসলে প্রধান ফাংশনের সংজ্ঞার মধ্যেই বলা হয়।

একটি কলব্যাক ফাংশন স্কিম অগত্যা অসিঙ্ক্রোনাস নয়। কলব্যাক ফাংশন স্কিমটি অসিঙ্ক্রোনাস তা নিশ্চিত করার জন্য, কোডের মূল ইনপুট, কলব্যাক ফাংশনের ইনপুট তৈরি করুন; কোডের প্রধান আউটপুট, কলব্যাক ফাংশনের আউটপুট; কলব্যাক ফাংশনের আউটপুট একটি ভেরিয়েবল বা ডেটা স্ট্রাকচারে সংরক্ষণ করুন। প্রধান () ফাংশনে, প্রধান ফাংশনকে কল করার পরে, অ্যাপ্লিকেশনের অন্যান্য বিবৃতিগুলি চালান। যখন কলব্যাক ফাংশনের আউটপুট প্রয়োজন হয়, তখন প্রধান () ফাংশনে, এটি ব্যবহার করুন (পড়ুন এবং প্রদর্শন করুন) এবং তারপর।