ABA


"למה לא ניתן להקצות מערך סטטי באורך לא קבוע בפונקציה בC?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10448 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10448
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   12:49   13.08.11   
אל הפורום  
  למה לא ניתן להקצות מערך סטטי באורך לא קבוע בפונקציה בC?  
 
   למשל משהו כזה

int arr[n]

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


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  לא הסטטי זו הבעיה שלך פה, אלא ה-n. זו אלוקציה מגודל ldan192  13.08.11 13:07 1
     נכון ואני לא מבין מה הבעיה עם זה... D-KinG 13.08.11 13:47 2
         אי אפשר לשנות את הstack frame באופן דינמי DLN 13.08.11 20:07 3
  התפקיד של הקומפיילר VeNom  13.08.11 21:37 4
     הוא לא צריך להריץ את הקוד בשביל לדעת מה זה ה-N הזה D-KinG 13.08.11 23:20 5
         אז הוא יצטרך לעשות 2 פאסים על הקוד DLN 14.08.11 00:23 6
         כל היתרון של המשתנים בסטאק שהם מאוד מהירים ולא יקרים ldan192  14.08.11 10:09 7
             לא חושב שזה כזה יקר D-KinG 22.08.11 01:28 8
                 תחשוב על סיטואציה כזאת עידן_הכלי 22.08.11 09:29 9
                     בגלל זה רשמנו שצריך לשמור את n על המחסנית (בנוסף לקיים) D-KinG 22.08.11 11:12 10

       
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   13:07   13.08.11   
אל הפורום  
  1. לא הסטטי זו הבעיה שלך פה, אלא ה-n. זו אלוקציה מגודל  
בתגובה להודעה מספר 0
 
דינמי, ובזמן קומפילציה/פרה-פרוססינג הקומפיילר לא יודע מה הערך של n (אלא אם זה define/typedef).


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   13:47   13.08.11   
אל הפורום  
  2. נכון ואני לא מבין מה הבעיה עם זה...  
בתגובה להודעה מספר 1
 
   כמו שרשמתי הוא יכול לייצר קוד באסמבלר שמחסר n*4 בתים מהפוינטר של המחסנית
ונותן את הכתובת הזאת ל-arr... מה הבעיה עם זה?
למה n צריך להיות קבוע?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   20:07   13.08.11   
אל הפורום  
  3. אי אפשר לשנות את הstack frame באופן דינמי  
בתגובה להודעה מספר 2
 
   זה לא עובד ככה בC


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   21:37   13.08.11   
אל הפורום  
  4. התפקיד של הקומפיילר  
בתגובה להודעה מספר 0
 
   זה נטו "תרגום" קוד משפה עילית לשפת מכונה...
הוא לא "מריץ" את הקוד..ולכן לא יכול לדעת מה זה ה N הזה..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   23:20   13.08.11   
אל הפורום  
  5. הוא לא צריך להריץ את הקוד בשביל לדעת מה זה ה-N הזה  
בתגובה להודעה מספר 4
 
   כמו שאני רושם
a=b*c
והוא יכול לייצר קוד שעושה את זה
אז זה על אותו משקל...
לעשות SUB מ-ESP
n*4 בתים במקרה הזה..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   00:23   14.08.11   
אל הפורום  
  6. אז הוא יצטרך לעשות 2 פאסים על הקוד  
בתגובה להודעה מספר 5
 
   להבין מה זה N ואז לקבוע את הגודל מחסנית
בשביל זה יש לך קבועים...
ואם אתה מתכוון שהקומפיילר יקח את הקוד שמחשב את n ויעזר בו כדי לקבוע את הגודל מחסנית, זה היוריסטיקה שאין שום סיבה שקומפיילר יכלול, והוא גם לא יכול בחלק המקרים. זה ידרוש ממנו לשכפל קוד שקשור ללוגיקה של הפונקציה ולשים אותו באפילוג
זה יצור לך בעיות שלא צריכות להיות קיימות אם בכל מקרה ניתן לקבוע את התוכן של n בזמן קימפול


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   10:09   14.08.11   
אל הפורום  
  7. כל היתרון של המשתנים בסטאק שהם מאוד מהירים ולא יקרים  
בתגובה להודעה מספר 5
 
ובכלל, מאפשרים הרבה אופטימיזציות קומפיילר,
אז אתה בעצם אומר שהוא יממש לוגיקה שלמה מאחורי הקלעים שתזכור את ערך ה-N (באיזה שלב של התוכנית?) תדע שבחזרה מפונקציה תקפוץ X גודל במחסנית ובקיצור, בלאגן.
זה לא שזה בלתי אפשרי לממש את זה, אבל זה פשוט יקר וסותר את המתודלוגיה של C.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   01:28   22.08.11   
אל הפורום  
  8. לא חושב שזה כזה יקר  
בתגובה להודעה מספר 7
 
   בסה"כ לשמור את N על המחסנית, ולהוסיף את N (כפול משהו) למחסנית,
דבר שנעשה גם ככה רק עם קבוע.
בכל מקרה חשבתי שיש סיבה טכנית שאי אפשר לממש את זה, אבל כנראה שאין


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

   09:29   22.08.11   
אל הפורום  
  9. תחשוב על סיטואציה כזאת  
בתגובה להודעה מספר 8
 
   הגדרת N=10, והLoader הקצה לך 10 בתים בזיכרון.

אחרי זה בקוד שינית את N ל -7, מה יקרה כשתנסה לגשת לבית ה-8? או יותר חמור, מה יקרה כשהתוכנית תנסה לשחרר את הזיכרון הזה? כמה בתים ישוחררו?

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

עידן.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   11:12   22.08.11   
אל הפורום  
  10. בגלל זה רשמנו שצריך לשמור את n על המחסנית (בנוסף לקיים)  
בתגובה להודעה מספר 9
 
  


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

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

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



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