ABA


"מצאו את השגיאה\שגיאות בקטע הקוד הנתון הבא"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15577 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15577
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   20:49   23.11.09   
אל הפורום  
  מצאו את השגיאה\שגיאות בקטע הקוד הנתון הבא  
 
   עוגן האשכול הוסר בתאריך 05.12.09 בשעה  16:09  על-ידי Nesher, (מנהל הפורום)
 
מצאו את השגיאה\שגיאות בקוד הבא
האם הקוד בכלל עובר קומפילציה ? אם כן האם הוא רץ בצורה תקינה ? נמקו


ראיתי שיש פה כמה חברה חדשים שלומדים C++
ובקטע קוד הבא (שאילתרתי) יש הרבה ניואנסים מעניינים שיעזרו לכם ללמוד את השפה יותר טוב


שאלת בונוס למי שיסביר מהי הדרך הנכונה לממש אופרטורים בינארים



                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  בהצלחה למשתתפים! ldan192  24.11.09 14:46 1
  איזה כיף kutumaster  24.11.09 14:58 2
  בהצלחה למשתתפים :) ronen333  24.11.09 15:49 3
  חחחח האמתי לא ציפיתי שזה יהפוך לאתגר כי זה לא משהו קשה Net_Boy  24.11.09 18:42 4
     אולי אתן רמז אחד או שניים קטנים להעיר את האשכול ldan192  25.11.09 20:41 5
         אם לא יענו בקרוב אתה מוזמן לענות :) Net_Boy  26.11.09 21:49 6
  וואלה יש פה מלא דברים שאני עוד לא מכיר kutumaster  27.11.09 14:39 7
     אתה חייב נקודה פסיק אחרי הגדרת מחלקה Net_Boy  27.11.09 15:19 8
         זהו יש פה מלא דברים שאני לא מכיר, kutumaster  27.11.09 21:10 9
  עוד כמה טיפים למי שמתעניין (בלי תשובות, רק כיוונים) Sn00py  27.11.09 21:54 10
     אתה מוזמן לענות כי נראה שאין משתתפים :) Net_Boy  28.11.09 20:31 11
         רציתי להכין תגובה היום אבל נתקלתי בעומס ולא הזדמן לי. מחר מקווה שאתפנה ldan192  29.11.09 00:29 12
  יש פה כמה בעיות zvikav  29.11.09 00:49 13
     תגובה Net_Boy  30.11.09 08:23 14
         תגובה zvikav  30.11.09 17:50 16
             נכון מאד Net_Boy  30.11.09 19:13 17
  טוב, עכשיו יש לי חלון קטן אז אנצל את הזמן ldan192  30.11.09 15:15 15
     הכל נכון חוץ מלגבי שורה 3 - אנשים נופלים בפח הזה בקלות Net_Boy  30.11.09 19:26 18
         אתה בטוח שזה לא מתרסק בזמן ריצה? ldan192  30.11.09 23:46 21
             המממ לא שמרתי אף העתק של הקוד Net_Boy  30.11.09 23:52 24
                 תשמע, זה הגיוני מבחינת הקישור הסטטי. עם זה אין ספק. ldan192  01.12.09 00:06 25
  עכשיו אחרי שענו כמעט על הכל - איך ממשים אופרטור בינארי Net_Boy  30.11.09 19:30 19
     באופן הבא zvikav  30.11.09 23:30 20
         זה לא כל-כך נכון. אף אחד לא אמר שיש לך copy c'tor ldan192  30.11.09 23:47 22
         אוקיי אולי לא הייתי ברור Net_Boy  30.11.09 23:50 23
  סתם כדי לסגור את הדיון Net_Boy  05.12.09 20:47 26

       
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   14:46   24.11.09   
אל הפורום  
  1. בהצלחה למשתתפים!  
בתגובה להודעה מספר 0
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
kutumaster 
חבר מתאריך 19.9.06
19325 הודעות
   14:58   24.11.09   
אל הפורום  
  2. איזה כיף  
בתגובה להודעה מספר 0
 
   תודה
הלכתי לעבוד על זה

בברכה,


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   15:49   24.11.09   
אל הפורום  
  3. בהצלחה למשתתפים :)  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   18:42   24.11.09   
אל הפורום  
  4. חחחח האמתי לא ציפיתי שזה יהפוך לאתגר כי זה לא משהו קשה  
