מישהו יודע....

ofir178

New member
מישהו יודע....

בשפת C כאשר אני רוצה לצאת מאמצע התוכנית (לדוגמא if a=5 אז צא) איך רושמים זאת. בתודה מראש.
 

IP yuval

New member
אם אתה הmain, אז אפשר עם

return int או exit(int). אם אתה רוצה להחזיר ערך מפונקציה, אז כמובן return int, ואם אתה רוצה לצאת מהתכנית כאשר אתה בתוך פונקציה, אז exit(int).
 

KKnDoIt

New member
באופן כללי, זה נוהג רע מאוד לצאת

מתוכנית שלא באמצעות return מהפונקציה main. אפשר להשתמש ב- exit מתוך פונקציות אחרות רק כדי לטפל במצבי חירום. זו לא הדרך המסודרת לצאת מתוכנית.
 

erezsh

New member
יופי, גיבור

זה מאוד עוזר לומר "הוא צודק", כי עכשיו שכנעת אותי לגמרי! אני לא רואה שום סיבה לא להשתמש ב-exit, כל עוד הכל מתנקה לפני השימוש. אני גם לא רואה סיבה לא להשתמש ב-return, לצורך העניין. הכל תלוי בסגנון של המשתמש. (אם עושים exit במקום מוזר של התוכנה, תמיד אפשר לעשות debug print של המקום והסיבה.)
 

annefan

New member
השאלה שלך גם היתה מאוד מפורטת...

אתה גם מנמק בעצמך. אתה צריך לדאוג לנקיון, אוביקטים על ה-stack לא נמחקים, צריך לשים debug. אני צריך להוסיף משהו? יש ל-exit שימושים, כמו גם ל-goto ול-setjmp\longjmp. אבל צריך המון זהירות במה שעושים. לצאת ב-exit באופן סדיר יוצר המון בעיות.
 

erezsh

New member
היא גם הייתה צריכה להיות?

צריך לדאוג לניקיון - אתה בכל מקרה צריך. ובשביל זה גם יש atexit. "אוביקטים על ה-stack לא נמחקים" - הא? מה גורם לך לחשוב ככה? "צריך לשים debug" - אפשר, לא חובה. בכל מקרה צריך לשים, גם אם אתה עושה את זה בעזרת returnים. ואני בכלל אוהב להחזיר את השגיאה שלי בעזרת errorlevels... לצאת ב-exit במקום ב-return מתוכנית, זה בדיוק כמו לצאת ב-return מפונקציה (אם הוא לא בסופה). צריך לדעת מה עושים, אבל אם יודעים זה יכול לפשט מאוד. ובעצם - למה לא?
 

DadleFish

New member
תגובה...

אובייקטים על ה-stack לא נמחקים במקרה של EXIT ואאל"ט גם ב-throw. זה כמו במונופול, "לך לכלא. לך ישר לכלא. אל תעבור ב-GO, אל תאסוף 200 ש"ח".
 

erezsh

New member
אה,

אתה מדבר על Classים. הבעיה היא במימוש שלהם. לא תואם exit. אל תשתמש ב-OO.
 
exit משמש בד"כ...../images/Emo26.gif

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

guznik

New member
זה מה שמלמדים...

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

IP yuval

New member
ומה דעתכם על atexit, זה שימושי?

ATEXIT Section: Linux Programmer's Manual (3 ) NAME atexit - register a function to be called at normal program termination SYNOPSIS #include <stdlib.h> int atexit(void (*function)(void)); DESCRIPTION The atexit() function registers the given function to be called at normal program termination, either via exit(3) or via return from the program's main(). Functions so registered are called in the reverse order of their registration; no arguments are passed. At least ATEXIT_MAX functions can be registered. This value is at least 32. It can be obtained using sysconf(3). By a successful call to one of the exec functions, all registrations are undone. RETURN VALUE The atexit() function returns the value 0 if successful; otherwise it returns a nonzero value. EXAMPLE #include <stdio.h> #include <stdlib.h> #include <unistd.h> void bye(void) { printf("That was all, folks\n"); } int main(){ long a; int i; a = sysconf(_SC_ATEXIT_MAX); printf("ATEXIT_MAX = %ld\n", a); i = atexit(bye); if (i != 0) { fprintf(stderr, "cannot set exit function\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; } CONFORMING TO SVID 3, BSD 4.3, ISO 9899, POSIX 1003.1-2001​
 

annefan

New member
דווקא ראיתי לזה שימוש מעניין מאוד.

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

annefan

New member
שם הספר

Addison Wesley - Modern C++ Design Generic Programming and Design Patterns Applied
 

annefan

New member
ממש בצדק...

יום אחד, פתאום, התוכנה שלך יוצאת. בהתחלה אתה חושב שהיא יצאה נורמלי, אבל אין יציאה כזו מה-Main. אחר כך אתה חושב שהיא עפה, אבל לא נראה שיש איזה סיגנל ביציאה. עכשיו אתה באמת לא מבין מה קורה. אתה יושב. חושב. שובר ת'ראש. הולך הביתה מתוסכל. חוזר לעבודה. יושב חושב שובר ת'ראש. בסוף, אתה מגלה שאיזה מתכנת מעפן שם exit באיזו פונקציה בסוף הקוד שמאלה. וואלה דרך!
 

MaorCS

New member
מוזר לי שאף אחד לא הביא פה לדוגמא

את הפקודה break(); ככה לימדו אותי..
 
למעלה