Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

استدعاء مؤشرات الدوال

جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 34 من 61.

Now بعد أن عرفت كيفية Declare مؤشر function وAssign function إليه، فإن الخطوة التالية هي فعليًا استدعاء function من خلال ذلك pointer.

البنية النحوية واضحة ومباشرة. تستخدم function pointer تمامًا كما لو كنت تستدعي دالة عادية:

int add(int a, int b) {
    return a + b;
}

int main() {
    int (*operation)(int, int) = add;
    
    int result = operation(5, 3);  // يستدعي add(5, 3)
    printf("%d\n", result);        // الإخراج: 8
    return 0;
}

ما عليك سوى كتابة اسم pointer متبوعًا بأقواس تحتوي على الوسائط. تقوم لغة C تلقائيًا بإلغاء إشارة pointer وتنفيذ function التي يشير إليها.

يمكنك أيضًا استخدام صيغة إلغاء الإشارة الصريحة مع (*operation)(5, 3)، لكنها اختيارية وأقل شيوعًا. كلا الشكلين ينتجان نتائج متطابقة.

تظهر القوة الحقيقية عندما تعيد إسناد pointer إلى functions مختلفة:

int subtract(int a, int b) {
    return a - b;
}

operation = subtract;
result = operation(5, 3);  // الآن يستدعي subtract(5, 3)
printf("%d\n", result);    // المخرجات: 2

ينفذ المتغير نفسه operation الآن منطقًا مختلفًا تمامًا. وتُعد هذه القدرة على تبديل السلوك في وقت التشغيل أساس تعدد الأشكال في C.

challenge icon

التحدي

سهل

لنتدرّب على استدعاء functions من خلال المؤشرات وتبديل function التي يتم تنفيذها. ستبني آلة حاسبة بسيطة يمكنها التبديل بين الجمع والطرح أثناء التشغيل.

اكتب برنامجًا يقوم بما يلي:

  1. يعرّف function اثنتين:
    • add: تأخذ معاملين من النوع int وتعيد مجموعهما
    • subtract: تأخذ معاملين من النوع int وتعيد ناتج طرح second من first
  2. في main، يعرّف pointer إلى function يُسمى calc ويمكنه الإشارة إلى functions تأخذ معاملين من النوع int وتعيد قيمة من النوع int
  3. يقرأ أربعة inputs: عددين صحيحين واثنين من operation codes
  4. لكل operation code:
    • Assign الـ function appropriate إلى calc (‏1 لـ add، و2 لـ subtract)
    • Call الـ function من خلال pointer باستخدام العددين
    • اطبع result

ستتلقى أربعة inputs: first number، وsecond number، وfirst operation code (1 أو 2)، وsecond operation code (1 أو 2).

يجب أن يُظهر output نتيجتين في سطرين منفصلين: واحدة لكل operation تم تنفيذها باستخدام العددين نفسيهما:

15
5

في هذا المثال، مع inputs ‏10 و5 و1 و2: تقوم العملية الأولى (code 1) بجمع 10 + 5 = 15، ثم تتم إعادة Assign إلى pointer، وتطرح العملية الثانية (code 2) ‏10 - 5 = 5.

يوضح هذا كيف يمكن لمتغير pointer نفسه تنفيذ منطق مختلف تمامًا من خلال إعادة Assign إليه بين عمليات الاستدعاء.

جرّب بنفسك

#include <stdio.h>

// TODO: عرّف دالة add هنا


// TODO: عرّف دالة subtract هنا


int main() {
    // اقرأ المدخلات
    int num1, num2, op1, op2;
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &op1);
    scanf("%d", &op2);
    
    // TODO: صرّح عن مؤشر دالة يسمى 'calc' يمكنه الإشارة إلى
    // دوال تأخذ معاملين من نوع int وتعيد int
    
    
    // TODO: بالنسبة لرمز العملية الأولى (op1):
    // - عيّن الدالة المناسبة إلى calc (1 لـ add، 2 لـ subtract)
    // - استدعِ الدالة عبر المؤشر واطبع النتيجة
    
    
    // TODO: بالنسبة لرمز العملية الثانية (op2):
    // - أعد تعيين calc إلى الدالة المناسبة
    // - استدعِ الدالة عبر المؤشر واطبع النتيجة
    
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C عبر الإنترنت