本文延續字母分類系列,詳細說明以 S 開頭的系統層級、圖形模式、串流控制與環境設定函數,涵蓋 sbrk、scanf 格式化輸入、searchpath、BGI 繪圖函數 (sector, setcolor, setfillstyle 等)、視口管理 (setviewport)、調色板操作、文字對齊、字型設定、中斷向量安裝 (setvect) 等核心功能。
功能:將程式資料段結尾向上/向下移動 incr 位元組,回傳舊斷點位址。coreleft() 可查詢剩餘堆疊空間。
char *sbrk(int incr);
範例:
printf("Before: %lu bytes free\n", coreleft());
sbrk(1000);
printf("After : %lu bytes free\n", coreleft());
功能:從 stdin 依格式字串讀取資料,回傳成功轉換項目數。支援 %d, %f, %s, %[set] 掃描集等。
常見陷阱:scanf 留下換行符於緩衝區,後續 gets/getchar 會誤讀。建議搭配 fflush(stdin) (非標準) 或改用 fgets+sscanf。
int n; float f; char str[20];
scanf("%d %f %19s", &n, &f, str);
char *searchpath(const char *filename);
找到回傳完整路徑指標 (靜態緩衝區),找不到回傳 NULL。
void far sector(int x, int y, int stangle, int endangle, int xrad, int yrad);
角度單位為度,0 度在 3 點鐘方向,逆時針增加。搭配 setfillstyle 設定填充樣式。
void far setactivepage(int page); // 繪圖目標頁
void far setvisualpage(int page); // 顯示頁
支援雙緩衝動畫:在非可見頁繪圖,完成後切換 setvisualpage 避免閃爍。
setpalette(index, color):單一調色板項目對應實際色號。setallpalette(struct palette *p):一次載入整組調色板。setrgbpalette(color, r, g, b):VGA/8514 直接設定 RGB 分量 (0-63)。void far setbkcolor(int color); // 背景色索引
void far setcolor(int color); // 繪圖色索引
void far setfillstyle(int pattern, int color); // 內建樣式
void far setfillpattern(char far *pattern, int color); // 使用者 8x8 模式
pattern 內建常數:SOLID_FILL, HATCH_FILL, USER_FILL 等。
settextstyle(font, direction, size):向量字型、水平/垂直、放大倍率。settextjustify(horiz, vert):對齊基準點,LEFT_TEXT/CENTER_TEXT/RIGHT_TEXT。setusercharsize(multx, divx, multy, divy):微調向量字型寬高比例。void far setviewport(int left, int top, int right, int bottom, int clip);
建立繪圖邊界,clip=1 開啟裁剪,座標系統相對視口原點 (0,0)。
void far setlinestyle(int style, unsigned pattern, int thickness);
style:SOLID_LINE, DOTTED_LINE, USERBIT_LINE (自訂 16-bit pattern)。
| 函數 | 功能 | 原型 |
|---|---|---|
setdate | 設定 DOS 日期 | void setdate(struct date *d); |
settime | 設定 DOS 時間 | void settime(struct time *t); |
setdisk | 設定預設磁碟機 (0=A:) | int setdisk(int drive); |
setdta | 設定磁碟傳輸區 (DTA) 位址 | void setdta(char far *dta); |
setverify | 開啟/關閉寫入後驗證 | void setverify(int value); |
setcbrk | 設定 Ctrl-Break 檢查頻率 | int setcbrk(int value); |
setbuf | 指定串流緩衝區 | void setbuf(FILE *fp, char *buf); |
setvbuf | 完整控制串流緩衝模式 | int setvbuf(FILE *fp, char *buf, int mode, size_t size); |
setmode | 切換檔案文字/二進位模式 | int setmode(int fd, int mode); |
setblock | 調整已配置記憶體區塊大小 | int setblock(int seg, int newsize); |
setjmp | 非區域跳轉設定點 | int setjmp(jmp_buf env); |
setmem | 填充記憶體區塊 (Turbo C) | void setmem(void *addr, int len, char val); |
setftime | 設定檔案日期時間 | int setftime(int fd, struct ftime *ft); |
setgraphbufsize | 調整內部圖形緩衝區大小 | unsigned far setgraphbufsize(unsigned size); |
setgraphmode | 切換圖形模式並清螢幕 | void far setgraphmode(int mode); |
void setvect(int intr_num, void interrupt (*isr)());
安裝自訂中斷服務常式 (ISR),搭配 getvect 保存原向量,keep() 可做成 TSR。注意:ISR 內不可呼叫非重入函式 (如 printf, malloc)。
void segread(struct SREGS *segs);
取得當前 CS, DS, ES, SS 值,常用於 intdosx、int86x 前準備段暫存器。
提示:本文函數多為 Borland C/C++ (DOS 16-bit) 專用,現代開發請參考 POSIX (open, read, write)、ANSI C (stdio.h, stdlib.h) 或跨平台圖形庫 (SDL, OpenGL)。