עבור לתוכן

הפרמטרים לא נשמרים אחרי יציא מהפונקציה

Featured Replies

פורסם

למה כשיוצאים מהפונ' הנתונים לא נשמרים?

struct WindowPoints	
{
int xCoor;
int yCoor;
};

void userWinCoorInput(WindowPoints winPointA, WuindowPoints winPointB);


int main()
{
WindowPoints winPointA, winPointB;

userWinCoorInput(winPointA, winPointB);

return 0;
}

//User window coordinates input
void userWinCoorInput(Points winPointA, Points winPointB)
{
cout << endl << "A Window point X coor: ";
cin >> winPointA.xCoor;
cout << "A Window point Y coor: ";
cin >> winPointA.yCoor;
cout << "B Window point X coor: ";
cin >> winPointB.xCoor;
cout << "B Window point Y coor: ";
cin >> winPointB.yCoor;
}

פורסם

הסיבה לזה היא שבקריאה לפונקציה לא המשתנים עוברים לפונקציה, אלא רק הערכים שלהם.

כדי לעשות מה שאתה רוצה אתה צריך להעביר את הפרמטרים by reference או by pointer.

פורסם

כדי להפוך את הפונ שתקבל פרמטרים BY REF:

void userWinCoorInput(WindowPoints &winPointA, WuindowPoints &winPointB);

הוספתי & כדי שהפרמטרים הנ"ל יהיו BY REF. כעת אתה יכול לשנות את הערכים של המשתנים בתוך הפונ, והם ישמרו בתוך הזיכרון של המשתנים המקוריים שלך(שבתוך הMAIN).

פורסם

ועוד הערה קטנה:

אל תעבירו struct-ים ו-class-ים by value (כלומר בלי &).

הסיבה היא שהעברה כזו גוררת העתקה מיותרת של הקלאס.

אם מעבירים עם &, אז הפונקציה פשוט מקבלת מצביע לאותו קלאס.

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

פורסם
  • מחבר

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

תודה

פורסם
  • מחבר

נמחק

פורסם

אוקי, נניח הגדרתי בן אדם (סתם הגדרה טפשית לדוגמה):

struct person {
int age;
int height;
}

ואני רוצה להגדיר פונקציה שמדפיסה אותו, לדוגמה:

void print_person(const person& p) {
cout << "age: " << p.age << ", height: " << p.height << endl;
}

שים לב שהגדרתי את הפונקציה

void print_person(const person& p)

ולא

void print_person(person p)

למה?

כי במקרה הראשון, המחשב פשוט מעביר מצביע לאותו אובייקט p לתוך הפונקציה.

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

ואם האובייקט הוא יותר מורכב (נניח זה struct שמכיל יותר מ-2 משתנים, או שזה קלאס עם פונקציית אתחול מורכבת) אז זה עולה למחשב הרבה יותר.

ולמה השתמשתי ב-const?

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

ארכיון

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

דיונים חדשים