ערכתי לאחרונה בתאריך 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 לא יטרח להדפדף עבור תוכנית כל-כך קצרה ככה שהוא ירחף עד לסיום התוכנית) אך פשוט התוכן יהיה זבל ולכן יודפס זבל.
אבל זה כמובן תכנות לא נכון ואי-דטרמיניסטי במערכות ההפעלה השונות.
אם תדביק פה את הקוד עצמו אני אוכל לוודא את כל מה שרשמתי מול הקומפיילרים השונים. אני מאמין גם שפספסתי כמה דברים בדרך בלי לוודא דברים מול קומפיילר.
בברכה,
עידן