בתגובה להודעה מספר 0
 
   במיוחד
ציפיתי יותר שאנשים יענו ויתפתח דיון
אבל בכיף


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:41   25.11.09   
אל הפורום  
  5. אולי אתן רמז אחד או שניים קטנים להעיר את האשכול  
בתגובה להודעה מספר 4
 
קישור סטטי vs. קישור דינמי, מה ההבדלים?
רפרנס vs. עותק vs. פויינטר, מה ההבדלים?


מקווה שזה יעזור


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   21:49   26.11.09   
אל הפורום  
  6. אם לא יענו בקרוב אתה מוזמן לענות :)  
בתגובה להודעה מספר 5
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
kutumaster 
חבר מתאריך 19.9.06
19325 הודעות
   14:39   27.11.09   
אל הפורום  
  7. וואלה יש פה מלא דברים שאני עוד לא מכיר  
בתגובה להודעה מספר 0
 
   אני רק מתחיל...
אבל ברפרוף ראיתי נקודה פסיק אחרי סוגרים מסולסלים, וב INT MAIN
אין RETURN 0
חח, זה מה שמצאתי

בברכה,


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   15:19   27.11.09   
אל הפורום  
  8. אתה חייב נקודה פסיק אחרי הגדרת מחלקה  
בתגובה להודעה מספר 7
 
   אז זו לא שגיאה

לגבי ה return 0 אתה צודק - למרות שיש הרבה קומפיילרים שזה יתקמפל בהם


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
kutumaster 
חבר מתאריך 19.9.06
19325 הודעות
   21:10   27.11.09   
אל הפורום  
  9. זהו יש פה מלא דברים שאני לא מכיר,  
בתגובה להודעה מספר 8
 
   כמו מחלקה לדוגמא

בברכה,


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   21:54   27.11.09   
אל הפורום  
  10. עוד כמה טיפים למי שמתעניין (בלי תשובות, רק כיוונים)  
בתגובה להודעה מספר 0
 
   1. מה קורה שמגדירים מופע של עצם כלשהו - נניח MyClass בתוך הפונקציה של operator+? מה תחום החיים שלו ומה תחום ההגדרה שלהם? למה זה לא אותו דבר? ומה קורה שמנסים להחזיר refernce לדבר כזה?

2. מה קורה שמגדירים פוינטר לעצם כלשהו? מתי בעצם מתבצע האילקוץ בזכרון?

3. מה ההבדל בין a+b לבין b+a - בעיקר אם יש שני עצמים שהם לא מאותו סוג? איך גורמים לאופרטור כזה לקבל -שני- פרמטרים שונים?

יש עוד כמה דברים קטנים אבל נראה לי שזאת הכוונה של עומר..

אחלה אתגר, בהצלחה

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   20:31   28.11.09   
אל הפורום  
  11. אתה מוזמן לענות כי נראה שאין משתתפים :)  
בתגובה להודעה מספר 10
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   00:29   29.11.09   
אל הפורום  
  12. רציתי להכין תגובה היום אבל נתקלתי בעומס ולא הזדמן לי. מחר מקווה שאתפנה  
בתגובה להודעה מספר 11
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
zvikav 
חבר מתאריך 1.8.02
7610 הודעות
   00:49   29.11.09   
אל הפורום  
  13. יש פה כמה בעיות  
בתגובה להודעה מספר 0
 
   1. בפונקציה main, המשתנה pMyClass לא מאותחל ולכן סביר שהתוכנית תקרוס מייד בשורה 2 של main.
2. הקונסטרקטור הריק לא מאתחל את הערך של m_iValue, ולכן תוצאת החיבור של a, ו - b, לא מוגדרת (בהנחה שהתוכנית תגיע לשם).
3. השמת התוצאה של החיבור של a, ו - b לתוך פויינטר גם יכולה להעיף את התוכנית.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   08:23   30.11.09   
אל הפורום  
  14. תגובה  
בתגובה להודעה מספר 13
 
   1. התוכנית לעולם לעולם לא תקרוס בשורה השנייה - תסבירו למה.
2. החיבור מוגדר אבל פשוט יהיה תוצאה של שני ערכים מזובלים.
3. אני לא מעביר את החיבור לפוינטר (אחרת זו הייתה שגיאת קומפילציה) - אני עושה העתקה ביטית - יש בעייה אחרת שם.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
zvikav 
חבר מתאריך 1.8.02
7610 הודעות
   17:50   30.11.09   
