האם מישהו יודע ?

g u y c o h e n

New member
האם מישהו יודע ?

האם יש פונקצייה בסביבת VC שמקבילה לפונקצייה gotoxy שקיימת בבורלנד לקביעת הסמן בחלון הפלט (חלון דוסי)
 
אין דרך

ועד כמה שידוע לי, הסיבה היא זו: מה שקרוי בפינו "חלון DOS", אינו באמת DOS, אלא תוכנה אחרת לחלוטין. לכן, בראש ובראשונה, אל לנו לצפות שהיא תתנהג כמו DOS רק בגלל שהיא ב-TEXT MODE. נכון, היא מקבלת פקודות "כמו של DOS", אבל זה ממש ממש ממש לא DOS. עד לפה, אם לא הייתי מספיק ברור, אז: זה לא DOS!
עכשיו לתכלס: "חלון ה-DOS" הוא למעשה היסטוריה של זרם של בתים. כאשר תוכנה שולחת בית ל"מסך", הוא עובר דרך BUFFER פנימי במערכת ההפעלה (הוא יכול לא לעבור ב-BUFFER, תלוי בסוג הפעולה שמבצעים אבל זה לא רלוונטי כרגע) ומשם הוא מופיע בחלון ומיד נכנס לדפי ההסטוריה. זה לא כמו ב-DOS, שהיה לך זיכרון ששם יכולת לכתוב ולקרוא כל אימת שבא לך.
 

גיל14

New member
הייתה דרך באסמבלי לעשות את זה.

ניסיתי אותה, והיא עבדה לי כשהחלון היה Maximized. אז אולי בכל זאת יש דרך?
 
שלח את הקוד

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

גיל14

New member
הנה:

נתחיל בקוד:
[BITS 16] [ORG 0100h] START: mov DX, WORD 230Fh ;We're going to line 35, column 15 call GotoXY mov DX, RandomMsg mov CX, 12h ;Message length is 18 chars, that's 12 in hex call Write mov AX, WORD 4C00h ;Function 4C: Quit to DOS, Errorlevel 00 int 21h ;Call DOS interrupt ;---------------------------------- ; GotoXY ; ------ ; Arguments: ; In DL: X (column) to go to (0-79) ; In DH: Y (line) to go to (0-24) ; Alters: AX,BX ; Action: Positions cursor at (X,Y) ;---------------------------------- GotoXY: mov AH,02h ;BIOS VIDEO service 2: Position Cursor mov BH,0 ;Text display page 0 int 10h ;Call BIOS VIDEO ret ;-------------------------------------- ;Write ;----- ;Arguments: ;In DX: Pointer to string to be written ;In CX: Length of string to be written ;Alters: AX,BX ;Action: Prints a string ;-------------------------------------- Write: mov BX,1 ;Print to stdout mov AH,40h ;Service 40h, Print String int 21h ;Call DOS interrupt ret [SECTION .data] RandomMsg db "This is a message."​
איסמבלתי (פועל חדש, בניין פיעל) את זה תחת נזם. הרצתי את זה בווינדוס 2000 פרופשיונל: Start->Run->cmd Alt+Enter MyProggie.com
 

selalerer

New member
זאת אמולציה לDOS ואמולציה דיי טובה.

בDOS כאשר תכנתו משחקים היה נהוג לכתוב ישירות לחוצץ המסך (היות ובDOS אין שום אבטחה, זה היה אפשרי) וגם אם תוכנה DOSית עושה את זה תחת האמולציה, זה עובד כצפוי (יש לאמולציה מעין חוצץ מסך משלה) ולכן אפשר לשלוח את הסמן לכל מקום שרוצים גם בקונסול. יש ספר שמלמד בדיוק את הדברים הללו "שפת C ונושאים מתקדמים" בהוצאת הוד עמי, הוא מיועד לתכנות תחת DOS ואפשר בעזרת מה שמלמדים שם גם לעשות תוכנות קונסול שיפעלו כמו שפעלו בDOS.
 

dor_ian

New member
הנה הדרך לעשות זאת

תוסיף לתוכנית את הHEADER: windows.h והנה הקוד
void gotoxy(int x, int y) { COORD point; point.X = x; point.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), point); }​
 

גיל14

New member
מצוין...

אבל אני מתערב איתך ששלי רצה 55 ננושניות יותר מהר D:
 
יפה יפה, אבל..

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