C ++ میں کال بیک فنکشن۔

Callback Function C



ایک کال بیک فنکشن ایک فنکشن ہے ، جو ایک دلیل ہے ، پیرامیٹر نہیں ، دوسرے فنکشن میں۔ دوسرے فنکشن کو پرنسپل فنکشن کہا جا سکتا ہے۔ تو دو افعال شامل ہیں: پرنسپل فنکشن اور کال بیک فنکشن خود۔ پرنسپل فنکشن کی پیرامیٹر لسٹ میں ، کال بیک فنکشن کا اعلان اس کی تعریف کے بغیر موجود ہے ، جس طرح اسائنمنٹ کے بغیر آبجیکٹ ڈیکلریشن موجود ہے۔ پرنسپل فنکشن کو دلائل کے ساتھ کہا جاتا ہے (مین () میں) پرنسپل فنکشن کال میں دلائل میں سے ایک کال بیک فنکشن کی موثر تعریف ہے۔ C ++ میں ، یہ دلیل کال بیک فنکشن کی تعریف کا حوالہ ہے۔ یہ اصل تعریف نہیں ہے کال بیک فنکشن بذات خود پرنسپل فنکشن کی تعریف میں کہا جاتا ہے۔

C ++ میں بنیادی کال بیک فنکشن کسی پروگرام میں غیر متزلزل رویے کی ضمانت نہیں دیتا۔ غیر متزلزل رویہ کال بیک فنکشن اسکیم کا حقیقی فائدہ ہے۔ غیر مطابقت پذیر کال بیک فنکشن اسکیم میں ، پروگرام کے لیے پرنسپل فنکشن کا نتیجہ حاصل کیا جانا چاہیے اس سے پہلے کہ کال بیک فنکشن کا نتیجہ حاصل کیا جائے۔ یہ C ++ میں کرنا ممکن ہے تاہم ، C ++ میں ایک لائبریری ہے جسے مستقبل کہا جاتا ہے تاکہ غیر متزلزل کال بیک فنکشن اسکیم کے رویے کی ضمانت دی جا سکے۔







یہ مضمون بنیادی کال بیک فنکشن سکیم کی وضاحت کرتا ہے۔ اس کا بہت کچھ خالص C ++ کے ساتھ ہے۔ جہاں تک کال بیک کا تعلق ہے ، مستقبل کی لائبریری کے بنیادی رویے کی بھی وضاحت کی گئی ہے۔ اس مضمون کی تفہیم کے لیے C ++ اور اس کے نکات کا بنیادی علم ضروری ہے۔



مضمون کا مواد۔

بنیادی کال بیک فنکشن سکیم

کال بیک فنکشن اسکیم کو پرنسپل فنکشن کی ضرورت ہوتی ہے ، اور کال بیک فنکشن خود۔ کال بیک فنکشن کا اعلان پرنسپل فنکشن کی پیرامیٹر لسٹ کا حصہ ہے۔ کال بیک فنکشن کی تعریف پرنسپل فنکشن کے فنکشن کال میں دی گئی ہے۔ کال بیک فنکشن اصل میں پرنسپل فنکشن کی تعریف میں کہا جاتا ہے۔ مندرجہ ذیل پروگرام اس کی وضاحت کرتا ہے:



#شامل کریں

استعمال کرتے ہوئے نام کی جگہگھنٹے؛



intمین ایف این(چارچودھری[]،int (*پی ٹی آر)(int))

{

intid1= ؛

intid2= ؛

intعام طور پر= (*پی ٹی آر)(id2)؛

لاگت<<'بنیادی کام:'<<id1<<''<<چودھری<<''<<عام طور پر<<'n'؛

واپسیid1؛

}


intسی بی(intiden)

{

لاگت<<'کال بیک فنکشن'<<'n'؛

واپسیiden؛

}


intمرکزی()

{

int (*پی ٹی آر)(int) = &سی بی؛

چارنہیں[] = 'اور'؛

مین ایف این(والد ، سی بی)؛



واپسی ؛

}

پیداوار یہ ہے:





کال بیک فنکشن

پرنسپل فنکشن: اور

پرنسپل فنکشن کی شناخت پرنسپل ایف این () سے ہوتی ہے۔ کال بیک فنکشن کی شناخت cb () سے ہوتی ہے۔ کال بیک فنکشن کی وضاحت پرنسپل فنکشن سے باہر ہوتی ہے لیکن اصل میں اسے پرنسپل فنکشن کے اندر بلایا جاتا ہے۔

