10.5 מצביעי פונקציות תרגול
תרגול - מצביעי פונקציות ו-callbacks - function pointers¶
תרגול 1 - מחשבון עם dispatch table¶
- כתבו פונקציות לארבע פעולות חשבון:
add,sub,mul,div. כל אחת מקבלת שני double ומחזירה double. - צרו typedef בשם
math_op_tלמצביע פונקציה מתאים. - צרו מערך
math_op_t ops[4]שמכיל את ארבע הפונקציות. - צרו מערך
char *op_names[4]עם שמות הפעולות. - כתבו תוכנית שמקבלת מהמשתמש שני מספרים ומספר פעולה (0-3), ומבצעת את הפעולה המתאימה באמצעות הdispatch table.
- טפלו במקרה של חילוק באפס.
תרגול 2 - apply ו-filter גנריים¶
- כתבו פונקציה
void array_apply(int *arr, int n, int (*func)(int))שמפעילה func על כל איבר במערך. - כתבו פונקציה
int array_filter(int *arr, int n, int *out, int (*predicate)(int))שמעתיקה ל-out רק את האיברים שעבורם predicate מחזירה true. הפונקציה מחזירה את מספר האיברים שהועתקו. - כתבו פונקציה
int array_reduce(int *arr, int n, int initial, int (*combine)(int, int))שמחזירה ערך יחיד - תוצאת הפעלת combine על כל האיברים ברצף (כמו fold/reduce בשפות פונקציונליות). - השתמשו בפונקציות כדי:
- להכפיל כל איבר ב-3
- לסנן רק מספרים זוגיים
- לחשב סכום כל האיברים
- לחשב מכפלת כל האיברים
תרגול 3 - מערכת אירועים - event system¶
- הגדירו typedef בשם
event_handler_tלמצביע לפונקציה שמקבלתconst char *event_nameו-void *data. - הגדירו struct בשם
event_systemשמכיל מערך של עד 10 handlers ומונה. - כתבו פונקציה
void register_handler(event_system *sys, event_handler_t handler)שמוסיפה handler למערכת. - כתבו פונקציה
void fire_event(event_system *sys, const char *name, void *data)שקוראת לכל הhandlers הרשומים עם שם האירוע והdata. - כתבו שלושה handlers שונים שמדפיסים הודעות שונות.
- רשמו אותם ושגרו אירוע - ודאו שכל שלושתם נקראים.
תרגול 4 - פולימורפיזם - צורות גיאומטריות¶
- הגדירו struct בשם
shapeשמכיל: const char *type- שם הצורהdouble (*area)(struct shape *self)- מצביע לפונקציית שטחdouble (*perimeter)(struct shape *self)- מצביע לפונקציית היקףvoid (*print)(struct shape *self)- מצביע לפונקציית הדפסהdouble params[4]- פרמטרים (רוחב, גובה, וכו')- ממשו "מחלקות" לשלוש צורות:
- עיגול (circle) - params[0] = רדיוס
- מלבן (rectangle) - params[0] = רוחב, params[1] = גובה
- משולש (triangle) - params[0] = בסיס, params[1] = גובה, params[2] = צלע שניה, params[3] = צלע שלישית
- כתבו פונקציות "בנאי" - constructor:
shape new_circle(double r),shape new_rectangle(double w, double h),shape new_triangle(...). - צרו מערך של 5 צורות מסוגים שונים, ובלולאה הדפיסו את הסוג, השטח, וההיקף של כל אחת.
תרגול 5 - טעינת פלאגין - plugin loading¶
- כתבו ספרייה משותפת (shared library) שמכילה שתי פונקציות:
int plugin_add(int a, int b)- מחזירה a + bconst char *plugin_name(void)- מחזירה את שם הפלאגין- קמפלו אותה כקובץ .so:
- כתבו תוכנית ראשית שטוענת את הso בזמן ריצה עם
dlopen. - השתמשו ב-
dlsymכדי למצוא את שתי הפונקציות. - קראו להן והדפיסו את התוצאות.
- אל תשכחו לבדוק שגיאות עם
dlerrorולקרוא ל-dlcloseבסוף.