שלום,שאלה

andav

New member
שלום,שאלה ../images/Emo13.gif

ציטוט מהספר ++thinking in c :
In C++, an argument may be unnamed in the argument list of the function definition. Since it is unnamed, you cannot use it in the function body, of course. Unnamed arguments are allowed to give the programmer a way to “reserve space in the argument list.” Whoever uses the function must still call the function with the proper arguments. However, the person creating the function can then use the argument in the future without forcing modification of code that calls the function.​
לא הבנתי מה יוצא לי מכך שאפשרי לכתוב פונקציות ולא לתת לערכים הנשלחים לפונקציה, שם ? הרי גם ככה אי אפשר להשתמש במשתני הנשלחים אל הפונקציה מפני שאין להם שם. אז מה אני כן יכול להרוויח מזה? תודה רבה.
 

annefan

New member
בעיה בקריאה?

Unnamed arguments are allowed to give the programmer a way to “reserve space in the argument list.”​
אתה כותב פונקציה בספריה שישתמשו בה הרבה מתכנתים אחרים. אתה רוצה להגדיר interface, גם אם כרגע אתה לא מתמש בכל הפרמטרים. אם לא תשים אותו אתה כופה קומפילציה על הלקוחות. בעתיד כשתשתמש בו, הקוד שמשתמש בך לא ישתנה.
 

Zack DA

New member
בג'וואה אגב, אפשר להחליף בכיף

את השם של המשתנה גם אם הוא מופיע ב- API של המתודה.
 

Zack DA

New member
המממ.....

החתימה חייבת להיות זהה לחלוטין לפי ANSI, לא ?
 

Zack DA

New member
כשאמרתי חתימה התכוונתי לכל

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

vinney

Well-known member
מה שאתה אומר זה ANSI

אנסי לא דורש בכלל לתת שמות, מספיק שאתה רושם את הטיפוסים בAPI, את השמות אתה צריך לתת רק במימוש. למשל:
int foo(int);​
זאת הגדרה תקינה לחלוטין.
 

DadleFish

New member
חתימה =! שורת ההגדרה.

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

Zack DA

New member
../images/Emo31.gif למה שם המשתנה חשוב ?

אני רוצה לכתוב חבילה שישתמשו בה הרבה אנשים. לכל ארגון יש קונבנציות שונות למשתנים. אין שום סיבה להכריח את המשתמש לקבל על עצמו שם של משתנה.
 

DadleFish

New member
תבדיל בין שני דברים

אם מה שהצעתי היה נכון, היית יכול לעשות:
void f(int myVariable); ... void f(int myVariable) { .... } ... void g() { int n = 3; f(n); }​
בצורה כזו אין בעיה שהמשתמש (g במקרה הזה) יקרא למשתנה בכל שם שיחפוץ בו. מצד שני, ההגדרה של הפונקציה והמימוש שלה הן אותו שם. אפשר לחשוב שכשאתה עובד עם ספריה חיצונית אתה יושב ומשנה את קבצי ה-h שלה כדי שיתאימו לקונבנציות שלך... הרי זה בלתי אפשרי - אולי שמות משתנים תוכל לשנות אם זה ממש מציק לך, אבל שמות פונקציות/class-ים למשל לא תוכל לשנות, אז מה הרעיון? מה שחשוב לי זה שההגדרה של הפונקציה והמימוש שלה (לא הקריאות אליה!!!) ישתמשו באותו שם משתנה בדיוק. אחרת משנים את שם המשתנה במימוש ולא בהגדרה ואז יש צרות. האמת שעכשיו כשאני חושב על זה, ב-JAVA זה בכלל לא רלוונטי כי אי אפשר להפריד מימוש מהגדרה.
 

andav

New member
מצטער ,אני לא מבין

בו ניתן דוגמה קטנה:
void cululu(int,int) { // do something } int main() { int a,b; cululu(a,b) return 0; }​
עכשיו,כשאני קורא חפונקציה cululu ,איני יכול להשתמש בתוך הפנוקציה,ב- a וגם ב- b. שוב אני שואל
,במה זה עוזר לי? תודה רבה.
 

andav

New member
רגע רגע ../images/Emo13.gif

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

vinney

Well-known member
לעשות override למשל

אתה רוצה לעשות override, אבל אתה לא באמת צריך את המשתנים - ככה אתה מוודא שאתה אכן לא משתמש בהם.
 

andav

New member
אני לא יורד לסוף דעתך ../images/Emo13.gif

כשאתה אומר override, אתה מתכוון להורשה ואז מימוש חדש של אותה פונקציה ב- class הנורש? אם כן,אז מה איכפת לי(צורת דיבור,בחברוווות
) שאני צריך לוודא שאני לא משתמש בהם ,כלומר למה אני צריך לוודא? כמו כן,המטרה בסוף היא שב- class הנורש,אז שהפונקציה הממומשת מחדש המשתנים יקבלו שמות,כן? תודה לך.
 

vinney

Well-known member
קודם כל, תתחיל לגלות איכפתיות

"מה איכפת לי" זה מקור להרבה באגים, אתה צריך לבדוק את עצמך, כדי שלא יעשו לך פאדיחות אלה שבודקים אותך. דבר שני override עושים לא רק במחלקות, אתה יכול לעשות override לכל פונקציה. למשל:
#include <stdio.h> int printf(const char*,...) { return 1; } int main(void) { return printf(NULL); }​
מתקמפל נהדר
 

andav

New member
התכוונתי שתסביר לי למה

זה כן צריך להיות איכפת לי,זו הכוונה. בו נישאל ככה,מה יכול להיות אם אני לא מוודא שלא משתמשים במשתנים הללו? תודה לך.
 

vinney

Well-known member
לא יודע

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