ABA


"שאלה פשוטה ב C משתנה סטטי ומספרים רנדומלים"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10267 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10267
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   01:24   13.02.11   
אל הפורום  
  שאלה פשוטה ב C משתנה סטטי ומספרים רנדומלים  
 
   ערכתי לאחרונה בתאריך 13.02.11 בשעה 01:37 בברכה, ShocKi
 
הסבירו לי שקיים סוג משתנה כזה:
static int num ;

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

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


שאלה נוספת (יותר דוגמא שאני צריך)..
אני לא מבין איך עובדת הפקודה rand.. בכל מקום אני רואה הגדרה אחרת וככל הנראה מה שמבלבל אותי זה פקודות שונות בין מהדרים שונים.. (אני צריך לפי ויזואל ולא לפי טורבו)
איך אני עושה מספר רנדומלי בין מינוס 100 ל 100?
בין 0 ל 100?
ובין 50 ל 100?
עברתי כבר על כל לינק אפשרי בגוגל ולא מצאתי הסבר איך אני קובע את הגבולות של המספרים הרנדומלים שאני מגריל.


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


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  מכתב D-KinG 13.02.11 11:11 1
     לא הבנתי... ShocKi  13.02.11 14:03 2
         לא. הוא נמצא ''גלובאלית'' בקוד, אבל הוא תקף רק לסקופ ldan192  13.02.11 20:34 3
             תודה.. לא הבנתי את המשתנה הסטאטי.. ShocKi  13.02.11 23:31 4
                 הוא לא מאפס אותו כל פעם. הוא מאופס רק בפעם הראשונה ldan192  13.02.11 23:51 5
                     תודה... ShocKi  14.02.11 01:31 6
                         כן, בדיוק. פעם ראשונה מאותחל (במקרה שלך ל-0) ldan192  14.02.11 11:46 7

       
D-KinG
חבר מתאריך 8.6.02
3490 הודעות, דרג אמינות חבר זה
   11:11   13.02.11   
אל הפורום  
  1. מכתב  
בתגובה להודעה מספר 0
 
   משתנה סטטי הוא משתנה אך ורק של הפונ', אם תנסה לגעת בו מחוץ לפונ' תקבל שגיאה שאין כזה משתנה
מעבר לזה בניגוד למשתנים רגילים של הפונ' הוא קיים גם אחרי שהקריאה לפונ' נגמרה, ולכן הוא שומר את ערכו מריצות קודמות לריצות הבאות
לגבי rand הפונ' מחזירה לך מספר בין 0 לקבוע RAND_MAX, אם תרצה מספר בין 0 ל-100 למשל אז אתה יכול לעשות לתוצאה mod 101, ואז תקבל מספר בין 0 ל-100
אם תרצה בין 100 למינוס 100, תעשה לתוצאה mod 201, ותחסר 100...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   14:03   13.02.11   
אל הפורום  
  2. לא הבנתי...  
בתגובה להודעה מספר 1
 
   אם נניח גמרתי את השימוש במשתנה הסטטי.. אני משחרר אותו בעזרת free רגיל? כמו בהקצאה דינאמית?

לגבי rand.. לא הבנתי בכלל...


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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:34   13.02.11   
אל הפורום  
  3. לא. הוא נמצא ''גלובאלית'' בקוד, אבל הוא תקף רק לסקופ  
בתגובה להודעה מספר 2
 
בו הוא נמצא. הוא גם מאותחל לפני ריצת ה-main ולאחר סגירתו (יש קונסטרקטור ודיסטרקטור לתוכנית, לפחות ב-gcc ומקביל ב-VC, אבל לא אייגע אותך בפרטים האלה), בגדול לחלק מהפרטים הנוספים קרא פה:
http://en.wikipedia.org/wiki/Data_segment

שים לב שהדברים פה נכונים ברובם רק ל-dynamic linking....

ולגבי rand, הפונקציה מחזירה לך מספר רנדומלי כלשהו (תניח שבין 0 לאינסוף).
ברגע שאתה "תוחם" אותו ב-modulo (%) אז המספר עובר hashing לבין 0 n-1.

אם תחסיר מהמספר הזה x, אז הספר יעורבל לבין x- עד n-x-1.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   23:31   13.02.11   
אל הפורום  
  4. תודה.. לא הבנתי את המשתנה הסטאטי..  
בתגובה להודעה מספר 3
 
   איך נראת תוכנית איתו..?
ולא הבנתי איך הוא עושה את האיפוס לפני הmain... הרי הוא עושה את האיפוס שהוא נכנס לפונקציה לא? כי רק שם המשתנה מוגדר...?
ואיך הוא יודע לא לאפס אותו בכל פעם שהוא יכנס מחדש לפונקציה?


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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:51   13.02.11   
אל הפורום  
  5. הוא לא מאפס אותו כל פעם. הוא מאופס רק בפעם הראשונה  
בתגובה להודעה מספר 4
 
אח"כ כל ערך שתציב בו נשמר עד לפעם הבאה שתשנה (גם אם אתה יוצא מסקופ הפונקציה)


בברכה,
עידן


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

static x;
x++;

אז הוא יחזיר בסופו של דבר בקריאה האחרונה.. את מספר הקריאות לפונקציה ?
כלומר, בקריאה הראשונה זה יהיה 1, בקריאה הראשונה 2..?

ככה זה עובד?

ואשמח לתשובה לגבי ה free..?
האם אני צריך לשחרר את המשתנה הזה.. ואם כן איך אני עושה את זה?
הרי אני לא יכול לשחרר אותו בפונקציה כי אז הוא לא ישמר.. ומצד שני אני לא יכול לשחרר אותו ב main כי ה main לא מכיר אותו.


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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   11:46   14.02.11   
אל הפורום  
  7. כן, בדיוק. פעם ראשונה מאותחל (במקרה שלך ל-0)  
בתגובה להודעה מספר 6
 
ואח"כ הוא פשוט "קופץ" על ההגדרה הזו (לא באמת, פשוט מאוד האתחול לא מתבצע שם) ועושה כל פעם ++x.

ולא, לא צריך free. כפי שראית בלינק שנתתי המשתנה נשמר ב-data/BSS segment, כלומר לא ב-HEAP - כלומר מאותחל סטטית ולא דינמית (באלוקציה).


בברכה,
עידן


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

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

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



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