- •1.1. Форматный ввод/вывод
- •1.2. Нефайловая работа с терминалом
- •1.3. Управление распределением динамической памяти
- •1.4. Работа со строками и символами
- •1.5. Средства отладки
- •5. Язык си. Руководство оператора.
- •5.1. Стадии подготовки программы
- •5.2. Проблемы промежуточных файлов
- •5.3. Эмуляция eis
- •5.5. Инициализация fpu
- •5.6. Форматный вывод чисел с плавающей запятой
- •5.7. Оптимизация
- •5.8. Компоновка
- •5.9. Создание автономных программ
- •5.10. Сообщения оператору
- •6.1. Ввод и обработка командной строки
- •6.2 Управление стартовыми действиями
- •7. Пакет работы с терминалом
- •7.1. Обновление экрана
- •7.2. Запуск
- •7.3. Вывод
- •7.4. Ввод
- •7.5. Завершение работы
- •7.6. Оптимизация движения курсора
- •9. Краткое описание компилятора си фирмы dec.
- •10. Перечень ошибок
7.1. Обновление экрана
Для того, чтобы оптимально обновлять терминал, процедурам необходимо знать, как в настоящее время выглядит терминал и каким желает его видеть пользователь. Для этого определяется тип данных (структура) типа WINDOW, который описывает образ окна для процедур, включая начальное положение на экране (координаты (y,x) верхнего левого угла) и его размер. Всегда заводится одна структура такого типа (называемая curscr). Она содержит информацию о том, как выглядит терминал в настоящее время. Все другие структуры этого типа являются внутренним представлением. Они используется для создания и хранения потенциального образа экрана терминала или части его и не имеют прямого отношения к тому, что действительно находится на экране.
Если у пользователя имеется окно, описывающее, как должна выглядеть некоторая часть терминала, то он может вызвать функцию refresh() (или wrefresh(), см. ниже). refresh() делает терминал в области, покрываемой окном, похожим на оное.
Отметим, что изменение окна не изменяет терминал. Обновление экрана терминала производится только вызовом refresh() или wrefresh(). Это позволяет пользователю поддерживать несколько различных вариантов части экрана терминала. Кроме того, можно изменять окна в любом порядке, не обращая внимания на эффективность выполнения изменений. После того, как пользователь задаст окончательный вид окна и вызовет refresh() пакет решит, какой способ изменения оптимальный и выполнит его.
Соглашения об именах функций
Как отмечено выше, функции могут работать с несколькими окнами, два из которых задаются автоматически. Это:
curscr
образ терминала; пользователь не должен непосредственно обращаться к
curscr.
stdscr
"стандартное окно" - экран, на котором, как правило, ведется основная
работа.
Вся работа с окнами осуществляется вызовами соответствующих функций, причем для работы со стандартным экраном (stdscr) существует специальный набор функций (реализованных как макрообращения к соответствующим функциям общего вида), для которых ненужно указывать имя окна. Например, чтобы добавить символ 'c' к некоторому окну "win" необходимо использовать функцию waddch(win,c), но к stdscr символ 'c' можно добавить вызвав addch(c).
В общем случае, если функции применяются не для stdscr, к имени функции добавляется буква 'w' (слева), и первым параметром этой функции должен быть описатель окна. К именам процедур, для которых всегда необходимо явно указывать окно, никогда не добавляется 'w'.
Изменение текущих координат (y,x) в окне обеспечивается функциями move() и wmove(). Однако частым является случай, когда сначала необходимо выполнить движение, а затем сразу же ввод или вывод. Поэтому, для удобства, перед большинством функций, выполняющих ввод/вывод, может ставится префикс "mv" и необходимые координаты (y,x) могут быть добавлены к аргументам функций:
move (y,x);
addch (ch);
можно заменить на
mvaddch (y,x,ch);
,а
wmove (win,y,x);
waddch (win,ch);
можно заменить на
mvwaddch (win,y,x,ch);
Указатель описания окна (win) должен всегда стоять перед координатами (y,x).
Предполагается, что все действия выполняются с stdscr, однако все инструкции будут работать с любым окном при явном его указании (см. выше).
