當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 從Hello World 程序開始
從Hello World 程序開始
歡迎來到ncurses 的世界。在我們踏上學(xué)習(xí)ncurses 的路途之前,讓我們先寫一個(gè)小程序,來了解一下應(yīng)用ncurses 庫(kù)所編寫程序的結(jié)構(gòu)。
編譯包含NCURSES 庫(kù)函數(shù)的程序
如果要調(diào)用ncurses 庫(kù)中的函數(shù),你必須在代碼中加載ncurses.h 文件,就是要在C 或C++
程序開頭添加“#include <ncurses.h>”,然后在鏈接時(shí)標(biāo)記-lncurses參數(shù)。如果ncurses 庫(kù)不存在,可以按以下方法安裝:
sudo apt-get install libncurses5-dev
例1:Hello World !!!程序
#include <ncurses.h>
int main()
{
initscr(); /* 初始化,進(jìn)入NCURSES 模式*/
printw("Hello world!!!"); /* 在虛擬屏幕上打印Hello, World!!! */
refresh();/* 將虛擬屏幕上的內(nèi)容寫到顯示器上,并刷新*/
getch();/* 等待用戶輸入*/
endwin();/* 退出NCURSES 模式*/
return 0;
}
編譯:gcc -o helloword helloword.c -lncurses
運(yùn)行:./helloword
示例剖析
這個(gè)程序在顯示器屏幕上打印“Hello World !!!”后等待用戶按任意鍵退出。這個(gè)小程序展示了如何初始化并進(jìn)入curses 模式、處理屏幕和退出curses 模式。讓我們逐行的分析這個(gè)小程序:
關(guān)于initscr() 函數(shù)
initscr()函數(shù)將終端屏幕初始化為curses 模式。它用來清除屏幕上所有的字符,并等待下一部處理。所以在調(diào)用其它的curses 函數(shù)前,要先調(diào)用initscr()函數(shù)初始化屏幕。這個(gè)函數(shù)初始化了curses 系統(tǒng)并且為當(dāng)前屏幕(也就是“stdscr”)和相關(guān)的數(shù)據(jù)結(jié)構(gòu)分配內(nèi)存。
在以前的計(jì)算機(jī)上曾經(jīng)出現(xiàn)過一個(gè)極端的例子:因?yàn)橄到y(tǒng)中的可用內(nèi)存太小,以至于initscr()函數(shù)無(wú)法分配足夠的內(nèi)存給相關(guān)的數(shù)據(jù)結(jié)構(gòu),從而導(dǎo)致curses 系統(tǒng)初始化失敗。在以后的章節(jié)中我們將介紹如何定制屏幕的初始化模式。
神秘的refresh() 函數(shù)
第二行的printw()函數(shù)用于把字符串“Hello,World!!!”輸出到虛擬的屏幕上。這個(gè)函數(shù)在用法上和printf()函數(shù)很像。不同的是:printw()函數(shù)把字符串輸出到“stdscr”的虛擬窗口坐標(biāo)(0,0)上(從顯示的結(jié)果來看,坐標(biāo)(0,0)在屏幕的左上角上)。
現(xiàn)在該說說這個(gè)神秘的refresh()函數(shù)了。在我們使用printw 函數(shù)打印“Hello World!!!”時(shí),實(shí)際上這個(gè)消息打印到了一個(gè)叫作“stdscr”的虛擬窗口上,沒有被直接輸出到屏幕上。printw()函數(shù)的作用是不斷將一些顯示標(biāo)記和相關(guān)的數(shù)據(jù)結(jié)構(gòu)寫在虛擬顯示器上,并將這些數(shù)據(jù)寫入stdscr 的緩沖區(qū)內(nèi)。為了顯示這些緩沖區(qū)中的數(shù)據(jù)我們必須使用refresh()函數(shù)告訴curses系統(tǒng)將緩沖區(qū)的內(nèi)容輸出到屏幕上。
通過這種機(jī)制程序員能夠不斷在虛擬屏幕上寫數(shù)據(jù)。然后調(diào)用refresh()函數(shù)讓輸出的操作看起來是一次完成的。因?yàn)閞efresh()函數(shù)只核查窗口和數(shù)據(jù)中變動(dòng)的部分,這種富有彈性的設(shè)計(jì)提供了一個(gè)高效的反饋機(jī)制。但是這有時(shí)很打擊初學(xué)者的積極性。因?yàn)閷?duì)于初學(xué)者來說忘記在輸出后調(diào)用refresh()函數(shù)是很惱人的錯(cuò)誤。不過不用擔(dān)心,很多人都會(huì)犯這樣的錯(cuò)誤。
關(guān)于endwin()函數(shù)
后,別忘了退出curses 模式。否則,在程序結(jié)束后你的終端可能會(huì)運(yùn)轉(zhuǎn)得不正常。endwin()函數(shù)釋放了curses 子系統(tǒng)和相關(guān)數(shù)據(jù)結(jié)構(gòu)占用的內(nèi)存,使你能夠正常返回控制臺(tái)模式。這個(gè)函數(shù)必須是在你完成所有的curses 操作以后才可以調(diào)用。(譯者注:如果你在endwin()函數(shù)后再調(diào)用其它的curses 的函數(shù)。很顯然,那些語(yǔ)句不會(huì)執(zhí)行。)說到這里,順便提醒一下。如果你的程序不能正常地顯示東西了。請(qǐng)務(wù)必看看initscr()函數(shù)和endwin()函數(shù)是不是在不該被調(diào)用的地方調(diào)用了。