Menu
Coddy logo textTech

חזרה על מצביעי 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* כדי לבנות מכלים שיכולים לאחסן נתונים מכל סוג, וכך לאפשר מבני נתונים רב-פעמיים באמת.

challenge icon

אתגר

קל

כתבו פונקציה בשם print_value שמקבלת שני פרמטרים: מצביע void* לנתונים ודגל סוג מסוג int. הפונקציה צריכה לפרש ולהדפיס את הנתונים בהתאם לדגל הסוג:

  • אם דגל הסוג הוא 0, המירו את המצביע ל-int* והדפיסו את הערך השלם
  • אם דגל הסוג הוא 1, המירו את המצביע ל-float* והדפיסו את ערך נקודה הצפה עם 2 ספרות אחרי הנקודה העשרונית

התוכנית שלכם תקבל שתי קלטים:

  1. דגל סוג (0 עבור מספר שלם, 1 עבור מספר נקודה צפה)
  2. ערך מספרי

בהתאם לדגל הסוג, אחסנו את הערך במשתנה מהסוג המתאים, ואז קראו ל-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;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C אונליין