پرنسپل فنکشن ڈیکلریشن کی پیرامیٹر لسٹ میں بطور پیرامیٹر کال بیک فنکشن کا اعلان نوٹ کریں۔ کال بیک فنکشن کا اعلان int (*ptr) (int) ہے۔ کال بیک فنکشن ایکسپریشن کو نوٹ کریں ، جیسے فنکشن کال ، پرنسپل فنکشن کی تعریف میں؛ کال بیک فنکشن کال کے لیے کوئی دلیل وہاں سے گزر جاتی ہے۔ اس فنکشن کال کا بیان یہ ہے:



intعام طور پر= (*پی ٹی آر)(id2)؛

جہاں id2 ایک دلیل ہے۔ ptr پیرامیٹر کا حصہ ہے ، ایک پوائنٹر ، جو مین () فنکشن میں کال بیک فنکشن کے حوالہ سے منسلک ہوگا۔

اظہار خیال کریں:

int (*پی ٹی آر)(int) = &سی بی؛

مین () فنکشن میں ، جو کال بیک فنکشن کے ڈیکلریشن (ڈیفینیشن کے بغیر) کو اسی کال بیک فنکشن کی تعریف کے نام سے جوڑتا ہے۔

مرکزی فنکشن کو مین () فنکشن میں کہا جاتا ہے ، جیسے:

مین ایف این(والد ، سی بی)؛

جہاں چا ایک سٹرنگ ہے اور سی بی بلاک فنکشن کا نام ہے بغیر کسی دلیل کے۔

کال بیک فنکشن کا ہم وقتی رویہ۔

مندرجہ ذیل پروگرام پر غور کریں:

#شامل کریں

استعمال کرتے ہوئے نام کی جگہگھنٹے؛



باطلمین ایف این(باطل (*پی ٹی آر)())

{

لاگت<<'پرنسپل فنکشن'<<'n'؛

(*پی ٹی آر)()؛

}


باطلسی بی()

{

لاگت<<'کال بیک فنکشن'<<'n'؛

}


باطلfn()

{

لاگت<<'دیکھا'<<'n'؛

}


intمرکزی()

{

باطل (*پی ٹی آر)() = &سی بی؛

مین ایف این(سی بی)؛

fn()؛



واپسی ؛

}

پیداوار یہ ہے:

پرنسپل فنکشن

کال بیک فنکشن

دیکھا

یہاں ایک نیا فنکشن ہے۔ تمام نئے کام کرتا ہے ، آؤٹ پٹ کو ظاہر کرنا ہے۔ مین () فنکشن میں ، پرنسپل فنکشن کہا جاتا ہے ، پھر نیا فنکشن ، ایف این () کہا جاتا ہے۔ آؤٹ پٹ سے پتہ چلتا ہے کہ پرنسپل فنکشن کے لیے کوڈ پر عمل درآمد کیا گیا ، پھر کال بیک فنکشن کے لیے ، اور آخر کار fn () فنکشن کے لیے عملدرآمد کیا گیا۔ یہ مطابقت پذیر (سنگل تھریڈڈ) رویہ ہے۔

اگر یہ غیر متزلزل رویہ تھا ، جب تین کوڈ حصوں کو ترتیب سے بلایا جاتا ہے ، پہلے کوڈ کے حصے کو پھانسی دی جاسکتی ہے ، اس کے بعد تیسرا کوڈ طبقہ عمل میں لایا جاسکتا ہے ، اس سے پہلے کہ دوسرا کوڈ طبقہ عمل میں آئے۔

ٹھیک ہے ، فنکشن ، fn () کو مرکزی فنکشن کی تعریف کے اندر سے کہا جاسکتا ہے ، بجائے مین () فنکشن کے اندر سے ،

#شامل کریں

استعمال کرتے ہوئے نام کی جگہگھنٹے؛



باطلfn()

{

لاگت<<'دیکھا'<<'n'؛

}


باطلمین ایف این(باطل (*پی ٹی آر)())

{

لاگت<<'پرنسپل فنکشن'<<'n'؛

fn()؛

(*پی ٹی آر)()؛

}


باطلسی بی()

{

لاگت<<'کال بیک فنکشن'<<'n'؛

}


intمرکزی()

{

باطل (*پی ٹی آر)() = &سی بی؛

مین ایف این(سی بی)؛



واپسی ؛

}

پیداوار یہ ہے:

پرنسپل فنکشن

دیکھا

کال بیک فنکشن

یہ غیر متزلزل رویے کی تقلید ہے۔ یہ غیر متزلزل رویہ نہیں ہے۔ یہ اب بھی ہم وقتی رویہ ہے۔

نیز ، پرنسپل فنکشن کے کوڈ سیگمنٹ اور کال بیک فنکشن کے کوڈ سیگمنٹ پر عمل درآمد کا آرڈر پرنسپل فنکشن کی تعریف میں تبدیل کیا جاسکتا ہے۔ مندرجہ ذیل پروگرام اس کی وضاحت کرتا ہے:

