الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مؤشرات الدوال

مغلق
بدأه Super_emad55 في 3 يونيو 2006 · 15 رد · 3,198 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم,

أود أن اطرح موضوع ممتع و مهم و مخفي عن كثير من المبرمجين و هو "المؤشرات إلى دوال" أو ما يسمى "Function Pointers" لن أطيل عليكم بالمقدمة, لنبدأ بالتوضيحات,

لنفرض أن لدينا الدوال الاتية بداخل برنامج ما:

float Plus (float a, float b) { return a+b; }
float Minus (float a, float b) { return a-b; }
float Multiply (float a, float b) { return a*b; }
float Divide (float a, float b) { return a/b; }

فاذا اردنا استخدامها في برنامج معين, سوف نقوم بالاتي:

نكتب الداله الاتيه, لنستدعيها من الmain

float Switch(float a, float b, char opCode)
{
	float result;
	switch(opCode) // execute operation
	{
	case '+' : result = Plus (a, b); break;
	case '-' : result = Minus (a, b); break;
	case '*' : result = Multiply(a, b); break;
	case '/' : result = Divide (a, b); break;
	}
	return result;
}

ليكون ال main لدينا كالاتي:

void main()
{
	cout << Switch(10, 20, '+') << endl;
	cout << Switch(10, 20, '*') << endl;

}

للبرنامج اعلاه الامر واضح جدا.

الان هل ياترى نستطيع ان نبدل ‘+’ او ‘*’ باسم الداله نفسه؟؟!!

يعني هل نستطيع ان نقول بالاتي:

Instead of 
  Switch(10, 20, '+')
Can we do 
 Switch(10, 20, Plus)

لحسن الحظ و لقوة لغة ال c++ نعم نستطيع, فكما ان اسم المصفوفه هو مؤشر لاول عنصر فيها, اسم الداله هو مؤشر لها !! معقول !!

نعم اخي, و كل ما تحتاجه هو ان تخبر ال compiler من أي نوع الداله هي.

الكثير ينتظر الامثله لكي يتضح الوضع.

حسنا هنا مثال واضح جدا:

لنفرض ان الداله التي نستخدمها هي

float Plus (float a, float b) { return a+b; }

فتكون الدالة المؤشره لداله بهذا الشكل

typedef float (* PF) (float a, float b)

typedef: دائما بهذا الشكل.

Float: نوع الداله الاصليه

(* PF): اسم المؤشر

(float a, float B): كما هو في الداله الاصليه

و الأن المفاجأه الكبرى, انظروا ماذا يمكننا ان نفعل الان

void main()
{
	PF my_function;
	my_function = Divide;

	cout << my_function(10, 20) << endl;
	cout << (* my_function)(10, 20) << endl;
}

قد تقول انا فهمت هذه

cout << my_function(10, 20) << endl;

ولكن ماهذا

cout << (* my_function)(10, 20) << endl;

اخي الكثير يحب ان يعمل برنامجه معقد و يصعب على الاخرين فهمه "هذا مرض بس اش نسوي :) "

هاتان الجملتان يقومان بنفس الوظيفه تماما.

ارجوا ان لا اكون اطلت الحديث, و لكن الموضوع لم ينتهي بعد, فالc++

بحر غميق لازم نتحلى بالصبر لنتخطاه.

سوف اكمل الشرح, اذا كان شرحي واضح و كلامي مفهوم.

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#2

ولا تعليق لحد الان :(

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#3

فعلا موضوع جميل جدا وشيق وأغلب البرمجين لا يعرفوا ما هو الfunction pointer and callback

أتمنى أن تتعمق اكتر وتشرح أيضا callback

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#4

إن شاء الله سوف اكمل...

تحياتي

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#5

شباب الاخ eng_3llam فاهم الموضوع من قبل.

اريد اراء الشباب الي تعرفوا على الموضوع من جديد عن طريق موضوعي... هل كان شرحي واضح... حتى اعرف هل اكمل ام لأ

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#7

May be students have exams

Topic is very good and article is well made

Go ahead

#8

yeah maybe,

anyway, thanx for ur reply

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#9

موضوع رائع و شرح جميل . بارك الله فيك ;)

#10

السلام عليكم

