אתחול במחסנית
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 14 מתוך 61.
לא כל אובייקט צריך לחיות בערימה. כשמבנה הנתונים קטן ואורך החיים שלו קצר, הקצאתו במחסנית פשוטה ומהירה יותר: בלי malloc, בלי free, ובלי סיכון לדליפות זיכרון.
במקום להחזיר מצביע, פונקציית יצרן יכולה להחזיר את המבנה לפי ערך. המבנה כולו מועתק אל הקורא:
typedef struct {
int x;
int y;
} Point;
Point create_point(int x, int y) {
Point p;
p.x = x;
p.y = y;
return p;
}
הקורא מקבל עותק מאותחל במלואו:
Point origin = create_point(0, 0);
Point cursor = create_point(100, 50);
printf("Cursor: (%d, %d)\n", cursor.x, cursor.y);
אין מצביעים, ואין צורך בניקוי. כאשר origin ו־cursor יוצאים מתחום ההיקף, הם מושמדים אוטומטית.
הגישה הזאת מתאימה ביותר למבנים קטנים ללא איברים שהוקצו באופן דינמי. עבור אובייקטים גדולים יותר או כאלה שמכילים מצביעים לזיכרון בערימה, דפוס הבנאי עם malloc נותר הבחירה הטובה יותר.
אתגר
קלנבנה מודול Temperature שיוצר קריאות טמפרטורה במחסנית באמצעות פונקציית מפעל. בניגוד לבנאים המבוססים על הערימה משיעורים קודמים, הגישה הזו מחזירה את המבנה לפי ערך: בלי malloc, בלי free, רק הקצאה פשוטה ויעילה במחסנית.
תיצור שלושה קבצים:
temperature.h: הצהר על מבנהTemperatureעם שני איברים:double celsiusו-char scale(לאחסון 'C' עבור Celsius). כמו כן, הצהר על שתי פונקציות:create_temperature: מקבלת ערך מסוג double ומחזירה מבנהTemperatureלפי ערך (לא מצביע!)temperature_to_fahrenheit: מקבלתconst Temperature *ומחזירה את הטמפרטורה המקבילה בפרנהייט בתור double
TEMPERATURE_H.temperature.c: ממש את שתי הפונקציות. פונקציית המפעל שלך צריכה ליצור משתנהTemperatureמקומי, לאתחל את השדות שלו (להגדיר אתscaleל-'C'), ולהחזיר אותו. נוסחת ההמרה היא:fahrenheit = celsius * 9.0 / 5.0 + 32.0main.c: השתמש בפונקציית המפעל שלך כדי ליצור קריאת טמפרטורה ולהציג את הערכים גם בצלזיוס וגם בפרנהייט.
תקבל קלט אחד: הטמפרטורה בצלזיוס (בתור double).
בקובץ הראשי שלך, השתמש ב-create_temperature כדי ליצור מבנה Temperature עם הערך הנתון. לאחר מכן, הדפס את ערך הצלזיוס המקורי ואת הערך המקביל בפרנהייט.
הדפס את הפלט בפורמט הזה:
Celsius: {celsius}
Fahrenheit: {fahrenheit}השתמש ב-%.2f עבור שני הערכים כדי להציג שתי ספרות אחרי הנקודה העשרונית.
לדוגמה, עם קלט 25.0, הפלט יהיה:
Celsius: 25.00
Fahrenheit: 77.00שים לב עד כמה הגישה הזו נקייה. מתקבל מבנה מאותחל במלואו בלי דאגות לניהול זיכרון. כשהמשתנה Temperature שלך יוצא מתחום הטווח, הוא מתנקה אוטומטית.
נסו בעצמכם
#include <stdio.h>
#include "temperature.h"
int main() {
double celsius_input;
scanf("%lf", &celsius_input);
// TODO: השתמשו ב-create_temperature כדי ליצור מבנה מסוג Temperature
// TODO: הדפיסו את הערך בצלזיוס בפורמט %.2f
// TODO: השתמשו ב-temperature_to_fahrenheit כדי להמיר ולהדפיס את הערך בפרנהייט
return 0;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין