אם אני לא טועה, כל סגמנט בתוכנית מכיל 64K, לפחות פעם היה. חוצץ בגודל 64000 בתים, פחות או יותר ממלא אותו עד הסוף. חוץ מזה, ניסיתי גם לשנות את הפונקציה לmalloc, ולהגדיר את הצביעים כמצביעים קרובים, אבל אותה תוצאה.
הקומפיילר הוא זה שאמור לדאוג לנושא של NEAR ו-FAR וסגמנטציה של הזיכרון. בכל מקרה אלא אם כן אתה כותב ב-DOS טהור זה לא משנה בכלל כי אין לזה משמעות יותר. אף אחד לא עובד ב-real mode בימינו. ואם כן, לא תוכל להימנע מסגמנטציה אלא אם כן תשתמש בטריקים "מיוחדים"
העניין הוא שאני צריך מערך בגודל 64000, ואני יודע שאפשר לעשות את זה. אם אני מנסה להגדיר את הבאפר כך:
byte buffer[64000]
אני מריץ את התוכנית וישר מקבל שגיאת Access Vialtion. ואם אני מנסה להגדיר אותו על ידי malloc או farmalloc או אפילו calloc, אני מקבל מצביע NULL. אני עובד במצב real mode, משום שזאת לא תוכנה מסחרית, סתם איזה פרוייקט שאני צריך להכין, וreal mode יותר נוח במקרה הספציפי הזה.
אם זה על הזיכרון, אני יכול להשתמש בפונקציות כמו memset לנקות את החוצץ או memcpy בשביל להעביר אותו במהירות לחוצץ הוידאו הראשי (0xA000). אם זה ישב על הדיסק זה הרהב יותר איטי...
יש לי גם את גרסא 3.1 שעובדת במסך דוס וגם את 5.1 שעובדת בסביבת חלונות, הם הרבה יותר נוחים לעבודה. יכול להיות שהבעיה היא בקומפיילר? יכול להיות דרך להגדיר את ידנית את הmodel של התוכנית למשל לlarge, כדי לקבל יותר זיכרון בסגמנט, זה יכול לעזור?
אתה לא יכול לקבל יותר זיכרון בסגמנט כי זה קבוע ע"י מערכת הפעלה והדרכים לעקוף את זה הן קצת עקומות. מה שכן אתה יכול לעשות: 1. למצוא קומפיילר נורמלי
2. לחלק את הבאפר שלך ליותר מחלק אחד. אני יודע שזה ממש לא אופטימלי אבל זו אפשרות, אומנם מסובכת. 3. להכריח את הקומפיילר להקצות לך את הזיכרון על segment boundary וכך תוכל להקצות 64000 כי סגמנט הוא 65535 בתים. 4. לעבוד ב-protected mode או flat (פשוט יותר אבל צריך להבין למה זה עובד). 5. איכשהו לגרום לקומפיילר שלך לבנות מודל גדול יותר (כמו שיש model directive באסמבלי, אולי יש משהו דומה עבור הקומפיילר שלך..) כשתגיע למצב שבו תצטרך כבר להעתיק את התוכן של ה-double buffer, נדבר כי יש לי עוד הצעות