рефераты

рефераты

 
 
рефераты рефераты

Меню

Реферат: Turbo C++ Programer`s guide рефераты

Требование дальних (far) вызовов

При компиляции оверлейного модуля выдолжны использовать большую модель памяти (medium, large или huge). При всяком вызове функции из оверлейного модуля вы обязаны гарантировать, что все активные в текущий момент функции являются дальними.

Вы обязаны компилировать все оверлейные модули сопцией- Y, что обеспечит оверлейную структуру генерируемого кода.

Важное замечание !

Невыполнение требования дальних вызовов в оверлейной программе приведет при выполнении программы к непредсказуемым и возможно, катастрофическим результатам.

Размер буфера

Размер оверлейного буфера по умолчанию в два раза превышает размер самого большого оверлея. Для большинства прикладных программ такое умолчание вполне адекватно. Одако же, представим себе ситуацию, когдакакая-либо функция программыреализована несколькими модулями, каждый из которых является оверлейным. Если общий размер этих модулей превышает размер оверлейного буфера, то если модули часто вызывют друг друга, это приведет к большому числу свопингов.

Очевидно, что решение здесь заключается в увеличении размера оверлейного буфера до таких размеров, чтобы в любой момент времени в нем помещались все часто вызывающие друг друга оверлеи. Это можно сделать, установив через глобальную переменную _ovrbuffer требуемый размер в параграфах. Например, для установки размера оверлейного буфера равным 128К, включите вваш код следующий оператор:

unsigned _ovrbuffer = 0x2000;

Общей формулы для определения идеального размера оверлейного буфера не существует. Turbo Prifiler фирмы Borland поможет определить необходимое значение. Если вы не располагаете данным продуктом, то найти размер буфера вам поможет понимание прикладной задачи и немного зкспериментирования.

В каких случаях не следует создавать оверлейные структуры

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

Программа управления оверлеями Turbo C++ полностью поддерживаетпередачу оверлейныхфункций какаргументов, присвоение иинциализацию переменных типауказателя функции, адресующих оверлейные функции, а также вызов оверлейных подпрограмм через указатели функций.

Отладка оверлеев

Большинство отладчиков либо имеет весьма ограниченные средства отладки программ с оверлейной структурой, либо вообще не имеет таких средств. Иначе дело обстоит синтегрированным со средой разработки отладчиком TurboC++ и отладчиком автономным отладчиком Turbo Debugger. Обаэти отладчика полностью поддерживают пошаговую отладку и установку точек прерывания в оверлеях совершенно прозрачным длявас способом. Благодаря использованию оверлеев вы имеете возможность легко разрабатывать и отлаживать громоздкие прикладные программы - как в интегрированной среде, так и при помощи Turbo Debugger.

Внешние (external) подпрограммы в оверлеях

Подобно обычнымфункциям С, внешние (external) подпрограммы на языке ассемблера должны подчиняться некоторым правилам, чтобы хорошо работать с программой управления оверлеями.

Если подпрограмма на языке ассемблера выполняет вызов любой оверлейной функции, то такая подпрограмма должна иметь объявление FAR и должна устанавливать стековый фрейм при помощи регистра BP. Например, если OtherFunc это оверлейная функция в другом модуле, и ее вызывает подпрограмма на языке ассемблера ExternFunc, то тогда ExternFunc должна быть FARи устанавливать стековый фрейм, как показано ниже:

ExternFunc PROC FAR push bp ;сохранить bp

mov          bp,sp  ;установить стековый фрейм

sub           sp,LocalSize   ;распределить локальные переменные

...

call   OtherFunc  ;вызов другого оверлейного модуля

...

mov          sp,bp  ;освобождение локальных переменных

pop           bp  ;восстановление BP

RET   ;возврат

ExternFunc   ENDP

где LocalSize - это размер локальных переменных. Если LocalSize равен нулю, вы можете опустить две строки, распределения и освобождения локальных переменных, но ни в коем случае нельзя опускать установку стекового фрейма BP, даже если аргументов и переменных в стеке нет.

Эти требования остаются теми же в случае, когда TxternFunc делает косвенные ссылки наоверлейные функции. Например, если OtherFunc вызывает оверлейные функции, носама не является оверлейной, то ExternFuncдолжнабыть FAR и также должна устанавливать стековый фрейм.

В случае, когда яссемблерная подпрограмма не делает ни прямых, ни косвенных ссылок на оверлейные функции, то специальные требования отсутствуют; подпрограмма на языке ассемблера может быть объявлена как NEAR. Она не обязана устанавливать стековый фрейм.

Оверлейные подпрограммына языке ассемблеране должны создавать переменные в кодовом сегменте, поскольку все изменения, внесенные в оверлейный кодовый сегмент, теряются при освобождении оверлея. Подобним же образом, указатели объектов, расположенных в оверлейных сегментах,не сохраняют достоверность после вызова других оверлеев, поскольку программа управления оверлеями свободно перемещает и освобождает оверлейные кодовые сегменты в памяти.

Свопинг

Если в системекомпьютера установлена дополнительная или расширенная память, вы можете сообщить программе управления оверлеев, что тот должен использовать ее при свопинге. В этом случае при удалении модуля из оверлейного буфера (когда туда требуется загрузитьновый модуль,а буфер полон) программа управления оверлеямиможет поместить удаляемый модуль вэту память. При любой последующей загрузке этого модуля экономится время за счеттого, что модуль перемещается в памяти, а не считывается с диска.

В обоихслучаях есть две возможности: программа управления оверлеями может либо обнаруживать наличиедополнительнойили расширенной памяти самостоятельно и затем брать на себя управление этой памятью, либо использовать уже обнаруженную и распределенную часть такой памяти. В случае расширенной памяти обнаружение памяти не во всех случаях выполняется удачно, поскольку многие программы кэширования памяти и программы организации виртуального диска могут использовать эту память, не делая об этом никаких отметок. Чтобы избежать этих проблем, выдолжнысообщить программе управления оверлеями начальный адрес расширенной памяти и какой участок ее можно безопасно использовать.

Дополнительная память (EMS)

Свопинг с дополнительной памятью инициализируется функцией _OvrInitEms. Вот ее прототип:

extern int far _OvrInitEms

(*

unsigned emsHandle,

unsigned emsFirst,

unsigned emsPages

*)

_OvrInitEms и _OvrinitExt определены в dos.h

Если параметр emsHandleравен нулю, программа управления оверлеями проверяет наличие дополнительной памяти и распределяет ее количество (если может), достаточное для размещения там всех оверлеев, минус размер оверлейногобуфера. В противном случае emsHandle должен быть допустимым логическим номером EMS, emsFirst - первой используемой EMS страницей, а emsPages - числом доступных программе управления оверлеями страниц. Если дополнительная память доступна, то данная функция возвращает 0.

Расширенная память (Ext)

Свопингс расширеннойпамятью инициализируется функцией _ OvrinitExt). Вот ее прототип:

extern int far -OvrininExt

(*

unsigned long extStart,

unsigned long extLength

*);

Если параметр extStart равен нулю, то программа управления оверлеями проверяет наличие расширенной памяти. Если это возможно, то для свопинга отводится ее участок, равный сумме всех оверлеев, минус размер оверлейного буфера. Впротивном случае extStart содержит начало для использования расширенной памяти, с extLength байт, доступных для использования программой управления оверлеями. Если extLength равна нулю, то программа управления оверлеями может использовать всю расширеннуюпамятьс адресами, старшимичем extStart. Данная функция возвращает 0, если расширенная память доступна. _OvrinitExt определена в dos.h.

Важное замечание !

Использование расширенной памяти не стандартизовано. Хотя программа управленияоверлеями и пробует применить все известные методы для определения размера ужеиспользованнойрасширенной памяти, эту функцию следует применять осторожно. Например, если у вас в системе установлена программа кэширования жесткого диска, использующая 2 Мб оперативной памяти (и расширенной памяти в том числе), то можно заставить программу управления оверлеями занять остальную часть расширенной памяти при помощи вызова:

if (_OvrinitExt (1024L * (2048 + 1024), OL))

puts ("Доступная расширенная память для свопинга оверлеев отсутствует");

Глава 5              Видео функции

Turbo C++ поставляетсяс полной библиотекойграфических функций, позволяющих создание экранных графиков и диаграмм. Данная глава содержит краткое описание видео режимов и окон. Затем объясняется,как программировать в текстовом играфическом режимах.

Видео функцииTurboC++ аналогичны соответствующим подпрограммамв Turbo Pascal. Если вы не знакомы с методами управления экранными режимами вашего PC или создания и управления окнами и графическими окнами, потратьте несколько минут и прочтите краткое изложение этих вопросов.

Несколько слов о видео режимах

Ваш компьютер обязательно имеет некоторый видео адаптер. Это может быть Монохромный дисплейный адаптер (MDA) для базового (только текстового) дисплея, либо это может быть графический адаптер, например Цветной графическийадаптер (CGA), Улучшенный графический адаптер (EGA), либо монохромный графический адаптер Hercules. Каждый из этих адаптеров может работать в нескольких режимах; режим определяет величину экрана - 80 или 40 символов в строке (только в текстовом режиме), разрешающую способность экрана (только в графическом режиме) и тип дисплея (цветнойили черно-белый).

Рабочий режим экрана определяется, когда ваша программа вызывает одну из функций определения режима (textmode, Initgraph или setgraphmode).

- В текстовом режиме экран компьютера разделен на ячейки (80 или 40 столбцов в ширину и 25, 42 или 50 строк по высоте). Каждая ячейка состоит из аттрибута и символа . Символ представляет собой имеющий графическое отображение ASCII-символ, а аттрибут задает, каким образом данный символ будет выведен на экран (его цвет, яркость, и т.д.). Turbo C+ + предоставляет полный набор подпрограмм для манипулирования текстовым экраном, для вывода текста непосредственно на экран и управления аттрибутами ячеек.

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

В текстовом режиме позиция верхнего левого угла экрана определяетсякоординатами (1,1),где x-координата растет слева -направо, а y-координата растет сверху-вниз. В графическом режиме позиция верхнего левого угла определяется координатами (0,0), с теми же направления возрастания координат.

Несколько слов о текстовых и графических окнах

Turbo C++ обеспечивает функции для создания окон и управления ими в текстовом режиме (и графических окон в графическом режиме). Если вы не знакомыс текстовыми и графическими окнами, ознакомьтесь со следующим кратким их изложением. Функции Turbo C++, позволяющие управлять текстовыми и графическими окнами, описаны нижев разделах "Программирование в текстовом режиме" и "Программирование в графическом режиме".

Что такое окно ?

Окно представляет                  собой            прямоуголтную              область,

определенную на видео экране вашего PC, когда он находится в

текстовом  режиме.  Когда  ваша программа выполняет вывод на

экран, то область вывода будетв таком случае ограничена активным окном. Остальная часть экрана (вне окна) остается бе изменений.

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

Что такое графическое окно ?

В графическом режиме вы также можете определить некоторую прямоугольнуюобласть экрана PC; эта область называется графическим окном. Когда ваша графическаяпрограмма выполняет вывод рисунков и т.д., графическое окно действует каквиртуальный экран. Остальная часть экрана (вне графического окна) остается без изменений. Определить графическое окно можно через экранные координаты, вызвав функцию setviewport.

Координаты

За исключением функций определения текстовых играфических окон,все остальныефункции, как текстового, так и графического режимов, даются в локальных координатах активного текстовогоили графческого окна, а не в абсолютных экранных координатах. При этом верхний левый угол текстового окна будет являться началом координат (1,1); в графическомрежиме начало координат графического окна будет равно (0,0).

Программирование в текстовом режиме

В данном разделе приводится краткоеизложение функций, используемых в текстовом режиме. Более подробную информацию об этих функциях см. в Главе 1, "Библиотека исполняющей системы" В

Справочнике по библиотеке.

В Turbo C++ пакет функций прямого ввода/выводана консоль (cprintf, cputs и т.д.) обеспечивает высококачественный вывод текста, управление окнами, позиционирование курсора и управление аттрибутами видео изображений. Всеэти функции являются частью стандартных библиотек Turbo C++; они имеютпрототипы в файле заголовка conio.h.

Функции консольного ввода/вывода

Функции текстового режима TUrbo C++ работают в любом из шести возможных текстовых видео режимов.Режимы, доступные в вашей системе, зависят от типа видео адаптера и монитора системы. Текущий текстовый режим задается вызовом textmode. Мы объясним, как использовать эту функцию, ниже в данной главе, и кроме того, она описана в Главе 1 Справочника по библиотеке.

Функции текстового режима делятся на четыре отдельные группы:

- вывода и манипулирование текстом

- управления окнами и режимом

- управления аттрибутами

- запроса состояния

Эти четыре группыфункций длятекстового режима рассматриваются в следующих четырех разделах:

Вывод и манипулирование текстом

Ниже перечислены функции вывода и манипулирования текстом в текстовом режиме:

Запись и чтение текста:

cprintfПосылает на экран форматированный вывод.

cputsПосылает на экран строку.

getcheСчитывает символ с эхо-отображением его на экране

putchПосылает на экран отдельный символ.

Манипулирование текстом (и курсором) на экране:

clreolСтирание от курсора до конца строки.

clrscrСтирание текстового окна.

dellineУдаление текущей строки курсора.

gotoxyПозиционирование курсора.

InslineВставка пустой строки под текущей позицией курсора.

movetextКопирование текста из одной области экрана на другую.

Пересылка блоков текста между памятью и экраном:

gettextКопирование текста из области экрана в память.

puttextКопирование текста из памяти в область экрана.

По умолчанию ваши программы экранного вывода работают с полноэкранным текстовым окном, поэтому вы можете в них сразу же начинать писать, читать и манипулировать текстом без каких-либо предварительных установок режима. Записьтекста на экран выполняется при помощи консольных функций прямого вывода cprintf, cputs и putch, а ввод с консоли с эхо-отображением символовнаа экране выполняется функцией getche. Циклический переход текста по экрану определяется глобальной переменной -wscroll. Если _wscroll равна1, тотекст при достиженииконца строки переходит на следующую строку экрана, причем при необходимостивыполняется вертикальный скроллинг. Если _wscroll равен 0, то текст переходит на ту же самую строку, и скроллинг невыполняется. По умолчанию _wscroll равна 1.

После того, как ваш текст выведен на экран, вы можете стереть активное окно при помощи clrscr, либо стереть часть строки от текущей позиции курсора при помощи clreol, либо удальть целую строку при помощи delline, либо вставить пустую строку при помощи insline. Трипоследние функции работают относительно текущей позиции курсора; перемещение курсора в желаемую позицию выполняется при помощи gotoxy. Вы можете также скопировать целый блок текста из одной прямоугольной области в другую при помощи movetext.

Имеется также функция копирования прямоугольной области текста с экрана в память gettext и обратная функция копирования текста из памяти на экран (в любую позицию) puttext.

Управление окнами и режимом

Существует две функции управления окнами и режимом:

textmode   Устанавливает текстовый режим экрана.

window             Определяет окно текстового режима.

Функция textmode позволяет устанавливать для экрана один из нескольких текстовыхвидео режимов(эта возможность ограничена только типами монитора и адапрера, установленных в вашей системе. Функция инициализирует экран как полноэкранное текстовое окно в конкретном заданном режиме и очищает экран от любых оставщихся на нем текстов или изображений.

Когда экран находится в текстовом режиме, вы можете выполнять полноэкранныйвывод на него, либоустановить для вывода часть экрана - окно- в которое ваша программаи будет выполнять дальнейший вывод текста. Для создания текстового окна следует вызвать функцию window, задав область на экране, которую это окно будет занимать.

Управление аттрибутами

Ниже кратко перечислены функции управления аттрибутами видео изображений в текстовом режиме:

Установка аттрибутов переднего плана и фона:

textattr                 Одновременная установка (аттрибутов) цветоа

переднего плана и фона.

textbackground  Установка (аттрибута) цвета фона.

textcolor                 Установка (аттрибута) цвета переднего плана.

Модификация яркости:

highvideo               Установка повышенной яркости текста.

lowvideo              Установка низкой яркости текста.

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40