Pointers To Functions مؤشرات الدوال

الناقل : elmasry | الكاتب الأصلى : Robatic | المصدر : www.arabteam2000-forum.com

السلام عليكم ورحمة الله وبركاته

أخوتي في الله أسعد الله صباحكم أو مسائكم

سنتحدث اليوم عن المؤشرات وكيفية تسخيرها لجعلها تؤشر إلى داله



تمهيد

إذا أردنا أن نرى عنوان متغير ما في الذاكره نستخدم الـ & كما هو موضح في الكود التالي:

int x;
cout << &x << endl;


ماذا عن عنوان دالة ؟؟؟ طبعا علامة الـ & لا تنطبق على الدوال ولكن العملية ليست صعبه كل ما عليك فعله هو كتابة إسم الدالة فقط دون الأقواس، ولنفرض أن لدينا دالة بإسم myfunction، فإذا أردنا أن نعرف عنوانها نكتب كما يلي :

cout << myfunction << endl;


دعونا نسأل أنفسنا هذا السؤال : ما الفائده الناجمه عن معرفة عنوان دالة ما ؟؟
في الحقيقة معرفة عنوان أي داله لا يفيدك كمبرمج أو كمستخدم، إذا من المستفيد من ذلك ؟؟؟ المستفيد الأوحد هو الـ compiler أو البرنامج.



كيف لي أن أعرّف مؤشر إلى داله ؟

عن طريق القاعدة التاليه :

return_type (*pointer_name) (parameters_list) = function_name;


فإذا أردنا إستخدام ذلك المؤشر ( أي إستدعاء الدالة التي يؤشر عليها) نكتب كما يلي :

pointer_name(argument_list);

// or

(*poiter_name)(argument_list);


وكلتا الطريقتين صحيحه، والآن دعنا نأخذ مثال عملي فالتجربة خير برهان:

#include <iostream>

using namespace std;

int function1(int x) {
        return x * 10;
}

void function2() {
        cout << "Whatever!\n";
}

int main(void) {

        int (*fp1)(int) = function1;

        void (*fp2)() = function2; // or void (*fp2)(void) = function2;

        cout << fp1(10) << endl; // or cout << (*fp1)(10) << endl;

        (*fp2)(); // or (*fp2)(void); or fp2(); or fp2(void);

        return 0;
}


ماذا عن مصفوفة من المؤشرات للدوال ؟

قد يدل السؤال إلى شيء صعب ولكن في الحقيقه كل مافي الأمر هو تضمين علامة [ ] في التعريف كما هو موضح في القعدة التالية :

return_type (*pointer_name[])(parameter_list) = { function1, function2, function3, ..... , functionN };


ولكي ندخل إلى محتوى المصفوفه نستخدم القاعدة التاليه :

pointer_name[index](argument_list); // or (*pointer_name[index])(argument_list);


دعونا نطبق علميا :

#include <iostream>

using namespace std;

int getSquare(int x) { return x * x; }

int getCube(int x) { return x * x * x; }

int getQuad(int x) { return x * x * x * x; }

int main(void) {

        int (*fp[])(int) = { getSquare, getCube, getQuad };

        for(int i = 0; i < 3; i++)
                cout << fp[i](10) << endl; // or cout << (*fp[i])(10) << endl;

        return 0;
}


بتعلم هذا التكتيك في البرمجه قد يفتح لك أو لكي بابا كبير حيث يمكنك أن تقوم بتعريف دوال قد يكون أحد القيم المرسله إليها مؤشراً إلى داله أو مصفوفة مؤشرات، ويمكنك أيضا بناء stack or queue بحيث كل عنصر فيها يؤشر إلى دالة ويتم تنفيذها وفق شروط معينه، فكر في حجم الإحتمالات الممكنه.

أسأل الله أن يكتب لي ولكم الأجر والثواب والفائده وأعوذ به من علم لا ينفع

أخوكم Robatic