עבור לתוכן

overload in ansi C

Featured Replies

פורסם

רציתי לדעת אם יש אפשרות לעשות overload לפונק' ב-C ?

נניח יש לי פונק' הכי פשוטה שיש אפילו ברמת סכימה של מספרים, ואני רוצה שכל פעם היא תסכום סכום אחר של מספרים, אז נכון שאני יכול לקלוט מערך או להשתמש בממשק של EOF פנימי או משהו כזה, אבל אני מדבר ברמה של ממש:

sum(2,3,4)

מול נניח:

sum(2,3,4,5,6)

הצעות ?

אשמח להצעות אחרות אם אי אפשר, שיוכלו לתת פתרון הולם אחר :) תודה !! ;D

פורסם
  • מחבר

ואז אני יכול לייצר ממשק ב-main של פונק' שניתן להשתמש בהם כ- overload function כמו printf ? או שעדיין יהיו בעיות?

פורסם

לא הבנתי מה הכוונה. אם אתה רוצה לכתוב פונקציה שתעבוד כמו printf, אז קרא את הלינק שנתתי לך ותשתמש ב-va_arg.

פורסם
  • מחבר

אני רק רוצה לוודא שתפסתי את הקונספט...


int sum( int num, ... ) {
int answer = 0;
va_list argptr;

va_start( argptr, num );

for( ; num > 0; num-- ) {
answer += va_arg( argptr, int );
}

va_end( argptr );

return( answer );
}

int sum( int num, ... )

הכרזה על פונק' שמחזירה int ומקבלת רק int-ים. האם אני יכול להוסיף עוד טיפוסים שונים מלבד int-ים ?

   int answer = 0;

די ברור.. אתחול משתנה לוקלי...

   va_list argptr;

הצהרה על argptr (שם שמור) כמצביע על רשימת ארגומנטים ?

   va_start( argptr, num );

תחילת השימוש ב-va_arg שלי כאשר הוא מקבל את ה- argptr שמצביע על הרשימה ואת הnum-ים ?

va_arg( argptr, int );

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

   va_end( argptr );

השורה הזאת, הבנתי שמתיחסת למצב שבו סיימתי את הקריאה לארגומנטים שלי, אבל מה ממש היא עושה?

ממש תודה על העזרה וההתיחסות !! :)

פורסם
  • מחבר

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

אני יודע שאם אני רוצה לעשות 'overload' נניח פעם אחת על סכימה של int-ים ופעם אחת על נניח הצגת מחרוזת מאותיות מבוזרות שנקלטות (על אותו function name מן הסתם) אז אני אפעיל פעמיים את אותו הפורמט עם גוף פונק' שונה, אבל שוב איך אני משלב כמה פרמטרים ביחד ? אני נניח יכול לכתוב במקום:

int sum( int num, ... ) 

את:

int sum(int num , char c ,...)

?? :-\ ???

פורסם

קודם כל, אין קשר בין הטיפוס של הארגומנטים הרגילים (בדוגמה שלך num ו-c) והארגומנטים הנוספים (מה שנכלל תחת ה-"...").

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

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

פורסם
  • מחבר

הדוגמא השניה אכן הבהירה את זה יותר טוב :)

תודה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים