עבור לתוכן

C++ - בעיה לא לגמרי מובנת (כנראה הקצאת מערך)

Featured Replies

פורסם

יש לי בעיה בזמן ריצה

פתאום הקומפיילר (VS 2010) נותן לי את ההודעה המוכרת של בעיה בזמן ריצה (עם ה break וה continue)

ופותח לי ב VS קובץ ASM שמתחיל ככה:

page ,132

title chkstk - C stack checking routine

;***

;chkstk.asm - C stack checking routine

;

; Copyright © Microsoft Corporation. All rights reserved.

;

;Purpose:

; Provides support for automatic stack checking in C procedures

; when stack checking is enabled.

;

;*******************************************************************************

אני לא יודע מה יכל לגרום לזה

אבל הדבר היחיד שנראה לי חריג הוא שהקצאתי מערך של INT בגודל שתי מליון

int arr[2000001],

זה אמור להיות חריגה מגודל ההקצאה המותר?

אם כן איך יכולתי לדעת את זה בלי לשאול פה? (להבא, כדי לא להטריד סתם)

אריה

פורסם

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

בכל מקרה, מערכים גדולים מומלץ להקצות באופן דינמי (ע"י new/malloc).

פורסם

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


void f()
{
char a[100*1024*1024]; // 100MB is probably too big for the stack!
}

void g()
{
static char a[100*1024*1024]; // static and global arrays don't sit on the stack, so they can be big
}

פורסם

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

לאיזה מטרה אתה צריך מערך כזה ?

פורסם

מה הבעיה במערכים גדולים? נניח, אם הוא רוצה לטעון קובץ שלם לזכרון?

(2 מגה זה לא כל כך הרבה סך הכל)

פורסם
  • מחבר

תודה אני אנסה את הפתרונות

אני מבין שהקצאת זיכרון דינאמית (NEW) אמורה לפתור את הבעיה?

לגבי השאלה איך הגעתי לזה:

http://projecteuler.net/index.php?section=problems&id=11

אני חושב שזמן ריצה הרבה יותר חשוב לי מזכרון...

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

שבוע טוב,

אריה

פורסם

אני מבין שהקצאת זיכרון דינאמית (NEW) אמורה לפתור את הבעיה?

אכן.

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

פורסם

יש לי בעיה בזמן ריצה

פתאום הקומפיילר (VS 2010) נותן לי את ההודעה המוכרת של בעיה בזמן ריצה (עם ה break וה continue)

ופותח לי ב VS קובץ ASM שמתחיל ככה:

תעבוד עם std::vector ולא עם מערכים. ככה כל הצרות האלה יחסכו והפתרון מוכן וזמין וסטנדרטי (והוא מקצה דינמית באופן אוטומטי)

ארכיון

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

דיונים חדשים