Язык программирования C++ для профессионалов

       

Монитор экрана


Вначале было желание написать монитор экрана на С, чтобы еще больше подчеркнуть разделение между уровнями реализации. Но это оказалось утомительным, и поэтому выбрано компромиссное решение: стиль программирования, принятый в С (нет функций-членов, виртуальных функций, пользовательских операций и т.д.), но используются конструкторы, параметры функций полностью описываются и проверяются и т.д. Этот монитор очень напоминает программу на С, которую модифицировали, чтобы воспользоваться возможностями С++, но полностью переделывать не стали.

Экран представлен как двумерный массив символов и управляется функциями put_point() и put_line(). В них для связи с экраном используется структура point:

// файл screen.h

const int XMAX=40; const int YMAX=24;

struct point { int x, y; point() { } point(int a,int b) { x=a; y=b; } };

extern void put_point(int a, int b); inline void put_point(point p) { put_point(p.x,p.y); }

extern void put_line(int, int, int, int); extern void put_line(point a, point b) { put_line(a.x,a.y,b.x,b.y); }

extern void screen_init(); extern void screen_destroy(); extern void screen_refresh(); extern void screen_clear();

#include <iostream.h>

До вызова функций, выдающих изображение на экран (put_...), необходимо обратиться к функции инициализации экрана screen_init(). Изменения в структуре данных, описывающей экран, станут видимы на нем только после вызова функции обновления экрана screen_refresh(). Читатель может убедиться, что обновление экрана происходит просто с помощью копирования новых значений в массив, представляющий экран. Приведем функции и определения данных для управления экраном:

#include "screen.h" #include <stream.h>

enum color { black='*', white=' ' };

char screen[XMAX] [YMAX];

void screen_init() { for (int y=0; y<YMAX; y++) for (int x=0; x<XMAX; x++) screen[x] [y] = white; }

Функция

void screen_destroy() { }

приведена просто для полноты картины. В реальных системах обычно нужны подобные функции уничтожения объекта.

Точки записываются, только если они попадают на экран:



Содержание раздела