جداول مؤشرات الدوال
أنماط التوجيه
جداول مؤشرات الدوال درس مجاني في C Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
جداول الدوال
يمكنك تخزين مؤشرات الدوال في مصفوفة لإنشاء جدول توجيه. يحدد فهرس أو رمز الدالة التي ستُشغّل، بدلًا من سلاسل طويلة من if-else أو switch.
#include <stdio.h>
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int main(void) {
int (*ops[2])(int,int) = { add, sub };
printf("%d\n", ops[0](5, 3));
printf("%d\n", ops[1](5, 3));
return 0;
}الفهرسة في الجدول
اختر عملية أثناء التشغيل من خلال فهرسة المصفوفة. ويمكن أن يأتي الفهرس من إدخال المستخدم أو من حالة البرنامج.
#include <stdio.h>
int mul(int a, int b) { return a * b; }
int add(int a, int b) { return a + b; }
int main(void) {
int (*ops[2])(int,int) = { add, mul };
int choice = 1;
printf("%d\n", ops[choice](6, 7));
return 0;
}استبدال switch
غالبًا ما يكون جدول التوجيه أوضح من switch عندما تستدعي كل حالة دالةً فحسب.
#include <stdio.h>
void start(void) { printf("start\n"); }
void stop(void) { printf("stop\n"); }
void pause(void) { printf("pause\n"); }
int main(void) {
void (*table[3])(void) = { start, stop, pause };
for (int i = 0; i < 3; i++) table[i]();
return 0;
}يُبسّط typedef الجدول
يؤدي استخدام typedef لنوع مؤشر الدالة إلى جعل تصريح الجدول قصيرًا وسهل القراءة.
#include <stdio.h>
typedef int (*BinOp)(int,int);
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int main(void) {
BinOp ops[] = { add, sub };
printf("%d\n", ops[0](10, 4));
return 0;
}ربط الرموز بالدوال
اربط كل رمز عامل بدالته في مصفوفتين متوازيتين أو في جدول من البنى، لإجراء البحث بالاسم.
#include <stdio.h>
typedef int (*BinOp)(int,int);
int add(int a, int b){return a+b;}
int sub(int a, int b){return a-b;}
int main(void) {
char syms[] = {'+', '-'};
BinOp ops[] = { add, sub };
char want = '-';
for (int i = 0; i < 2; i++)
if (syms[i] == want) printf("%d\n", ops[i](9, 2));
return 0;
}جدول أوامر قائم على بنية
اجمع اسمًا ومعالجًا في بنية، ثم أنشئ مصفوفة منها. هذا هو النمط التقليدي لجدول الأوامر.
#include <stdio.h>
#include <string.h>
typedef struct {
const char *name;
void (*run)(void);
} Command;
void hello(void){printf("hi\n");}
void bye(void){printf("bye\n");}
int main(void) {
Command cmds[] = {{"hello", hello}, {"bye", bye}};
const char *input = "bye";
for (int i = 0; i < 2; i++)
if (strcmp(cmds[i].name, input) == 0) cmds[i].run();
return 0;
}التحقق من الحدود
تحقّق دائمًا من صحة الفهرس قبل الاستدعاء عبر الجدول، لتجنب القراءة بعد نهاية المصفوفة.
#include <stdio.h>
typedef int (*Fn)(int);
int sq(int x){return x*x;}
int neg(int x){return -x;}
int main(void) {
Fn table[] = { sq, neg };
int n = 2;
int idx = 5;
if (idx >= 0 && idx < n) printf("%d\n", table[idx](3));
else printf("index out of range\n");
return 0;
}آلات الحالات
تُشغّل جداول التوجيه آلات الحالات: كل حالة هي مؤشر دالة، وتُرجع المعالجات فهرس الحالة التالية.
#include <stdio.h>
int state_a(void){ printf("A\n"); return 1; }
int state_b(void){ printf("B\n"); return -1; }
int main(void) {
int (*states[2])(void) = { state_a, state_b };
int s = 0;
while (s >= 0) s = states[s]();
return 0;
}توجيه شبيه بالمكونات الإضافية
من خلال تسجيل المعالجات في جدول، يمكن إضافة سلوك جديد بإلحاق إدخال بدلًا من تعديل switch كبير.
#include <stdio.h>
typedef void (*Handler)(int);
void log_low(int v){printf("low %d\n", v);}
void log_high(int v){printf("high %d\n", v);}
int main(void) {
Handler handlers[] = { log_low, log_high };
int level = 1;
handlers[level](7);
return 0;
}المعالج الافتراضي
خصّص خانة واحدة أو مؤشرًا احتياطيًا للرموز غير المعروفة، حتى لا يفشل التوجيه بصمت.
#include <stdio.h>
typedef void (*Fn)(void);
void known(void){printf("known\n");}
void fallback(void){printf("unknown command\n");}
int main(void) {
Fn table[] = { known };
int n = 1, code = 9;
Fn f = (code >= 0 && code < n) ? table[code] : fallback;
f();
return 0;
}لماذا تتوسع الجداول بكفاءة
تحوّل جداول التوجيه منطق التفرّع إلى بحث في البيانات. وتعني إضافة حالات إضافة بيانات، مما يحافظ على بساطة الشيفرة وسرعتها.
#include <stdio.h>
typedef int (*Fn)(int);
int a(int x){return x+1;}
int b(int x){return x*2;}
int c(int x){return x*x;}
int main(void) {
Fn t[] = { a, b, c };
for (int i = 0; i < 3; i++) printf("%d ", t[i](4));
printf("\n");
return 0;
}اختبار سريع
اختبر مدى فهمك لجداول مؤشرات الدوال.
مراجعة
تعلّمتَ أنماط التوجيه باستخدام جداول مؤشرات الدوال:
- خزّن مؤشرات الدوال في مصفوفة، واختر بينها باستخدام الفهرس.
- تحل هذه الجداول محل سلاسل switch الطويلة، وتتوسع بإضافة البيانات.
- استخدم
typedefوجداول الأوامر القائمة على البنى لتحسين الوضوح. - تحقّق دائمًا من حدود الفهرس، ووفّر معالجًا افتراضيًا.
الأسئلة الشائعة
هل درس «جداول مؤشرات الدوال» مجاني؟
نعم — نص درس «جداول مؤشرات الدوال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «جداول مؤشرات الدوال»؟
أنماط التوجيه تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «جداول مؤشرات الدوال»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التصريح بمؤشرات الدوال
- تمرير الدوال
- qsort مع المقارِنات
- جداول مؤشرات الدوال