farmalloc

זויברג

New member
farmalloc

בניתי תוכנית שמשתמשת בגרפיקה ורציתי ליצור double buffer, הגדרתי את הbuffer כך:
Buffer = (byte *)farmalloc(64000);​
אבל אני מקבל שBuffer שווה לNULL, וזה אמור לקרות רק אם אין זכרון פנוי, ובכל זאת... אין עושים את זה? איך אני מגדיר Buffer כזה גדול?
 

זויברג

New member
בגלל הגודל,

אם אני לא טועה, כל סגמנט בתוכנית מכיל 64K, לפחות פעם היה. חוצץ בגודל 64000 בתים, פחות או יותר ממלא אותו עד הסוף. חוץ מזה, ניסיתי גם לשנות את הפונקציה לmalloc, ולהגדיר את הצביעים כמצביעים קרובים, אבל אותה תוצאה.
 

voguemaster

New member
אתה בד"כ לא אמור להתעסק עם זה

הקומפיילר הוא זה שאמור לדאוג לנושא של NEAR ו-FAR וסגמנטציה של הזיכרון. בכל מקרה אלא אם כן אתה כותב ב-DOS טהור זה לא משנה בכלל כי אין לזה משמעות יותר. אף אחד לא עובד ב-real mode בימינו. ואם כן, לא תוכל להימנע מסגמנטציה אלא אם כן תשתמש בטריקים "מיוחדים"
 

זויברג

New member
זה לא חשוב לי איפה ישב החוצץ,

העניין הוא שאני צריך מערך בגודל 64000, ואני יודע שאפשר לעשות את זה. אם אני מנסה להגדיר את הבאפר כך:
byte buffer[64000]​
אני מריץ את התוכנית וישר מקבל שגיאת Access Vialtion. ואם אני מנסה להגדיר אותו על ידי malloc או farmalloc או אפילו calloc, אני מקבל מצביע NULL. אני עובד במצב real mode, משום שזאת לא תוכנה מסחרית, סתם איזה פרוייקט שאני צריך להכין, וreal mode יותר נוח במקרה הספציפי הזה.
בכל מקרה, תודה על העזרה
 

vinney

Well-known member
למה אתה לא עושה את זה על דיסק?

זה ממילא יגיע לשם בPAGING...
 

זויברג

New member
זה חוצץ למסך,

אם זה על הזיכרון, אני יכול להשתמש בפונקציות כמו memset לנקות את החוצץ או memcpy בשביל להעביר אותו במהירות לחוצץ הוידאו הראשי (0xA000). אם זה ישב על הדיסק זה הרהב יותר איטי...
 

erezsh

New member
אז ככה

א) תשתמש ב-malloc ב) תעבור ל-DJGPP (אם אתה מתעקש על דוס)
 

זויברג

New member
אני עובד בBorlandC, זה לא יותר נוח?

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

voguemaster

New member
לא בדיוק, לא

אתה לא יכול לקבל יותר זיכרון בסגמנט כי זה קבוע ע"י מערכת הפעלה והדרכים לעקוף את זה הן קצת עקומות. מה שכן אתה יכול לעשות: 1. למצוא קומפיילר נורמלי
2. לחלק את הבאפר שלך ליותר מחלק אחד. אני יודע שזה ממש לא אופטימלי אבל זו אפשרות, אומנם מסובכת. 3. להכריח את הקומפיילר להקצות לך את הזיכרון על segment boundary וכך תוכל להקצות 64000 כי סגמנט הוא 65535 בתים. 4. לעבוד ב-protected mode או flat (פשוט יותר אבל צריך להבין למה זה עובד). 5. איכשהו לגרום לקומפיילר שלך לבנות מודל גדול יותר (כמו שיש model directive באסמבלי, אולי יש משהו דומה עבור הקומפיילר שלך..) כשתגיע למצב שבו תצטרך כבר להעתיק את התוכן של ה-double buffer, נדבר כי יש לי עוד הצעות
 

karmma

New member
בבורלנד C אין הקצאות גדולות

בשום מודל זיכרון. בשביל BUFFER גדול תצטרך לעבוד דרך DOS INT21(ממש לא נוח) כמובן שתצטרך קודם להקטין את ה HEAP כדי שישאר זיכרון ל DOS
 

selalerer

New member
../images/Emo128.gif גרסת הlite לא תומכת בהקצאות...

...גדולות, אבל הגרסאות הרגילות (של גרסה 3 בכל אופן לפי נסיוני) כן תומך בהקצאות גדולות, אך יש מספר הגדרות שצריך לעשות: 1.בתפריטים לך ל:
Options-->Compiler-->Code Generation...​
ושם שנה את הmodel ל Large. ב Assume SS Equals DS שים Default for memory model. וב Options סמן את Treat enums as ints בלבד. 2.בתפריטים לך ל:
Options-->Compiler-->Advanced code generation...​
ושנה את הערך בFar Data Freshhold ל 64000 (כלומר תוסיף עוד 0). 3.בתפריטים לך ל:
Options-->Debugger...​
ושנה את הProgram Heap Size ל 640 (K bytes). אני חושב שזה יפתור לך את הבעיה.
 

זויברג

New member
../images/Emo24.gif בנאדם, אתה גאון, תודה ../images/Emo13.gif

זה עובד, סוף סוף אחרי 3 ימים שאני מחפש פתרון, אתה לא מאמין כמה עזרת. חוץ מזה, תודה לכולם, לכל מי שעזר לי, תודה תודה תודה תודה תודה
 
למעלה