שאלה לגבי פסקל.

weirdo1986

New member
שאלה לגבי פסקל.

מה המספר הכי גבוה שניתן למקם בפונקצית random? כי בהתחלה השתמשתי בתכנית בהגרלת מספר בין 1 ל-35, וכששיניתי את זה להגרלת מספר בין 1 ל-135, קיבלתי שגיאת Stack overflow. תודה מראש.
 

vinney

Well-known member
מה הקוד שלך?

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

weirdo1986

New member
איזה קוד?

יש לי מערך, שאחרי שכבר הפעלתי את התכנית החלטתי להגדיל. אני מתכוונת שכשניסיתי להריץ את זה עבור מערכים קטנים יותר (עד 50) והרצתי את הפונקציה שבוחרת באקראיות איבר מהמערך (ע"י random), עבור כל מספר גדול מ-50 קיבלתי את הודעת השגיאה: Stack Overflow Error. אני לא יודעת אם השגיאה נובעת מהפקודה: random((n)+1); {כאשר n הוא מספר האיברים במערך} או באופן כללי מגודל המערך.
 

DadleFish

New member
כשאומרים קוד,

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

weirdo1986

New member
הא,

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

vinney

Well-known member
דווקא להיפך

זאת שגיאה עקרונית מאוד, זאת לא בעיית סינטקס פשוטה, אלא שימוש לא נכון בעליל בתכנון זכרון דינמי בתוכנית לא ידעתי שבפסקל אפשר להגיע לזה אפילו, זה מהשגיאות המאפיינות את C בד"כ
 

weirdo1986

New member
בטח שאפשר.

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

DadleFish

New member
התוכנית רצה כל עוד את משתמשת

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

weirdo1986

New member
תודה.

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

weirdo1986

New member
לא, אני לא משתמשת ברקורסיה.

ועכשיו עוד יותר לא ברור לי איך השגיאה נובעת מהRANDOM (היא מצביעה עליה) - אם בדוגמא בהוראות של פסקל ל-RANDOM כתוב Random (1000)... לא ברור לי מאיפה השגיאה נובעת.
 

weirdo1986

New member
זו תכנית ממש ארוכה -

זה משחק, עם יחידת ספריה וכו'. אבל הקטע הבעייתי בתכנית הוא: function new_word (a:arr):string; begin new_word:=a[random(n)+1]; end; כאשר n מוגדר ביחידת הספריה const n=133; ויש מערך: type arr=array [1..n] of string; יש לכם מושג מה יכולה להיות הבעיה?
 

vinney

Well-known member
אני לא אוהב את הקוד הזה

ברור שכשמעבירים מערך גדול מספיק לפי ערך, הוא יסתום לך את המחסנית. תעבירי את המערך במצביע (pointer). שימי לב שהמערך שלך הוא בגודל N*256 שזה יותר מ30K עבור N של 133. 30K זה המון זכרון מחסנית !!! אגב, את יכולה להגדיל את המחסנית בהגדרות קומפיילר, אני לא זוכר איך עושים את זה בפסקל, כך שהשגיאה תדחה לN יותר גדול, אבל בעקרון - זה פתרון גרוע.
 

weirdo1986

New member
איך עושים את זה?

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

galh

New member
הגדלת המחסנית...

כותבים בתחילת התוכנית:
{$M 8192,0,16384}​
הראשון זה גודל המחסנית, אבל תחפשי בעזרה לגבי הפרמטרים, כי אני לא ממש זוכר.
לגבי הבעיה שלך בתוכנית... שוב בעיות זכרון קשות שלי, אבל גודל משתנה סטטי אחד לא יכול להיות יותר מ- 64K. כאשר את מגדירה מערך של מחרוזות אז כל מחרוזת היא בגודל 256 ואם המערך גדול מידי זה יכול לגרום לבעיות. פתרון מהיר יהיה להקצות את המחרוזות באופן דינמי עם New או GetMem.
 

weirdo1986

New member
שיחקתי עם ההגדרות של הפסקל ../images/Emo13.gif

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