חזרה על מצביעי void
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 49 מתוך 61.
void* היא הדרך של C לומר "מצביע למשהו, אבל אני לא אומר לך למה." היא יכולה להכיל כתובת של כל סוג נתונים: int, float, מבנה (struct) או כל דבר אחר. כך היא משמשת בסיס לכתיבת קוד גנרי ב-C.
העניין הוא שאי אפשר לבצע dereference ישירות ל-void*. המהדר לא יודע כמה בתים לקרוא או איך לפרש אותם. כדי להשתמש בנתונים, צריך להמיר אותו בחזרה לסוג הנכון:
void print_int(void* data) {
int* p = (int*)data;
printf("%d\n", *p);
}
int main() {
int x = 42;
print_int(&x);
return 0;
}הגמישות הזו כרוכה באחריות. אם תמירו לסוג הלא נכון, המהדר לא יעצור אתכם, אבל התוכנית שלכם תפיק נתונים חסרי משמעות או תקרוס. לכן פונקציות גנריות משלבות לעיתים קרובות void* עם ציון סוג (כמו enum או דגל), כדי שהפונקציה תדע איך לפרש את הנתונים בצורה נכונה.
בשיעורים הבאים תשתמשו ב-void* כדי לבנות מכלים שיכולים לאחסן נתונים מכל סוג, וכך לאפשר מבני נתונים רב-פעמיים באמת.
אתגר
קלכתבו פונקציה בשם print_value שמקבלת שני פרמטרים: מצביע void* לנתונים ודגל סוג מסוג int. הפונקציה צריכה לפרש ולהדפיס את הנתונים בהתאם לדגל הסוג:
- אם דגל הסוג הוא
0, המירו את המצביע ל-int*והדפיסו את הערך השלם - אם דגל הסוג הוא
1, המירו את המצביע ל-float*והדפיסו את ערך נקודה הצפה עם 2 ספרות אחרי הנקודה העשרונית
התוכנית שלכם תקבל שתי קלטים:
- דגל סוג (
0עבור מספר שלם,1עבור מספר נקודה צפה) - ערך מספרי
בהתאם לדגל הסוג, אחסנו את הערך במשתנה מהסוג המתאים, ואז קראו ל-print_value עם מצביע למשתנה הזה ודגל הסוג.
פלט לדוגמה כאשר הקלטים הם 0 ו-42:
42פלט לדוגמה כאשר הקלטים הם 1 ו-3.14:
3.14פלט לדוגמה כאשר הקלטים הם 0 ו--17:
-17פלט לדוגמה כאשר הקלטים הם 1 ו-99.5:
99.50נסו בעצמכם
#include <stdio.h>
// TODO: כתבו כאן את הפונקציה print_value שלכם
int main() {
int type_flag;
scanf("%d", &type_flag);
if (type_flag == 0) {
int int_value;
scanf("%d", &int_value);
// TODO: קראו ל-print_value עם מצביע ל-int_value ודגל הסוג
} else if (type_flag == 1) {
float float_value;
scanf("%f", &float_value);
// TODO: קראו ל-print_value עם מצביע ל-float_value ודגל הסוג
}
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין