-
Notifications
You must be signed in to change notification settings - Fork 0
2. Hello World !!!
Добро пожаловать в мир Curses
. Прежде чем мы погрузимся в библиотеку и
рассмотрим ее различные возможности, давайте напишем простую программу и
поздороваемся с миром.
Чтобы использовать функции библиотеки ncurses, вы должны включить ncurses.h
в
свои программы. Для компоновки программы с ncurses необходимо добавить флаг
-lncurses
.
#include <ncurses.h>
.
.
.
compile and link: gcc <program file> -lncurses
#include <ncurses.h>
int main()
{
initscr(); /* Запуск режима curses */
printw("Hello World !!!"); /* Печать Hello World */
refresh(); /* Вывести на реальный экран */
getch(); /* Ожидание ввода данных пользователем */
endwin(); /* Завершить режим curses */
return 0;
}
Приведенная выше программа печатает "Hello World !!!" на экран и завершает работу.
Эта программа показывает, как инициализировать curses
, выполнить манипуляции с
экраном и завершить режим curses
. Давайте разберем ее построчно.
Функция initscr()
инициализирует терминал в режиме curses
. В некоторых реализациях
она очищает экран и представляет пустой экран. Для выполнения любых манипуляций
с экраном с помощью пакета curses
необходимо сначала вызвать эту функцию. Эта
функция инициализирует систему curses и выделяет память для нашего текущего окна
(называемого stdscr
) и некоторых других структур данных. В экстремальных случаях эта
функция может не сработать из-за недостатка памяти для выделения памяти под
структуры данных библиотеки curses.
После этого мы можем выполнить различные инициализации для настройки
параметров curses
. Эти детали будут описаны позже.
Следующая строка printw
выводит на экран строку "Hello World !!!". Эта функция
аналогична обычной printf
во всех отношениях, за исключением того, что она печатает
данные в окне с именем stdscr
в текущих координатах (y
,x
). Поскольку наши текущие
координаты 0
,0
, строка печатается в левом углу окна.
Это подводит нас к загадочной функции refresh()
. Когда мы вызвали printw
, данные на
самом деле были записаны в воображаемое окно, которое еще не обновлено на
экране. Работа printw
заключается в обновлении нескольких флагов и структур данных
и записи данных в буфер, соответствующий stdscr
. Для того чтобы вывести его на
экран, нам нужно вызвать refresh()
и сказать системе curses вывести содержимое на
экран.
Философия всего этого заключается в том, чтобы позволить программисту выполнять
несколько обновлений на воображаемом экране или окнах и обновлять их после того,
как все обновления на экране завершены. refresh()
проверяет окно и обновляет только
ту часть, которая была изменена. Это повышает производительность и обеспечивает
большую гибкость. Но иногда это вызывает недовольство у новичков. Частой ошибкой
новичков является то, что они забывают вызвать refresh()
после того, как выполнили
обновление через класс функций printw()
. Я до сих пор иногда забываю ее добавить :-).
И, наконец, не забудьте завершить режим curses
. Иначе ваш терминал может вести
себя странно после завершения работы программы. endwin()
освобождает память,
занятую подсистемой curses
и ее структурами данных, и переводит терминал в
нормальный режим. Эта функция должна быть вызвана после завершения работы в
режиме curses
.
Перевод lomaster & oldteam