ABA


"שאלה קטנה לגבי MAIN ב - C"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10360 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10360
MrSus
חבר מתאריך 8.5.09
1801 הודעות
   21:49   22.04.11   
אל הפורום  
  שאלה קטנה לגבי MAIN ב - C  
 
   התחלתי ללמוד שפת C מהספר C FOR DUMMIES.. אני יודע שזה לא הבחירה הטובה ביותר, אבל הספר הזה דיי מובן ומסביר ממש מהבסיס.. אחריו זה אני אתקדם לספרים יותר מפורטים.

בכל אופן, אני רואה פה בדוגמאות שאתם נותנים בפורום, שהרבה מכריזים על הפונקציה MAIN כ- VOID..

אני משתמש בעורך ובקומפיילר DEV-C++ , וכשאני מנסה להכריז על פונקציית MAIN כ- VOID, הוא אומר לי main must return int, כך שאין לי ברירה אלא להגדיר אותה כ INT.

האם יש סיבה?

למה נועדה ההכרזה כ- VOID?


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  לפי התקן חתימת הפונקציה היא int main. Deuce  22.04.11 23:31 1
     הבנתי, טוב לדעת! MrSus 22.04.11 23:47 2
     תוכל לפרט על הסיבות האלה? ShocKi  23.04.11 00:53 4
         מכתב Deuce  23.04.11 01:56 6
  כי VS מאפשר את זה... הוא בעצם מבצע return 0 ldan192  23.04.11 00:53 3
     לפי מיטב ידיעתי גם בורלנד מאפשר את זה ShocKi  23.04.11 00:59 5
         יש מצב, בכל מקרה ב-VS לפחות, ldan192  23.04.11 12:58 7
             איכס אסמבלר :| ShocKi  23.04.11 18:03 10
  יש לי שאלה נוספת MrSus 23.04.11 14:16 8
  אין שום סיבה בעולם שפונקציה לא תחזיר ערך. akoka2 23.04.11 17:14 9

       
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   23:31   22.04.11   
אל הפורום  
  1. לפי התקן חתימת הפונקציה היא int main.  
בתגובה להודעה מספר 0
 
כל קומפיילר ראוי לשפת C לפי התקן לפי התקן ANSI_C - במידה ולא ביקשת אחרת - אמור להתריע במידה והחתימה של main שונה מ-int main.

בפועל יש מספר ספרים שמקלים ראש ולא טורחים בכלל לציין מה התקן, וכן מספר קומפיילרים שלא יגידו לך כלום אם תעשה void main.

לפי התקן אתה צריך לעבוד עם int main (ויש אגב מספר סיבות ללמה הגדירו את זה ככה).







                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
MrSus
חבר מתאריך 8.5.09
1801 הודעות
   23:47   22.04.11   
אל הפורום  
  2. הבנתי, טוב לדעת!  
בתגובה להודעה מספר 1
 
   תודה!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   00:53   23.04.11   
אל הפורום  
  4. תוכל לפרט על הסיבות האלה?  
בתגובה להודעה מספר 1
 
   ומה המשמעות של int main אם באמת אין לי ערך להחזיר למערכת ההפעלה..


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   01:56   23.04.11   
אל הפורום  
  6. מכתב  
בתגובה להודעה מספר 4
 
ראשית, תמיד יש משמעות להחזרת הערך כי פה למעשה אתה מתקשר עם מערכת ההפעלה ומודיע לה האם התכנית שלך סיימה לרוץ בהצלחה או לא. הקונבנציה היא להחזיר 0 במידה והתכנית סיימה את פעולתה בהצלחה וערך אחר במקרה של ERROR.

נניח לצורך העניין שיש איזשהו מקום בזכרון, שמיוצג ע"י משתנה של מערכת ההפעלה נאמר SysRet, שאליו מוזנים ערכי החזרה של תהליכים.

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

עכשיו נתחיל להתלכלך:
תאר לעצמך כעת שאתה בונה איזשהו רכיב embedded שקיימת בו איזשהי internal os שפותחה עבור אותו רכיב. על הרכיב רץ הליך שכתבת בשפת C אבל עם void main ורצה הגורל ואחת הפונקציות שהשתמשת בהן (נניח HANDLE כלשהו), לא בכוונה, ניגשה ל-SysRet והציבה בו את הערך -400. רצה הגורל ואותה מערכת הפעלה מוציאה שגיאה כאשר מקבלת ערך החזרה שאינו בין -256 ל-256 ומרסטת את עצמה.
נשמע מונפץ קצת?
אתה מוזמן לקרוא פה שזה יורד לרמת האסמבלי.


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






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   00:53   23.04.11   
אל הפורום  
  3. כי VS מאפשר את זה... הוא בעצם מבצע return 0  
בתגובה להודעה מספר 0
 
וכנראה הם רגילים לעבוד רק עליו.
אף קומפיילר אחר (שאני מכיר) לא מאפשר להכריז על main כ-void.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   00:59   23.04.11   
אל הפורום  
  5. לפי מיטב ידיעתי גם בורלנד מאפשר את זה  
בתגובה להודעה מספר 3
 
  


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   12:58   23.04.11   
אל הפורום  
  7. יש מצב, בכל מקרה ב-VS לפחות,  
בתגובה להודעה מספר 5
 

void main(){
}

ב-Debug mode מתורגם ל:

push ebp
mov ebp,esp
sub esp,0C0h; why on the earth is it reserving 192 bytes?
push ebx
push esi
push edi ; good compiler. Its saving ebx, esi & edi values.
lea edi, ; line 1
mov ecx,30h ; line 2
mov eax,0CCCCCCCCh ; line 3
rep stos dword ptr es: ; line 4


xor eax,eax ; returning value 0. Code following this line is explanatory.
pop edi ; restoring the original states of edi,esi & ebx
pop esi
pop ebx
mov esp,ebp
pop ebp
ret

(לפי גוגל)


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   18:03   23.04.11   
אל הפורום  
  10. איכס אסמבלר :|  
בתגובה להודעה מספר 7
 
   מחסנית ארורה


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
MrSus
חבר מתאריך 8.5.09
1801 הודעות
   14:16   23.04.11   
אל הפורום  
  8. יש לי שאלה נוספת  
בתגובה להודעה מספר 0
 
   חבל לפתוח נושא חדש בשביל זה.

ראיתי שכאשר משתמשים במשתנים, לפעמים מוסיפים את הסימן & לפני המשתנה, ולפעמים לא..

מתי צריך להוסיף אותו ומתי לא, ולמה?


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

   17:14   23.04.11   
אל הפורום  
  9. אין שום סיבה בעולם שפונקציה לא תחזיר ערך.  
בתגובה להודעה מספר 0
 
  


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

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

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



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