#شامل کریں

استعمال کرتے ہوئے نام کی جگہگھنٹے؛



باطلمین ایف این(باطل (*پی ٹی آر)())

{

(*پی ٹی آر)()؛

لاگت<<'پرنسپل فنکشن'<<'n'؛

}


باطلسی بی()

{

لاگت<<'کال بیک فنکشن'<<'n'؛

}


باطلfn()

{

لاگت<<'دیکھا'<<'n'؛

}


intمرکزی()

{

باطل (*پی ٹی آر)() = &سی بی؛

مین ایف این(سی بی)؛

fn()؛



واپسی ؛

}

پیداوار اب ہے ،

کال بیک فنکشن

پرنسپل فنکشن

دیکھا

یہ غیر متزلزل رویے کی تقلید بھی ہے۔ یہ غیر متزلزل رویہ نہیں ہے۔ یہ اب بھی ہم وقتی رویہ ہے۔ سچے غیر مطابقت پذیر رویے کو حاصل کیا جاسکتا ہے جیسا کہ اگلے سیکشن یا لائبریری کے ساتھ مستقبل میں بیان کیا گیا ہے۔

کال بیک فنکشن کے ساتھ غیر متزلزل رویہ۔

بنیادی اسینکرونس کال بیک فنکشن اسکیم کے لیے سیڈو کوڈ یہ ہے:

آؤٹ پٹ ٹائپ کریں۔؛

قسم سی بی(آؤٹ پٹ ٹائپ کریں۔)

{

// بیانات

}


پرنسپل ایف این ٹائپ کریں۔(ٹائپ ان پٹ ، ٹائپ سی بی۔(آؤٹ پٹ ٹائپ کریں۔))

{

// بیانات

}

سیڈو کوڈ کے مختلف مقامات پر ان پٹ اور آؤٹ پٹ ڈیٹا کی پوزیشن نوٹ کریں۔ کال بیک فنکشن کا ان پٹ اس کا آؤٹ پٹ ہے۔ پرنسپل فنکشن کے پیرامیٹرز عام کوڈ کے ان پٹ پیرامیٹر اور کال بیک فنکشن کے پیرامیٹر ہیں۔ اس اسکیم کے ساتھ ، کال بیک فنکشن کا آؤٹ پٹ پڑھنے سے پہلے مین () فنکشن میں تیسرا فنکشن (بلایا) جا سکتا ہے (اب بھی مین () فنکشن میں) مندرجہ ذیل کوڈ اس کی وضاحت کرتا ہے:

#شامل کریں

استعمال کرتے ہوئے نام کی جگہگھنٹے؛

چار *پیداوار؛


باطلسی بی(چارباہر[])

{

پیداوار=باہر؛

}



باطلمین ایف این(چاران پٹ[]،باطل (*پی ٹی آر)(چار[پچاس]))

{

(*پی ٹی آر)(ان پٹ)؛

لاگت<<'پرنسپل فنکشن'<<'n'؛

}


باطلfn()

{

لاگت<<'دیکھا'<<'n'؛

}


intمرکزی()

{

چاران پٹ[] = 'کال بیک فنکشن'؛

باطل (*پی ٹی آر)(چار[]) = &سی بی؛

مین ایف این(ان پٹ ، سی بی)؛

fn()؛

لاگت<<پیداوار<<'n'؛



واپسی ؛

}

پروگرام کی پیداوار یہ ہے:

پرنسپل فنکشن

دیکھا

کال بیک فنکشن

اس مخصوص کوڈ میں ، آؤٹ پٹ اور ان پٹ ڈیٹم ایک ہی ڈیٹم ہوتا ہے۔ مرکزی () فنکشن میں تیسرے فنکشن کال کا نتیجہ کال بیک فنکشن کے رزلٹ سے پہلے دکھایا گیا ہے۔ کال بیک فنکشن نے متغیر ، آؤٹ پٹ پر عملدرآمد ، ختم ، اور اس کا نتیجہ (ویلیو) تفویض کیا ، جس سے پروگرام بغیر کسی مداخلت کے جاری رہ سکتا ہے۔ مین () فنکشن میں ، کال بیک فنکشن کا آؤٹ پٹ استعمال کیا گیا (پڑھا اور ڈسپلے کیا گیا) جب اس کی ضرورت پڑی ، جس کی وجہ سے پوری اسکیم میں غیر متزلزل سلوک ہوا۔

خالص C ++ کے ساتھ کال بیک فنکشن غیر مطابقت پذیر سلوک حاصل کرنے کا یہ واحد تھریڈ طریقہ ہے۔

مستقبل کی لائبریری کا بنیادی استعمال۔