الموضوع ممتاز وعدد الزيارات للموضوع ايضاً ممتاز وعالى, واصل الشرح ولا تستعجل على رزقك اكيد الاسئلة سوف تنهمر عليك, عالباً اغلبية الاعضاء فى فترة إختبارات ولك الموضوع موجود فى المنتدي..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#11

مثال حلو

بس عتب صغير المؤشرات الدالية او المؤشرات لاتستخدم لتعقيد البرنامج بل العكس

ومثال صغير اذا كنا داخل class واردنا في احدى الدوال ان نعيد سلسلة محرفية

claas ffd
private:
char a[20];
puplic:
char* getname()
{return a;}

ان هذه الطريقة سوف توفر حجما بالذاكرة لن تشعر به الا اذا كنت تستخد حجم لمصفوفات عادية (ليست ديناميكية مبنية من خلال مؤشرات)وبعدد هائل مثلا اذا كنا نعد برنامج للتعامل مع الذكاء الصناعي او الشبكات العصبونية مثل الملف المرفق الذي وضعته وهو برنامج ابتدائي للذكاء الصناعي يقوم بترتيب مصفوفة عشوائية من خلال الضغط على مفتاح c عند الدخول الى اللعبة وهذا البرنامج مشغول سي بلس بلس

ibrahem_project.zip

تم تعديل هذه المشاركة بواسطة MR C++ في 14 يونيو 2006 في 15:15

ماذا أقول وفي فؤادي جمرة تزفو وفي العينين يزفو العمى شعب تولاه الخمول وأمة تمشي إلى الوراء بلا نظر هاقد شبعنا من كلام فارغ ومن القشور وغيرنا أكل الثمر فالعامل المسكين يقضي نحبه من جوعه وسواه من الأكل انفزر يا أمة ترجو الحياة شريفة كيف الوصول وبيننا الغش انتشر فكيف الحياة لنا تستجيب فهذا زمان قليل الحياء وهذا زمان جنون البشر

#12

اخي العزيز MR C++ من قال انه مؤشرات الدوال تعقد البرنامج , بل على العكس, هي مفيدها جدا بغير مسألت الذاكره, باستخدام مؤشرات الدوال نستطيع توفير الكثير من الوقت و العمل للكمبايلر. لنفرض ان لدينا 1000 كلاس , اذا قمنا بتغير احدا الدوال وجب علينا ان نعمل كمبايل لكل الكلا سات التي استخدمت فيها هذه الداله.

اما اذا قمنا باستخدام مؤشرات الدوال, فقط نحتاج لعمل كمبايل فقط للكلاس الذي يحتوي على موشر الداله.

اخي MR C++ انا الذي قلت عنه انه معقد هما اخر جملتان اللتان تعنيان نفس المعنا ولكن لكل منها شكل و تركيب مختلف

شكرا اخي على المداخله , و ارجو الفائده للجميع

امتعتني لعبتك اخي MR C++,

ارجو منك ارفاق السورس كود. اكون عن جد ممتن لك كتتتتتتتتتتتتتتتتتيييييييييييررررررررررر

رائعه

موفق اخي

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#13

جزاك الله خيرررررررر

#14

و اياك اخي Ahmed_Kh

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#15

السلام عليكم

هل من الممكن اعطاء تفصيل اكثر عما يفعله هذا الامر

اعتقد انها يجب ان تكون Plus بدلا من Divide لان الداله عندك هي Plus

my_function = Divide;

ثانيا ما الفرق بين هاتين العبارتين؟

cout << my_function(10, 20) << endl;
cout << (* my_function)(10, 20) << endl;

جزاك الله خيرا

تم تعديل هذه المشاركة بواسطة Yousof في 15 يونيو 2006 في 13:02

#16

اخي يوسف هناك اربع دوال, انا اخترت منها واحده و هي divide

اربع دوال هما pluse, minus,multiply, divide ارجع لاول الدرس في الاعلى ستجد هذه الاربع دوال

اما هاتان الجملتان فلهما نفس المعنى و نفس الوظيفه, وهذا ماذكرت عنه انه بعض الناس يحبوا ان يثبتوا انهم فاهمين , فيستخدموا الجمله الثانيه

cout << my_function(10, 20) << endl;
cout << (* my_function)(10, 20) << endl;

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

هذا الموضوع مغلق.

مواضيع مشابهة