نوشتن hello world معروف با استفاده از ncurses :
#include <ncurses.h>
int main()
{
initscr();
refresh();
printw("Hello world!!!!\n");
refresh();
getch();
endwin();
return 0;
}
خب الان کدای بالا رو تو یه ادیتور بنویسید و با پسوتد c. ذخیره کنید(البته پسوند اصلا مهم نیست)
مثلا من اسمشو hello.c گذاشتم و حتما باید اینجوری کامپایلش کنم:
gcc -o hello hello.c -lncurses
تو قسمت کامپایل تنها چیزی که مهمه lncurses- هست که به gcc میگه که باید بره یه جای دیگه دنبال کتابخانه ی ncurses بگرده و از مسیر مسیر پیشفرض نمیتونه پیداش کنه.
حالا نوبت اجرا رسیده:
./hello
اما هرکدوم از توابع بالا چه کاری انجام میدن؟
()initscr
این تابع یه بافر مخصوص برای ncurses میسازه و اونو در اختیار ما قرار میده تا برای کارامون به جای صفحه ی ترمینال ازش استفاده کنیم.یعنی درواقع برای ما یه صفحه ای مجازی شبیه ترمینال میسازه و مدیریت کامل اونو در اختیار ما قرار میده تا هرکاری که بخواییم با اون انجام بدیم و بعدا محتویات اونو روی ترمینال نمایش بدیم و نتیجه جوری باشه که انگار با خوده ترمینال کار کردیم.
این بافر روی رم سیستم تعبیه میشه و مث صفحه ای عمل میکنه که ما اونو نمیبینیم اما میتونیم داخلش بنویسیم و حتی کرسر رو به راحتی جابجا کنیم(کاری که بدون این صفحه ی مجازی و ncurses نمیتونیم انجام بدیم).
کسایی که تو ویندوز با c کار کرده باشن حتما کتابخانه ی conio رو میشناسن.اونجا توابعی مث ()getch() , gotoxy و ()clrscr رو دیدن و از کار کردن باهاشون لذت بردن اما متاسفانه این کتابخانه و توابع در standard C وجود ندارن و در واقع اون کتابخانه ی conio محصول بورلتده که برای کاربرا نوشته و در لینوکس چنین چیزی نداریم.
()refresh
این توابع وظیفه ی نوشتن بافر را بر روی ترمینال به عهده دارد.اما چون اینجا فعلا ما چیزی داخل بافر ننویشیم پس نقش ()clrscr رو تو ویندوز ایفا میکنه.اما بعدا برای مقاصد مهم تری هم ازش استفاده میکنیم.
اینجا اگه این خط رو هم ننویسید مشکلی پیش نمیاد اما همیشه قشنگتر اینه که همون اول کار بافر رو بیارید بریزید تو ترمینال تا کارتون استاندارد باشه.
()printw
این تابع بر روی window مجازی ما مینویسه!
پس هر رشته ای که ما بهش بدیم رو میره تو بافر و بر روی پنجره ی مجازی مینویسه.اینجا دقت کنین که ما هنوز چیزی رو تو ترمینال ننویشتیم بلکه رشته ی ما داخل بافر که مستقل از پنجره ی ترمیناله قرار گرفته.
()refresh
حالا وقت اینه که بافر رو بیاریم بریزیم تو پنجره ی ترمینال!
پس با این کار ما رشته مون رو روی صفحه ی ترمینال چاپ میکنیم!
()getch
دیگه فک کنم همه این تابعو میشناسن مخصوصا ویندوز کارا!
این تابع منتظر گرفتن کلیدی از کاربر میشه و درواقع اجرای برنامه رو بلاک میکنه تا خط بعدی اجرا نشه.یعنی تا کابر یه کلید رو از صفحه کلید فشار نده برنامه همونجا میمونه و تکون نمیخوره
()endwin
خب الان دیگه کارمون با اون بافر و پنجره ی مجاز تموم شد چون هرچی لازم بود رو تو پنجره ی ترمینال نویشتیم و الان وقتشه که اون بافر رو از داخل رم سیستم پاک کنیم چون اگه همونجوری بمونه دردسر ساز میشه پس با این تابع گردنشو میزنیم و از رم میندازیمش بیرون.
خسته نباشید