עבור לתוכן

הודעת שגיאה בתוכנית בסיסית עם פוינטרים שכתבתי ב c++

Featured Replies

פורסם

שלום

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

קוד התכנית:

#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.

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

תודה לעוזרים

פורסם

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.

פורסם
  • מחבר

תודה

אתחלתי את המצביעים והבעיה הסתדרה.

יש רק שני דברים שלא ברורים לי:

1) למה כדאי להגדיר את המשתנים כמקומיים ולא גלובלים?

2) למה לא להגדיר void main()?

פורסם

1.

בעיקרון מומלץ לצמצם את השימוש במשתנים שלך רק ל-scope הרלבנטי להם. ככה זה ימנע כל מיני בעיות, כמו שימוש במשתנים שלא היית אמור להשתמש בהם, ובכלל בלבול (כשתהיה לך תוכנית של אלפי שורות, משתנים גלובליים רק יבלבלו אותך).

2.

התקן של C ו-C++ אומר שהפונקציה main חייבת להחזיר int. יש קומפיילרים שיסרבו לקמפל תוכנית בה ה-main לא מחזיר int.

פורסם

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

אחד העקרונות המנחים בהנדסת תוכנה אומר בים השאר שרק מי שצריך להכיר את הנתונים יכיר אותם. זה נקרא encapsulation (ובעוד שמות אחרים).

לגבי void: זה מה שקובע התקן של השפה. יש קומפיילרים שיאפשרו לך לכתוב דברים לא סטנדרטים כמו void main וכו', אבל זה לא רעיון טוב להתרגל לדברים לא סטנדרטיים. קודם תדע מה מותר, אח"כ תעשה מה שאסור :)

כאן תמצא תשובות לחלק מהשאלות שלך ואפילו תשובות לשאלות שעוד לא שאלת: http://www.parashift.com/c++-faq-lite/newbie.html

עריכה: מסתבר שמישהו ענה בזמן שכתבתי. בכל מקרה, הנה המאמר של ויקיפדיה על משתנים גלובליים, עם עוד הסברים על למה זה בעעיתי.http://en.wikipedia.org/wiki/Global_variable

פורסם
  • מחבר

תודה רבה לכם

ארכיון

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

דיונים חדשים