אל הפורום  
  16. תגובה  
בתגובה להודעה מספר 14
 
   1. צודק. התוכנית לא תעוף כיוון שאין שם פנייה למשתנים פנימיים.
2. הבעייה ב - operator+ היא שהוא מחזיר reference למשתנה זמני ולכן שם התוכנית עלולה לעוף.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   19:13   30.11.09   
אל הפורום  
  17. נכון מאד  
בתגובה להודעה מספר 16
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   15:15   30.11.09   
אל הפורום  
  15. טוב, עכשיו יש לי חלון קטן אז אנצל את הזמן  
בתגובה להודעה מספר 0
 
ערכתי לאחרונה בתאריך 30.11.09 בשעה 15:19 בברכה, ldan192
 
קודם כל, אין שום סיבה שהתוכנית לא תתקמפל ב-VS (גם ברמת אזהרה 4, כי היא נורא גמישה), אבל אני חושב שלא תתקמפל ב-++g.

כמו שרמזתי לעיל, בשורה 2, PrintClass הינה מתודה סטטית public ולכן אין שום סיבה שתהיה בעיה בשימוש בה (והדפסתה).
ברגע שהיא נקראת, פשוט הטקסט שרשום בשורה הזו בזמן קמפול הופך לקריאת מערכת call שקופצה למיקום סטטי בזכרון בה נמצאת הפונקציה (כאילו הייתה שיגרה בפני עצמה).
אין צורך בכלל באיסטנס בשביל לקרוא לה. הקוד שקול לאם נרשום ;()MyClass.PrintClass ב-Java.

