שאלה בC

yair24

Member
שאלה בC

מישהו יכול להסביר לי מה זה אומר?
void Field_construct(Field* p, char* label, int hiLimit, int lowLimit, void (*updateFn)(int));​
יאיר
 

yair24

Member
קצת יותר ברור...

struct Field { char m_label[10]; int m_value; int m_highLimit; int m_lowLimit; // virtual update funtion void (*m_updateFn)(int); } // ´member´ functions declarations. Note each takes a pointer to the // struct as the first param (just like the hidden ´this´ pointer in C++) void Field_construct(Field* p, char* label, int hiLimit, int lowLimit, void (*updateFn)(int)); void Field_update(Field* p); void Field_incWithRangeCheck(Field* p);​
יאיר
 

yair24

Member
לדעתי זה אמור...

להיות משהו שקשור לפונקציות וירטואליות בC ולא בC++ או מן מימוש של פולימורפיזם בC... מישהו נתקל בצורת תכנות כזאת כבר ויכול להסביר אותה? יאיר
 

albanetc

New member
לדעתי

זה בכל זאת C++ ולא C כיוון שיש MEMBER FUNCTION של STRUCT, ועד כמה שזכור לי זה אפשרי רק ב-C++. ואם אני צודק בזה, אז לא ברור למה צריך את ההתחכמויות האלה.
 

galh

New member
לידיעתך...

זה לא Member function או Method, אלא מצביע לפונקציה, שזה דבר חוקי ומקובל ב- C.
 
זה כן רעיון של פולימורפיזם

ב-C. תראה, הפונקציה עם כל הפרמטרים משמשת כ-CONSTRUCTOR. הם ניסו להראות שאפשר לעשות את זה עם כל פונקציה אחרת, בתנאי שתגדיר אותה בתוך ה-STRUCT. לדוגמה, אם תגדיר STRUCT חדש מסוג STRING_FIELD:
struct StringField { Field f; }; StringField_Update(...) { ... } StringField_construct(.....) { p->f.Field_construct(,StringField_Update...) }​
אז קיבלת טיפוס FIELD חדש, שכאשר קוראים לפונקציית ה-UPDATE שלו, מופעל משהו אחר לגמרי.
 

galh

New member
הצהרה על פונקציה...

שמקבלת פוינטר ל- Field (בשביל שאפשר יהיה לשנות אותו), מחרוזת, שני ערכים מסוג int ופוינטר לפונקציה שמקבלת int ולא מחזירה ערך (void).
 

yair24

Member
זה מה שנקרא "פולימורפיזם בC"?

או פונקציות וירטואליות בC...?
 

galh

New member
לא...

זה מה שנקרא קריאה לפונקציה שמעדכנת struct. פולימורפיזם זה מושג בתכנות מונחה עצמים, שאומר שניתן להתייחס לאובייקט באמצעות אחת מהמחלקות שאותו אובייקט יורש.
 

ihovav

New member
אני רק יכול לתת דוגמא :

אחד הפרוייקטים שלנו בסלע היה לבנות צייר גרפי - והרעיון היה שלמרות שיוצרים צורות שונות - לכולם יש פוינטרים לפונקציות עם פרוטוטייפ זהה שמאותחלות ביצירה לפונקציות הנכונות, ככה שאם רוצים לעשות DRAW או SAVE - פשוט הולכים לשדה בSTRUCT שהוא הפוינטר לפונקציה SAVE או DRAW - והפונקציה הנכונה מופעלת, ואז לא צריך לשמור כל סוג של צורה במבנה נפרד אלא במבנה אחד, כשכל הפעולות מותאמות לסוג הצורה, שזה קצת דומה לתכנות מונחה עצמים
 
למעלה