פורסם 2007 במאי 1818 שנים שלוםכתבתי תוכנית פשוטה שקולטת מהמשתמש זמן בדקות ומתרגמת אותו לשעות ודקות.קוד התכנית:#include <stdio.h>int time,*phours,*pminutes;void ConvertTimeToHM (int time, int *phours, int *pminutes){*phours=time/60;*pminutes=time%60;}void main(void){ printf("Enter a number representing minutes\n");scanf("%d",&time);ConvertTimeToHM(time,phours,pminutes);printf("Hours: %d\n",*phours);printf("Minutes: %d\n",*pminutes);}כשאני מפעיל את התוכנית, אחרי קליטת הערך אני מקבל הודעת שגיאה של וינדוס, כזאת שלא בדיוק מפרטת מה הבעיה.מתברר שהשגיאה נגררת משתי הפקודות שימוש בפוינטרים שבתוך הפונקציה convert.לא משנה איזה ערך אני כותב שם אני מקבל הודעת שגיאה.תודה לעוזרים
פורסם 2007 במאי 1818 שנים phours ן-pminutes הם אמנם מצביעים, אבל הם לא מצביעים לשום דבר - לא אתחלת אותם להצביע על שום דבר.יש לך כמה אפשרויות. הכי פשוטה היא להפוך את phours ן-pminutes למשתנים רגילים מסוג int, ורק להעביר את הכתובת שלהם לפונקציה כך:int hours, minutes;ConvertTimeToHM(time,&hours,&minutes);עוד דברים שכדאי לתקן:1) הגדרת משתמנים גלובליים. עדיף להגדיר את המשתנים כמשתנים מקומיים בתוך main.2) פונקציה main היא:int main()או int main( int argc, char* argv[])אבל בטח לא void main כמו שהגדרת.ואז בסוף main תעשה return 0.
פורסם 2007 במאי 1818 שנים מחבר תודהאתחלתי את המצביעים והבעיה הסתדרה.יש רק שני דברים שלא ברורים לי:1) למה כדאי להגדיר את המשתנים כמקומיים ולא גלובלים?2) למה לא להגדיר void main()?
פורסם 2007 במאי 1818 שנים 1.בעיקרון מומלץ לצמצם את השימוש במשתנים שלך רק ל-scope הרלבנטי להם. ככה זה ימנע כל מיני בעיות, כמו שימוש במשתנים שלא היית אמור להשתמש בהם, ובכלל בלבול (כשתהיה לך תוכנית של אלפי שורות, משתנים גלובליים רק יבלבלו אותך).2. התקן של C ו-C++ אומר שהפונקציה main חייבת להחזיר int. יש קומפיילרים שיסרבו לקמפל תוכנית בה ה-main לא מחזיר int.
פורסם 2007 במאי 1818 שנים משתנים גלובליים נוטים לגרום לבעיות - הם גורמים לתלויות שקשה לראות בין פוקנציות, מפריעים למודולריות, גורמים ל-side effects, צריכים סינכרון בתוכניות multithreaded ועוד הרבה בעיות ברמות גבוהות יותר. נושאים כמו זמן חיים, סדר אתחול, אנקפסולציה, ועוד. אחד העקרונות המנחים בהנדסת תוכנה אומר בים השאר שרק מי שצריך להכיר את הנתונים יכיר אותם. זה נקרא encapsulation (ובעוד שמות אחרים). לגבי void: זה מה שקובע התקן של השפה. יש קומפיילרים שיאפשרו לך לכתוב דברים לא סטנדרטים כמו void main וכו', אבל זה לא רעיון טוב להתרגל לדברים לא סטנדרטיים. קודם תדע מה מותר, אח"כ תעשה מה שאסור כאן תמצא תשובות לחלק מהשאלות שלך ואפילו תשובות לשאלות שעוד לא שאלת: http://www.parashift.com/c++-faq-lite/newbie.html עריכה: מסתבר שמישהו ענה בזמן שכתבתי. בכל מקרה, הנה המאמר של ויקיפדיה על משתנים גלובליים, עם עוד הסברים על למה זה בעעיתי.http://en.wikipedia.org/wiki/Global_variable
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.