غیر متزلزل کال بیک فنکشن اسکیم کا خیال یہ ہے کہ کال بیک فنکشن واپس آنے سے پہلے پرنسپل فنکشن واپس آجاتا ہے۔ یہ بالواسطہ ، مؤثر طریقے سے اوپر کے کوڈ میں کیا گیا تھا۔

مذکورہ کوڈ سے نوٹ کریں کہ کال بیک فنکشن کوڈ کے لیے اہم ان پٹ حاصل کرتا ہے اور کوڈ کے لیے مین آؤٹ پٹ تیار کرتا ہے۔ C ++ لائبریری ، مستقبل ، کا ایک فنکشن ہے جسے sync () کہتے ہیں۔ اس فنکشن کی پہلی دلیل کال بیک فنکشن ریفرنس ہے۔ دوسری دلیل کال بیک فنکشن کا ان پٹ ہے۔ sync () فنکشن کال بیک فنکشن کے مکمل ہونے کا انتظار کیے بغیر واپس آجاتا ہے لیکن کال بیک فنکشن مکمل ہونے دیتا ہے۔ یہ غیر متزلزل رویہ فراہم کرتا ہے۔ جبکہ کال بیک فنکشن جاری رہتا ہے ، چونکہ sync () فنکشن پہلے ہی واپس آچکا ہے ، اس کے نیچے دیئے گئے بیانات پر عملدرآمد جاری ہے۔ یہ مثالی غیر متزلزل رویے کی طرح ہے۔

مذکورہ پروگرام کو مستقبل کی لائبریری اور اس کی سنک () فنکشن کو مدنظر رکھتے ہوئے دوبارہ لکھا گیا ہے۔

#شامل کریں

#شامل کریں

#شامل کریں

استعمال کرتے ہوئے نام کی جگہگھنٹے؛

مستقبل<تار>پیداوار؛

سٹرنگ سی بی(سٹرنگ سٹر)

{

واپسیسٹرائی؛

}



باطلمین ایف این(سٹرنگ ان پٹ)

{

پیداوار=async(سی بی ، ان پٹ۔)؛

لاگت<<'پرنسپل فنکشن'<<'n'؛

}


باطلfn()

{

لاگت<<'دیکھا'<<'n'؛

}


intمرکزی()

{

سٹرنگ ان پٹ=تار('کال بیک فنکشن')؛

مین ایف این(ان پٹ)؛

fn()؛

سٹرنگ ریٹ=پیداوارحاصل کریں()؛ // ضرورت پڑنے پر کال بیک واپس آنے کا انتظار کرتا ہے۔

لاگت<<ٹھیک ہے<<'n'؛



واپسی ؛

}

sync () فنکشن آخر کار کال بیک فنکشن کی آؤٹ پٹ کو مستقبل کی شے میں محفوظ کرتا ہے۔ متوقع آؤٹ پٹ مستقبل کی شے کے get () ممبر فنکشن کا استعمال کرتے ہوئے مین () فنکشن میں حاصل کیا جا سکتا ہے۔

نتیجہ

ایک کال بیک فنکشن ایک فنکشن ہے ، جو ایک دلیل ہے ، پیرامیٹر نہیں ، دوسرے فنکشن میں۔ کال بیک فنکشن اسکیم کو پرنسپل فنکشن کی ضرورت ہوتی ہے ، اور کال بیک فنکشن خود۔ کال بیک فنکشن کا اعلان پرنسپل فنکشن کی پیرامیٹر لسٹ کا حصہ ہے۔ کال بیک فنکشن کی تعریف پرنسپل فنکشن (مین () میں) کی فنکشن کال میں دی گئی ہے۔ کال بیک فنکشن اصل میں پرنسپل فنکشن کی تعریف میں کہا جاتا ہے۔

کال بیک فنکشن اسکیم ضروری نہیں کہ غیر متزلزل ہو۔ اس بات کا یقین کرنے کے لیے کہ کال بیک فنکشن اسکیم غیر متزلزل ہے ، کوڈ میں اہم ان پٹ ، کال بیک فنکشن میں ان پٹ بنائیں۔ کوڈ کی مرکزی پیداوار ، کال بیک فنکشن کی پیداوار؛ کال بیک فنکشن کی پیداوار کو متغیر یا ڈیٹا ڈھانچے میں محفوظ کریں۔ مین () فنکشن میں ، پرنسپل فنکشن کو کال کرنے کے بعد ، ایپلیکیشن کے دیگر بیانات پر عمل کریں۔ جب کال بیک فنکشن کی آؤٹ پٹ کی ضرورت ہوتی ہے تو ، مین () فنکشن میں ، اسے وہاں پڑھیں اور ڈسپلے کریں۔