تابع callback (Callback Functions)
«تابع کال بک (Callback Function)» یعنی تابعی که به عنوان ورودی داده می شود. سپس، تابع گیرنده هر زمان لازم بود، دوباره همان را صدا می زند. این کار، کد را انعطاف پذیر و قابل استفاده مجدد می کند.
نمونه ساده کال بک
تابعِ ورودی چاپ می کند و تابعِ اصلی آن را صدا می زند.
void sayHello() {
printf("Hello from the callback!\n");
}
void runCallback(void (*callback)()) {
printf("Before calling the callback...\n");
callback();
printf("After calling the callback.\n");
}
int main() {
runCallback(sayHello);
return 0;
}
کال بک با پارامتر
نوع پوینتر باید با امضای تابع ورودی دقیقاً یکی باشد.
void addNumbers(int a, int b) {
printf("The sum is: %d\n", a + b);
}
void calculate(void (*callback)(int, int), int x, int y) {
callback(x, y);
}
int main() {
calculate(addNumbers, 5, 3);
return 0;
}
چند کال بک متفاوت
با تعویض تابع ورودی، خروجی تغییر می کند؛ منطق ثابت می ماند.
void greetMorning() {
printf("Good morning!\n");
}
void greetEvening() {
printf("Good evening!\n");
}
void greet(void (*callback)()) {
callback();
}
int main() {
greet(greetMorning);
greet(greetEvening);
return 0;
}
نمونه واقعی: qsort و کال بک
تابع qsort از کال بک برای مقایسه عناصر استفاده می کند.
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int main() {
int numbers[] = { 5, 2, 9, 1, 7 };
int size = sizeof(numbers) / sizeof(numbers[0]);
qsort(numbers, size, sizeof(int), compare);
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
return 0;
}
گام های عملی
- امضای کال بک را مشخص کن.
- پارامتر پوینترِ تابع را در تابعِ گیرنده بگذار.
- تابعِ مناسب را پاس بده و اجرا را ببین.
نکته: کال بک معمولاً با پوینترهای تابع پیاده سازی می شود و کد را منعطف می کند. برای ادامه مسیر، سراغ کار با فایل ها برو.
جمع بندی سریع
- کال بک، تابعِ ورودی برای تابع دیگر است.
- انعطاف می دهد؛ منطقِ اصلی تغییر نمی کند.
- امضای کال بک باید دقیقاً مطابق باشد.
- در استاندارد C مثل
qsortاستفاده می شود.