20-05-2012, 23:54
|
|
|
|
חבר מתאריך: 14.12.09
הודעות: 9,751
|
|
תראה, יש שתי דרכים להסתכל על זה:
אם המטרה שלך היא ללמד לכתוב קוד יפה וטוב, אז יש שני דברים שאפשר לעשות כדי
למנוע הסתבכויות כאלה ב-C.
הראשון הוא להשתמש ב-typedef כדי להקל על הצורך לעקוב אחרי כמות הכוכביות
כשמתעסקים עם מצביעים. ברגע שאתה מגדיר typedef int* array_of_int;
ו-typdef double * dobule_out;, אתה לא צריך לדעת שפרמטר out של מערך
של int צריך להיות typdef int** array_of_int_out; כי אתה פשוט אומר
typedef array_of_int* array_of_int_out;.
כנ"ל לגבי מחרוזות. אם אתה רוצה להוציא מחרוזת אתה צריך להשתמש בפרמטר מסוג
char** (לדוגמה: void get_string(char** buf, size_t size);),
אבל אם אתה לא מבין למה צריך שתי כוכביות, ה-typdef-ים עונים על השאלה:
typdef char* c_string;
typedef c_string* c_string_out;
הדבר השני הוא להשתמש ב-struct-ים ובפונקציות כדי לעטוף דברים מגעילים כמו מערכי
C. מערך ב-C ברוב המקרים 'דועך' למצביע, ואין לו גודל. בגלל זה כל הזמן צריך לדאוג
שיהיה פרמרט נוסף של גודל. זה מעצבן ומוביל לשאלות ותשובות כמו למעלה.
יותר קל להגיד דבר כזה:
typedef struct
{
int * arr;
size_t size;
} array_of_int;
ולסדר פונקציות כאלה (בערך!):
array_of_int create_array_of_int(size_t size)
{
array_of_int new_arr = {0};
new_arr.arr = (int*) malloc(size * sizeof(int));
if (new_arr.arr != NULL)
{
new_arr.size = size;
}
return new_arr;
}
אתה מעביר 2 בייט גם ככה וגם ככה, אבל עם ה-struct אתה לא שוכח בטעות להעביר
את הגודל...
אם המטרה שלך היא לעשות תרגיל שמלמד אנשים כמה כוכביות לשים בכל מקום (ויכולות
להיות הרבה יותר מ-2), אתה צריך לעקוב אחרי כל הסיפור בזהירות רבה.
_____________________________________
(קרדיט למרשי)
אמר לה ינאי מלכא לדביתיה אל תתיראי מן הפרושין ולא ממי שאינן פרושין אלא מן הצבועין שדומין לפרושין שמעשיהן כמעשה זמרי ומבקשין שכר כפנחס
אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
|