בשורה 3, לעומת זאת, זוהי מתודה האומנם בעלת קישור סטטי (כי מדובר ב-++C אחרי הכל), אך איננה סטטית (הבינו מה ההבדלים).
ברגע יצירת הפויינטר, נוצר רק שלד הזכרון של ה-Class כולו והוא מצפה בזמן האתחול (עם new + קונסטרוקציה מתאימה) שנשבץ את האינפורמציה המתאימה בתאים (בשונה מ-Java ששם התאים מאותחלים בערכים דיפולטיים - 0, null וכו', פה יש זבל טהור [למרות שבמערכות לינוקס זה לא מדוייק ולרוב נראה שם 0, בגלל שכל דף חדש מאותחל באמצעות Zero_Page, אבל זה כבר נושא אחר וסבוך בפני עצמו]).
לכן, בזמן ריצה - נתרסק פה. פתרון - לאתחל כרגיל עם new.

שורה 4, תקינה לחלוטין. האתחול נעשה מיד לאחר הקומפילציה. נשתמש בקונסטרקור הדיפולטי (בלי פרמטרים). כמובן שיווצר זבל בערכי ה-int (ראה הערה לעיל).
שורה 5, האומנם, לפי דעתי ב-VS זה יתקמפל בלי בעיה, אך ב-++g הוא יצעק עליך / לא יתקפמל.
מה שקורה זה שאתחלנו משתנה מקומי והחזרנו רפרנס אליו (במקרה הזה, יומר לפויינטר ולא לערך).
בכל מקרה, בהנחה ואנו מדברים על VS, הקוד כן יתקמפל וסביר להניח גם כי ירוץ כמו שצריך (כי הזכרון שהוקצה ל-result לא יטרח להדפדף עבור תוכנית כל-כך קצרה ככה שהוא ירחף עד לסיום התוכנית) אך פשוט התוכן יהיה זבל ולכן יודפס זבל.
אבל זה כמובן תכנות לא נכון ואי-דטרמיניסטי במערכות ההפעלה השונות.


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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   19:26   30.11.09   
אל הפורום  
  18. הכל נכון חוץ מלגבי שורה 3 - אנשים נופלים בפח הזה בקלות  
בתגובה להודעה מספר 15
 
   מאחורי הקלעים לא נוצרת פונקציה לכל קלאס אלא קיימת פונקציה אחת שמקבלת כל פעם את ה CLASS.

ובגלל שאין לנו אף פנייה ל DATA MEMBER לא תהיה קריסה לעולם
הוספתי דוגמאת קוד לכל מי שמתעניין איך הקוד נראה מאחורי הקלעים

ולמי שתהה מה זה this ומאיפה הוא מגיע - פה טמונה התשובה



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:46   30.11.09   
אל הפורום  
  21. אתה בטוח שזה לא מתרסק בזמן ריצה?  
בתגובה להודעה מספר 18
 
ערכתי לאחרונה בתאריך 30.11.09 בשעה 23:49 בברכה, ldan192
 
מה שאתה אומר בגדול נכון - הקטע שאף אחד לא מעדכן את הפויינטר ל-call של foo.
זו מהבנתי, אבל שוב, אם זה לא מתרסק בזמן ריצה זו תופעה מעניינת.
אתה יכול העתיק לפה את הקוד עצמו בכדי לבדוק את זה?


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   23:52   30.11.09   
אל הפורום  
  24. המממ לא שמרתי אף העתק של הקוד  
בתגובה להודעה מספר 21
 
   אני בטוח במיליון אחוז שזה לא מתרסק
ככה בעצם אתה מקבל את THIS זה הפוינטר הזה
וכל עוד אין פנייה ל DATA MEMBERS אין סיבה בעולם שזה יתרסק


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   00:06   01.12.09   
אל הפורום  
  25. תשמע, זה הגיוני מבחינת הקישור הסטטי. עם זה אין ספק.  
בתגובה להודעה מספר 24
 
ערכתי לאחרונה בתאריך 01.12.09 בשעה 00:12 בברכה, ldan192
 
הקומפיילר לא צריך לדעת דברים לגבי הטיפוס הדינמי של המשתנה, רק יודע שהאובייקט הנ"ל הוא מטיפוס סטטי MyClass ומציב שם את ה-call.

אבל קבל דוגמא שיכולה להיות דו משמעית:


class A { virtual void f() {} };
class B:A { void f() {} };

int main() {
B* b;
b->f();
return 0;
}

הוא לא היה יודע אם להתבונן ב-VTBL או לא, כי לטענתך הוא היה מחליף את השורה ישירות ב-call.
לפי דעתי הוא קורא לשיגרה שמבצעת בדיקות מעבר לזה (לראות אם פונקציה דורסת בקישור דינמי (וירטואלית), חישוב delta ל-this וכו') ב-VTBL ורק אז אם אין - קורא ל-call.
ומכיוון שה-VTBL מכיל ג'אנק / NULL, אנחנו נקבל קריסת זמן ריצה.


בכל מקרה, סיקרנת אותי.
אני עכשיו אבדוק ב-++g דוגמא יותר קטנה ואעדכן פה (לא מותקן לי פה VS :\).


עדכון: באמת לא מתרסק, לפחות ב-++g. מי מתנדב להריץ ב-VS?


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   19:30   30.11.09   
אל הפורום  
  19. עכשיו אחרי שענו כמעט על הכל - איך ממשים אופרטור בינארי  
בתגובה להודעה מספר 0
 
   בצורה נכונה ?

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
zvikav 
חבר מתאריך 1.8.02
7610 הודעות
   23:30   30.11.09   
אל הפורום  
  20. באופן הבא  
בתגובה להודעה מספר 19
 
   MyClass MyClass::operator + (const MyClass& other) const
{
MyClass result;
result.m_iValue = m_iValue + other.m_iValue;
return result;
}

מחזירים אובייקט רגיל.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:47   30.11.09   
אל הפורום  
  22. זה לא כל-כך נכון. אף אחד לא אמר שיש לך copy c'tor  
בתגובה להודעה מספר 20
 
או default c'tor שמקבל MyClass ושעובד כמו שאתה רוצה.

 

MyClass& MyClass::operator + (const MyClass& other) const
{
m_iValue = m_iValue + other.m_iValue;
return *this;
}


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   23:50   30.11.09   
אל הפורום  
  23. אוקיי אולי לא הייתי ברור  
בתגובה להודעה מספר 20
 
   מה שרשמת זה אחלה , יעבור קומפילציה ויעבוד
אבל במקרה מסוים יש סיבה להמנע מהמימוש שעשית - אני מחפש את המקרה הזה ואיך אפשר לפתור את זה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   20:47   05.12.09   
אל הפורום  
  26. סתם כדי לסגור את הדיון  
בתגובה להודעה מספר 0
 
   שיש אופרטור בינארי מומלץ להשתמש בפונקציה גלובלית כדי לאפשר שרשור
שמגדירים אופרטור בינארי בתוך מחלקה לא תוכל להתבצע פעולת שרשור


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net