Четвертый Borland C++ и его окружение

         

Подготовка программ для отладки


Когда вы выполняете компиляцию и компоновку с помощью одного

из языков фирмы Borland, вам следует указать компилятору, что

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

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

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

оптимизированных компилятором.

При компиляции из интегрированной среды для включения в файлы .OBJ отладочной информации выберите команду Options Project

(для вывода блокноте Style Sheet), в блоке списка Topic выберите

Compiler Debugging и включите в OBJs кнопку с независимой фиксацией Debug. Чтобы включить отладочную информацию в выполняемые

файлы, выберите команду Options Project, затем команду Linker General в блоке списка Topic. Выводятся кнопки с независимой фиксацией General. Включите кнопку Debug Information.

При компиляции программ с использованием компилятора режима

командной строки используйте для включения отладочной информации

директиву компилятора -v.

После полной отладки программы вы можете скомпилировать и

скомпоновать ее заново с оптимизацией и исключением отладочной

информации.



Подпрограммы управления палитрой в случае CGA


Поскольку палитра CGA является предопределенной, подпрограмму setallpalette использовать в данном случае нельзя. Также не

следует использовать setpalette(индекс, фактический_цвет), за исключением индекс=0. (Это альтернативный способ установки фонового



цвета CGA равным фактическому цвету)



Подпрограммы управления памятью


Эти подпрограммы обеспечивают динамическое распределение памяти для моделей данных small и large.

allocmem (dos.h) coreleft (alloc.h,

stdlib.h)

_dos_freemem (alloc.h, stdlib.h) _dos_allocmem (dos.h)
brk (alloc.h) farheapchecknode (alloc.h)
_dos_setblock (dos.h) farheapfree (alloc.h)
farcoreleft (alloc.h) farheapwalk (alloc.h)
farheapcheck (alloc.h) farrealloc (alloc.h)
farheapcheckfree (alloc.h) sbrk (alloc.h)



Подробная информация об окне


Двойное нажатие кнопки "мыши" или нажатие клавиши Enter на

элементе дерева окон приводит к выводу окна Window Detail (Подробная информация об окне), в котором кроме информации о классе окна показана полная информация об окне.



Подстановки с помощью макрокоманд


Используя специальный формат вызова макрокоманды, вы можете

вызвать макрокоманду, изменив ее текст. Вместо стандартной формы

вызова используйте следующую:

$(имя_макрокоманды:текст_1=текст_2)

При использовании такой формы вызова каждое вхождение в макрокоманду "текста_1" будет заменяться "текстом_2". "Имя_макрокоманды'" может быть одной из предопределенных макрокоманд. Это полезно использовать, если вы предпочитаете использовать в

макрокоманде один список файлов.В приведенном ниже примере макрокоманда SOURCE содержит список файлов C++, от которых зависит целевой файл. Командная строка TLINK изменяет все расширения .CPP

на соответствующие расширения .OBJ объектных файлов и компонует

их.

SOURCE = f1.cpp f2.cpp f3.cpp

myapp.exe: $(SOURCE)

bcc -c $(SOURCE)

tlink c0s $(SOURCE:.cpp=.obj),myapp,,cs

Между : и = не нужно включать лишних пробелов. Если после

двоеточия указывается пробел, MAKE будет пытаться найти строку,

включающую предшествующий пробел.



Поиск информации о событии


Стандартный способ интерпретации возвращаемой событием информации можно найти в документации по управляющему элементу VBX.

TVbxControl предусматривает ряд методов для получения информации

о событии.

Вы можете определить общее число событий, которые посылает

управляющий элемент VBX, с помощью функции GetNumEvents. События

индексируются начиная с 0.

Получить имя любого события в данном диапазоне вы можете с

помощью функции-элемента TVbxControl GetEventName, которая имеет

один параметр (индекс) и возвращает строку с именем события. Индекс события по его имени можно получить с помощью GetEventIndex.



Поиск окна


Утилита WinSight имеет специальный режим для поиска окон.

Она может работать двумя способами: идентифицируя строку в области дерева, соответствующую окну, на которое вы указываете, или

подсвечивая окно, выбираемое вами в дереве окон.

В любом случае режим поиска окна Find Window задается путем

выбора команды Spy Find Window. В данном режиме, когда "мышь" попадает на границы окна, вокруг окна появляется жирная рамка, и

окно в области дерева окон становится выделенным. Когда вы находитесь в режиме Find Window, все другие прикладных программы приостанавливаются.

Либо, находясь в режиме поиска окна, вы можете с помощью

"мыши" или клавиш управления курсором выбрать окно в области дерева окон, и утилита WinSight изобразит жирную рамку вокруг выбранного окна (или окон).



Полиморфизм


В переводе с греческого polymorphos - многообразный. Если один и

тот же объект может по-разному использоваться, в зависимости от

обстоятельств, то он обладает полиморфизмом. В какой-то степени

свойствами полиморфизма обладают, например, автомобили-амфибии -

используются для передвижения и по суше, и по воде. Чтобы достичь таких "чудес" в ООП используют "ранее" и "позднее связывание".

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


Например, как функция элемент draw():

rectangle.draw(); jigsaw.draw();



Полосы прокрутки


Полосы прокрутки - это основной механизм изменения пользовательского отображаемого элемента в окне приложения, блока списка

или комбинированного блока. Однако для выполнения специальной задачи вы можете построить отдельную полосу прокрутки. Для этого

используются объекты TScrollBar. Примеры вы можете найти в подкаталоге EXAMPLES\OWL\OWLAPI\SCROLLER.

Конструктор TScrollBar имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, и

также необязательный идентификатор библиотеки), а также параметр

флага, определяющий, является ли полоса прокрутки горизонтальной.

Если вы задаете нулевую высоту или ширину полосы прокрутки, то

Windows устанавливает стандартные ширину или высоту.

Конструктор TScrollBar строит полосы прокрутки со стилем

SBS_HORZ (горизонтальная) или SBS_VERT (вертикальная полоса). С

помощью Attr.Style объектов полосы прокрутки вы можете задать дополнительные стили.



Получение кода без операций с плавающей точкой


При отсутствии в программе операций с плавающей точкой вы

можете сэкономить немного времени компиляции, выбрав значение параметра генерации операций с плавающей точкой None ("отсутствуют") (или параметр компилятора командной строки -f-). Тогда Borland C++ не будет выполнять компоновку ни с библиотекой

EMU.LIB, ни с FP87.LIB, ни с MATHx.LIB.



Получение справочной информации


Turbo Debugger предлагает несколько способов получения в ходе отладки справочной информации. - С помощью клавиши F1 вы можете получить доступ к развитой контекстной справочной системе. По

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

Индикатор активности в левом правом углу экрана всегда показывает текущее состояние. Например, если курсор находится в окне,

в индикаторе активности выводится READY. Если выводится меню, в

нем указывается MENU, а если вы находитесь в диалоговом окне PROMPT. Если вы, запутаетесь и не можете понять, что происходит в

отладчике, взгляните на индикатор активности.

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

клавиши Alt или Ctrl данная строка изменяется. Когда вы находитесь в системе меню, эта строка предлагает вам оперативное описание текущей команды меню.



Последовательность поиска файлов в каталогах


При поиске библиотечных и включаемых файлов Borland С++ использует следующий алгоритм.

Если в исходный файл включен оператор #include <file.h>,

то Borland С++ ищет указанный в нем файл только в заданном

каталоге включаемых файлов (заголовков или библиотечных

файлов).

С другой стороны, если в программе содержится оператор

#include "file.h.", то Borland С++ ищет этот файла сначала

в текущем каталоге, а затем в каталогах включаемых файлов,

заданных в командной строке.

Неявные библиотеки Borland С++ ищет только в заданных библиотечных каталогах. Неявные библиотеки - это такие библиотеки, которые Borland С++ компонует автоматически, и объектный файл запуска (C0x.OBJ). Поиск Borland С++ явных библиотек зависит от того, как указано имя библиотечного файла. Явные библиотеки имеют

расширение .LIB. Если библиотека указывается без диска и каталога, то Borland С++ ищет ее сначала в текущем каталоге, а затем в

заданных библиотечных каталогах.

Построение приложений с помощью AppExpert

Использование AppExpert

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

Параметры приложения

Базовые параметры

Продвинутые параметры

Параметры генерации кода

Параметры идентификационной информации

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

Базовые параметры

Параметры клиентной области однодокументального интерфейса

Параметры клиентной области многодокументального интерфейса

Параметры дочерних окон и отображаемых элементов MDI

Базовые параметры дочерних окон и отображаемых элементов MDI



Построение администратора документа


Конструктор TDocManager имеет единственный параметр, который

используется для установки режима администратора документа:

Однодокументального интерфейса (SDI), в котором вы можете

каждый раз открывать только один документ. При открытии

нового документа администратор документа пытается закрыть

предыдущий документ.

Многодокументального интерфейса (MDI), где вы можете одновременно работать с несколькими документами и отображаемыми элементами или одним документом, представленным разными типами.

Чтобы открыть администратор документа в режиме SDI, нужно

вызвать конструктор с параметром dmSDI, а в режиме MDI - с параметром dmMDI. Другие параметры конструктора задает построение для

администратора документа собственное меню File, разрешают в меню

File команду Save даже если документ не изменен и запрещают в меню File команду Revert. После построения администратора документа

вы не можете изменить режим.



Построение части проекта


Часть проекта можно построить 3 способами:

Построением узла и зависимых от него узлов (выберите узел,

щелкните правой кнопкой "мыши" и выберите в SpeedMenu команду Build).

Для построения проекта с помощью MAKE выберите узел, который хотите построить, щелкните на узле правой кнопкой "мыши" и выберите в оперативном меню Make.

Для трансляции отдельного узла выберите узел, выберите команду Project Compile в основном меню или заданную по

умолчанию команду трансляции в SpeedMenu.



Построение и уничтожение объектов управляющих элементов


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

добавить в родительское окно элемент данных - указатель на

родительское окно;

вызвать конструктор объекта управляющего элемента;

изменить атрибуты управляющего элемент;

инициализировать управляющий элемент в SetupWindow.

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

групповые блоки), такой указатель не требуется.

Некоторым конструкторам управляющих элементов передаются параметры, определяющие характеристики объектов управляющих элементов. Это следующие параметры:

указатель на объект родительского окна;

идентификатор ресурса;

координаты x и y верхнего левого угла;

высота и ширина;

идентификатор библиотеки (не обязательно).

Существуют также конструкторы, связывающие объект управляющего элемента с интерфейсным элементом, созданными из определения

ресурса.

Все управляющие элементы получают используемые по умолчанию

стили окна WS_CHILD, WS_VISIBLE, WS_GROUP и WS_TABSTOP. Для изменения стиля управляющего элемента используется его Attr.Style.

Каждый тип управляющего элемента имеет также собственные стили,

определяющие его конкретные характеристики. Стили окна наследуются из базовых классов. С помощью операций |= и &= вы можете задать маску стиля.

Интерфейсный элемент управляющего объекта автоматически создается функцией-элементом SetupWindow, которая наследуется из

объекта родительского окна. Инициализировать управляющие элементы

в конструкторе объекта родительского окна нельзя, так как в этот

момент они еще не созданы.

Для вывода управляющих элементов на экране вызывать функцию

Show не нужно. Управляющие элементы - это дочерние окна, и Windows автоматические выводит и отображает их вместе с родительским

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

За уничтожение управляющих элементов отвечает родительское

окно - они уничтожаются вместе с этим окном.



Построение комбинированных блоков


Конструктор TComboBox имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, а

также необязательный идентификатор библиотеки), а также стиль и

максимальную длину текста.

Комбинированный блок имеет стили WS_CHILD, WS_VISIBLE,

WS_GROUP, WS_TABSTOP, CBS_SORT (для сортировки элементов списка),

CBS_AUTOHSCROLL (позволяет пользователю вводить больше текста,

чем помещается в видимой области редактирования) и WS_VSCROLL

(вертикальная полоса прокрутки). Параметр стиля определяет тип

комбинированного блока Windows и может задаваться как CBS_SIMPLE,

CBS_DROPDOWN или CBS_DROPDOWNLIST. Длина текста задает максимальное число символов, выводимых в области редактирования.



Построение объекта диалогового блока


Диалоговые блоки строятся и создаются с помощью ресурса диалогового блока. Для создания ресурсов диалоговых блоков и связывания их с приложением можно использовать Resource Workshop или

другой редактор ресурсов. Ресурс диалогового блока описывает

внешний вид и расположение управляющих элементов, таких как управляющие элементы, командные кнопки, блоки списков и т.д. Ресурс

диалогового блока не отвечает за его поведение. Поведение определяется приложением.

Каждый ресурс диалогового блока имеет идентификатор, который

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

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

Для построения объекта диалогового блока создайте его, используя указатель на родительское окно и идентификатор ресурса.

Родительское окно почти всегда задается как this. Можно также использовать основное окно приложения (это единственное окно, всегда присутствующее в приложении ObjectWindows). Исключением является ситуация, когда вы задаете объект диалогового блока как клиентное окно в конструкторе TFrameWindow. Конструктор передает

объект диалогового блока функции TFrameWindow::Init, которая автоматически устанавливает родительский объект диалогового блока.



Построение объектов декорированных окон-рамок


TDecoratedFrame имеет только один конструктор, почти идентичный конструктору TFrameWindow, за исключением одного параметра, который позволяет задать отслеживание команд меню. Если отслеживание разрешено, окно передает строку в строку состояния окна. Эта строка имеет то же имя ресурса, что и выбранный пункт меню.



Построение объектов меню


TMenu имеет несколько конструкторов, с помощью которых можно

создавать объекты меню из существующих окон или ресурсов меню.

После создания меню вы можете добавлять, удалять или модифицировать его с помощью функций-элементов TMemu.

Конструктор Описание

TMenu() Создает пустое меню.
TMenu(HWND) Создает объект меню, представляющий текущее меню окна.
TMenu(HMENU) Создает объект меню из уже загруженного меню.
TMenu(LPCVOID*) Создает объект меню из шаблона меню в памяти.
TMenu(HINSTANCE, TResID) Создает объект меню из ресурса.



Построение объектов TFrameWindow


Вы можете построить окно-рамку с помощью одного из двух

конструкторов TFrameWindow. Эти конструкторы позволяют создавать

новые окна-рамки с новыми интерфейсными элементами и связывать их

с существующими интерфейсными элементами. В параметрах первого

конструктора вы можете задать объект родительского окна, заголовок, клиентное окно, режим сжатия до размеров клиентного окна и

конструктор базового класса. Второй конструктор используется для

привязки существующего интерфейсного элемента к новому объекту

TFrameWindow, который называется псевдонимом существующего окна.

В его параметрах задается описатель окна существующего интерфейсного элемента и конструктор базового класса. Второй конструктор

устанавливает флаг wfAlias.



Построение оконных объектов


Оконные объекты представляют интерфейсные элементы. Объекты

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

данных HWindow, который наследуется из TWindow. Когда вы строите

оконный объект, интерфейсный элемент еще не существует. Вы должны

создать его на отдельном шаге. TWindow создает также конструктор,

который можно использовать в DLL для создания оконного объекта с

уже существующим интерфейсным элементом.

Некоторые классы ObjectWindows 2.0 (TDialog, TMDIFrame, TTinyCaption, TMDIChild, TDecoratedFrame, TLayoutWindow, TClipboardViewer, TKeyboardModeTracker и TFrameWindow) используют TWindow

или TFrameWindow в качестве виртуально базы. В C++ сначала строятся виртуальные базовые классы. Это означает, что конструктор

производного класса не может задавать для конструктора базового

класса аргументы, используемые по умолчанию. Решить эту проблему

можно двумя способами:

При построении производных классов явным образом построить

промежуточный базовый класс или классы и все виртуальные

базовые классы.

Используя заданный по умолчанию конструктор виртуального

базового класса. Такой конструктор имеют и TWindow, и

TFrameWindow. Они имеют также функцию Init, которая позволяет задать параметры для базового класса. Ее можно вызвать в конструкторе базового класса для задания параметров

базового класса.



Построение приложений MDI


Для построения приложения MDI в ObjectWindows выполните следующие шаги:

Создайте окно-рамку MDI.

Задайте нужное поведение клиентного окна MDI.

Создайте дочерние окна MDI.

Специфическое для MDI поведение реализуется классами

TMDIXxx, поэтому вы можете сосредоточиться на специфическом для

приложения поведения.

Окно-рамка MDI всегда является основным окном приложения,

так что вы можете построить его в функции-элементе InitMainWindow

объекта приложения. Окна-рамки MDI отличаются от других окон-рамок (обрамляющих окон) следующим:

Рамка MDI всегда является основным окном и не имеет родительского окна.

Рамка MDI должна иметь меню, поэтому для конструктора

TMDIFrame в качестве параметра задается идентификатор ресурса меню. В других окнах-рамках вы можете для установки меню вызывать AssignMenu.

Поскольку в качестве окна-рамки MDI обычно используется экземпляр TMDIFrame, вам нужно добавить к своим клиентным оконным

классам MDI специфическое для приложения поведение. Окно-рамка

является владельцем меню и комплектов инструментальных средств и

передает в клиентное окно и приложение генерируемые ими команды.

Для манипуляции с дочерними окнами MDI TMDIClient имеет несколько функций-элементов. Команды меню дочернего окна приложения

MDI управляют клиентными окнами. TMDIClient автоматически отвечает на эти команды и выполняет соответствующие действия, задавая

вывод окон с перекрытием или без, упорядочивая пиктограммы или

закрывая их. Команды меню определены в файле заголовка ресурса

mdi.rh. При построении меню в сценарии ресурса не забудьте включить этот файл.

Дочерние окна MDI не должны отвечать на команды меню какого-либо дочернего окна. Это делает клиентное окно MDI. Создать

дочерние окна MDI можно двумя способами: автоматически в TMDIClient::InitChild или в другом месте.

Назад | Содержание | Вперед



Построение приложений с помощью AppExpert


В данном разделе рассказывается, как с помощью AppExpert

создавать приложения на базе ObjectWindows 2.0. AppExpert работает с Resource Workshop, классами ObjectWindows 2.0. Это позволяет

использовать при генерации приложения визуальный подход. AppExpert позволяет создавать программы Windows с такими средствами

как оперативное меню SpeedBar, строка состояния, структура меню,

оперативный справочник, средство предварительного просмотра на

экране печатаемой информации и средства работы с документами.



Построение проекта


Для построения проекта следует:

Открыть проект с помощью команды Project Oрen Project.

Для построения всех узлов проекта выберите в основном меню

Project Build all. Для построения только измененных - Project Make.

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

дойдет до узла без зависимостей. Этот узел строится первым, а затем дерево обрабатывается в обратном направлении.



Построение TView


Непосредственно создать экземпляр TView нельзя. Этот класс

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

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

(объект, производный от TDocument).



Для построения приложения Win32 вы


Для построения приложения Win32 вы должны использовать соответствующие инструментальные средства, параметры, библиотеки и

код запуска. В следующей таблице перечислены параметры компилятора и компоновщика, библиотеки и код запуска, необходимые для компоновки и получения файлов .DLL и .EXE.

Параметры Параметры Библиотеки Код Создаваемый

BCC32 TLINK запуска файл

-W, -WE /Tpe cw32.lib c0w32.obj GUI.EXE

import32.lib

-WD, -WDE /Tpd cw32.lib c0x32.obj GUI.DLL

imprtw32.lib

-WC /Tpe/ap cx32.lib c0d32.obj Console.EXE

import32.lib

-WCD, -WCDE /Tpd/ap cx32.lib c0d32.obj Console.DLL

imprtw32.lib


Потоки ввода-вывода


Потоком ввода-вывода называется абстрактное понятие, относящееся

к любому переносу данных от источника (или поставщика данных) к приемнику (или потребителю) данных.

В Турбо и Borland C++ используется новый способ работы с потоками ввода-вывода, который заключается в использовании операций '>>' и

'<<'. Функции потоков сокращают время разработки программы, избавляя

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

Си Турбо и Borland C++

#include <stdio.h> #include <iostream.h>

main() main()

{ {

int k; int k;

printf("Введите число: "); cout << "Введите число: ";

scanf("%d", &k); cin >> k;

printf("Число: %d\n", k); cout << "Число: " << k;

} }

cout - стандартный выходной поток (по умолчанию - экран). Данные

(например, значения переменных и строки) посылаются в поток с помощью

операции <<. Операция << (читающаяся как "поместить в...") пересылает

данные справа от нее в поток слева.

cin - стандартный входной поток (обычно - клавиатура). Значения,

вводимые с клавиатуры, присваиваются переменным с помощью операции

>>. Использование операций >> и << для потоков ввода/вывода является

типичным примером переопределения операций в С++ (см. "Переопределение операций").

Кроме cout и cin в библиотеке iostream предопределены - cerr

(стандартное устройство для вывода сообщений об ошибках, соответствующее stderr в Си) и clog (полностью буферизованная версия cerr (в Си

эквивалента нет).

Реальное преимущество при работе с потоками С++ заключается в

той простоте, с какой можно переопределять операторы << и >> при работе с собственными типами данных. В C++ есть два класса, istream и

ostream, которые можно использовать для ввода в объекты и вывода из

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




struct clock { // Простая структура данных

int hr, min, sec;

clock( int h, int m, int s) { hr = h; min = m; sec = s; }

};

Для переопределения << для вывода объектов типа clock требуется

следующее определение:

Поток вывода из объекта и '<<'

v v v

ostream& operator<<(ostream& strm, clock& c)

{

strm << c.hr << ":" << c.min << ":" << c.sec;

} ^

Возможно повторное использование

операции

Заметим, что переопределенная операция << должна возвращать

ostream&, то есть ссылку на ostream, Теперь можно организовать вывод

для объектов типа clock следующим образом:

clock c(12,31,55);

cout << c;

Вывод на принтере будет следующим:

12:31:55

Дополнительную информацию о потоках ввода-вывода можно получить

в руководстве программиста Турбо и Borland C++. В нем дана детальная

информация: по библиотеке iostream (определенной в файле iostream.h);

о форматировании ввода и вывода; о манипуляторах потока; вводе-выводе

в файл; режимах открытия файла; строковой обработке потока, а также

всех классах потоков: filebuf, fstream, fstreambase, ifstream, ios,

iostream, iostream_withassign, istream, istream_withassign,

istrstream, ofstream, ostream, ostream_withassign, ostrstream,

streambuf, strstreambase, strstreambuf, strstream.


Потоковые классы С++


Библиотека потоковых классов в С++ состоит из нескольких

классов, распределенным по двум отдельным иерархическим деревьям.

Данный справочный материал содержит некоторые наиболее полезные

детали таких классов. Перечисляемые классы содержатся в различных

файлах заголовков:

Файл заголовка Классы

constrea.h conbuf, constream (только для приложений консольного режима).
iostream.h ios, iostream, iostream_withassign, istream,

istream_withassign, streambuf

fstream.h filebuf, fstream, ostream, strstream, strstre-

ambase, strstreambuf.



Потоковый ввод


Потоковый ввод аналогичен выводу, но использует переопределенную операцию сдвига вправо, >>, и называется операцией извлечения, или извлечением. Левый операнд операции >> представляет

собой объект типа класса istream. Как и для вывода, правый операнд может быть любого типа, для которого определен вывод потоком.

По умолчанию операция >> опускает пробельные символы (как

определено функцией isspace в ctype.h), а затем считывает символы, соответствующие типу объекта ввода. Пропуск пробельных символов управляется флагом ios::skipws в перечислимой переменной состояния. Флаг skipws обычно устанавливает пропуск пробельных

символов. Очистка этого флага (например, при помощи setf) выключает пропуск пробельных символов. Отметим также специальный манипулятор "приемника", ws, который позволяет игнорировать пробельные символы.

Рассмотрим следующий пример:

int i;

double d;

cin >> i >> d;

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

это клавиатура), преобразуются затем во внутренний двоичный формат и записываются в переменную i. Затем снова пропускаются пробельные символы, и наконец считывается число с плавающей точкой, которое преобразуется и записывается в переменную d.

Для типа char (signed или unsigned) действие операции >>

состоит в пропуске пробельных символов и записи следующего

(непробельного) символа. Если вам требуется прочесть следующий

символ, неважно, является ли он пробельным или нет, то можно использовать одну из функций-элементов get.

Для типа char* (рассматриваемого как строка) действие операции >> состоит в пропуске пробельных символов и записи следующих

(непробельных) символов до тех пор, пока не встретится следующий

пробельный символ. Затем добавляется завершающий нулевой (0) символ.

Назад | Содержание | Вперед



Потоковый вывод


Потоковый вывод выполняется с помощью операции включения <<.

Стандартная операция сдвига влево << для операций вывода переопределяется. Ее левый операнд - это объект типа ostream, а правый

операция может иметь любой тип, для которого определен потоковый

вывод (то есть основной тип или любой из переопределенных для него типа). Операция << ассоциируется слева направо и возвращает

ссылку на объект ostream, для которого она вызывается. Это позволяет выполнять каскад операций.



Позднее связывание с использованием виртуальных функций элементов


В случае переопределяемых функций компилятор умеет отличать один

вызов от другого по типу их аргументов. Используя эту информацию, он

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

другого, при наличии аргументов одного типа на этапе выполнения, и

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

Именно использование ключевого слова virtual приводит к отсрочке связывания, и вызову нужной функции на этапе выполнения.

Виртуальная функция элемент - это функция, которая будучи описана в потомках, замещает собой соответствующую функцию элемент везде -

даже в предке, если она вызывается для потомка. В отличии от раннего

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

Синтаксис определения виртуальных функций элементов очень прозрачный: добавьте слово virtual к первому определению функции элементу:

virtual void Show();

virtual void Hide();

Внимание! Только встроенные функции элементы могут быть объявлены как виртуальные. Как только функция объявлена виртуальной, она не

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

перечнем аргументов, но с другим типом возвращаемого значения. Если

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

Вы можете свободно переопределять Show с другим перечнем разнотипных аргументов (изменяя при этом тип возвращаемого значения или

нет), но виртуальный механизм не задействуется для такой версии Show.

Какая именно функция элемент Show будет вызвана - зависит только

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

Circle ACircle

Point* APoint_рointer = &ACircle; // указатель на Circle,

// которому присваивается

// значение указателя на

// базовый класс, Point

APoint_рointer->Show(); // вызывает Circle::Show!

Так как вызов невиртуальной функции-элемента выполняется несколько быстрее, чем виртуального, то в общем случае рекомендуется,

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

противном случае, нужно пользоваться виртуальными.



Предопределенные макрокоманды


Утилита MAKE содержит в себе несколько специальных встроенных макрокоманд: $d, $*, $<, $:, $. и $&. Первая из них осуществляет проверку на существование макрокоманды с заданным именем.

Он используется в директивах !if и !elif. Остальные представляют

собой макрокоманды имен файлов, используемые в явных и неявных

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

DOS (строки, которые можно просматривать и задавать в DOS с помощью команды SET). Наконец, в MAKE определяются несколько предопределенных макрокоманд, показанных ниже:



Предопределенные макрокоманды


Borland C++ имеет следующие предопределенные глобальные

идентификаторы. За исключением __cplusplus и _WINDOWS, каждый из

них и начинается, и заканчивается двумя символами подчеркивания

(__). Эти макрокоманды также называют именованными константами.

__BCOPT__

Эта макрокоманда определена (как строка "1") в любом компиляторе, имеющем оптимизатор.
__BCPLUSPLUS__

Эта макрокоманда специфична для семейства компиляторов

Borland Си и C++. Она определена только для компиляции с помощью

C++. Если вы выбрали компиляцию С++, то данная макрокоманда определена как шестнадцатиричная константа 0x0320. Это численное значение в последующих версиях будет увеличено.

__BORLANDC__

Эта макрокоманда специфична для семейства компиляторов

Borland Си и C++. Она определена как шестнадцатиричная константа

0x0400. Это численное значение в последующих версиях будет увеличено.

__CDECL__

Данная макрокоманда специфична для компилятоpов Borland Си и

C++. Она сообщает о том, что флаг соглашения по вызову языка Паскаль не использовались. Она устанавливается равной целочисленной

константе 1, если вызов не использовался; в противном случае она

не определена.

Следующие символические имена определяются согласно выбранной во время компиляции модели памяти:


__COMPACT__
__MEDIUM__


__HUGE__
__SMALL__


__LARGE__
__TINY__

Для конкретной компиляции определенным является только одна

из этих макрокоманд. Прочие по определению не определены. Например, если при компиляции выбрана малая модель памяти (small), то

макрокоманда __SMALL__ определена, а остальные не определены, поэтому директива:

#if defined(__SMALL__)

даст значение True (истина), а:

#if defined(__HUGE__)

(либо любая другая из оставшихся) даст значение False (ложь).

Фактическое значение любой из этих макрокоманд, когда она определена, равно 1.

__cplusplus

Данная макрокоманда в pежиме C++ имеет значение 1; в пpотивном случае, она не опpеделена. Она позволяет написать модуль, который в некоторых случаях будет компилироваться в Си, а в некоторых - в С++. Использование условных директив компиляции позволяет

управлять тем, какие части программы для Си и С++ будут включаться в компиляцию.

__DATE__

Данная макрокоманда дает дату начала обработки препроцессором данного исходного файла (в виде строкового литерала). Каждое

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

препроцессором. Дата имеет форму mmmddyyyy, где mmm это месяц

(Jan, Feb и т.д.), dd равно числу месяца (от 1 до 31, причем если

это число меньше 10, то первый символ d равен пробелу), а yyyy это год (1990, 1991 и т.д.)

__DLL__

Эта макрокоманда специфична для семейства компиляторов

Borland Си и С++. Она определена как 1, если компилятоp командной

стpоки выполняет компиляцию модуля с параметром -WD или в меню

O|C|Entry/Exit Code выбиpается селективная кнопка Windows DDL All

Functions Exportable для генерации кода библиотек DLL Windows. В

противном случае макрокоманда не определена.

__FILE__

Данная макрокоманда дает имя текущего обрабатываемого препроцессором исходного файла (в виде строкового литерала). Когда

препроцессор обрабатывает директиву #include или #line, либо при

завершении обработки включаемого файла, данная макрокоманда соответствующим образом меняет свое значение.

__LINE__

Данная макрокоманда дает количество обработанных препроцессором к данному моменту строк текущего исходного файла. Обычно

первая строка исходного файла определяется с номером 1, хотя на

это может повлиять директива #line. Информацию о директиве #line

см. выше.

__MSDOS__

Данная макрокоманда специфична для Borland Си и C++. Он дает

целочисленную константу 1 для всех случаев компиляции.

__MT__

Эта макрокоманда может использоваться только 32-разрядными

компиляторами. Если используется параметр -WM (он задает компоновку мультинитевой библиотеки), эта макрокоманда определена как 1.

__OVERLAY__

Данная макрокоманда специфична для Borland Cи и С++. Она

предопределена как 1, если модуль компилируется с параметром -Y

(включена поддержка оверлейных структур). Если оверлейные структуры не поддерживаются, то данная макрокоманда не определена.

__PASCAL__

Данная макрокоманда специфична для Borland Cи и С++. Она

сообщает о том, что был использован флаг -p или из меню

O|C|C|Exit/Entry была выбpана команда Pascal calling conventions.

В этом случае макрокоманда установлена равной целочисленной

константе 1; в противном случае она не определена.

__STDC__

Данная макрокоманда определена равной константе 1, если компиляция выполняется при установленном флаге совместимости со

стандаpтом ANSI (-A) или выбpанной из меню Source Options селективной кнопке ANSI. В противном случае макрокоманда не определена.

__TCPLUSPLUS__

Данная макрокоманда специфична для Borland Cи и С++. Она определена только для компиляции С++. Если вы выбрали компиляцию

С++, она определена как шестнадцатиричная константа 0x0320.

__TEMPLATES__

Данная макрокоманда специфична для Borland Cи и С++. Она определена как 1 для файлов С++ (это означает, что C++ поддеpживает

шаблоны); в пpотивном случае, она не опpеделена.

__TIME__

Данная макрокоманда дает время начала обработки препроцессором текущего исходного файла (в виде строкового литерала).
<


Как и в случае макрокоманды __DATE__, каждое включение

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

hh:vv:ss, где hh - это часы (от 00 до 23), mm - это минуты (от 00

до 59), а ss - это секунды (от 00 до 59).



__TLC__



Эта макрокоманда всегда имеет значение True при использовании 32-битового компилятора. См. описание ключевого слова __thread.


__TURBOC__



Данная макрокоманда специфична для Borland Cи и С++. Она

опpеделена как шестнадцатиричная константа 0x0410. Это числовое

значение в последующих версиях будет увеличено.


__WIN32__



Для 32-разрядного компилятора эта макрокоманда всегда определена. Она определена для консольных приложений и приложений

GUI.


_Windows



Указывает на то, что генеpиpуется код, специфичный для Windows. Данная макрокоманда определена, если вы компилируете модуль

с любым включенным параметром -W (генерация прикладной программы

для Windows). Если ни один из этих параметров не включен, то данная макрокоманда не определена.

Предопределенные макрокоманды утилиты MAKE


Макрокоманда Описание

__MSDOS__ Имеет значение 1, если MAKE выполняется в DOS.
__MAKE__ Номер версии MAKE в шестнадцатиричном виде (для

данной версии "Ox0370").

MAKE Имя выполняемого файла MAKE (обычно MAKE или MAKER.
MAKEFLAG Все параметры, используемые в командной строке

утилиты MAKE.

MAKEDIR Каталог, из которого запущена утилита MAKE.



Предупреждения могут генерироваться компилятором, компоновщиком


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

Префиксы


Допустимы следующие префиксы:

lock rep repe repne repnz repz



Префиксы команд


Префиксы, допустимые в команде, модифицирует интерпретацию

этих команд утилитой MAKE. Префиксом является либо символ @, либо

дефис (-), за которым непосредственно следует какое-либо число.

Префикс Действие

@ Указывает утилите MAKE, что не нужно отображать

команды перед их выполнением. Отображение не осуществляется даже в том случае, если в командной строке утилиты MAKE не задается параметр -s. Этот

префикс применяется только к тем командам, перед

которыми он указывается.

-num Оказывает влияние на то, как утилита MAKE интерпретирует коды выхода. Если задается какое-либо число num, то утилита MAKE прекращает обработку

только в том случае, если полученный код выхода превышает заданное число. В приведенном ниже примере утилита MAKE прекращает работу только в том случае, если код выхода превышает 4:

-4myрrog samрle.x

Если префикс -num не задается, а код выхода является ненулевым, то утилита MAKE прекращает работу и удаляет текущий результирующий файл.


Примечание: Коды выхода являются значениями, которые возвращаются выполняемыми командами (внутри программы).

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



Преобразование проектов в формирующие файлы


В IDE вы можете конвертировать файлы проекта (.IDE) в формирующие файлы (.MAK). Для этого откройте файл проекта и выберите

Project Generate Makefile.



Преобразование старых проектов


Администратор проектов данной версии может загружать и использовать проекты предыдущих версий Borland С++ for Windows. Выберите Project Open Project и наберите имя старого файла проекта.

Администратор проектов преобразует старый проект в новый. С помощью Options Save сохраните проект. Он сохраняется со старым

именем и новым расширением .IDE.



Преобразования двоично-десятичных чисел


Тип bcd - это определяемый тип, отличный от float, double

или long double. Десятичная арифметика выполняется только когда

хотя бы один операнд имеет тип bcd.

Для преобразования двоично-десятичного числа обратно к обычной системе счисления с основанием 2 (тип float, double или long

double), служит функция-элемент real класса bcd. Функция real выполняет все необходимые преобразования к типам long, double или

lognd double, хотя такое преобразование не выполняется автоматически. Функция real выполняет все необходимые преобразования к

типу long double, который может быть затем преобразован к другим

типам при помощи обычных средств языка Си. Например:

/* Печать чисел BCD */

#include <bcd.h>

#include <iostream.h>

#include <stdio.h>

void main(void) {

bcd a = 12.1;

double x = real(a); /* преобразование для печати

printf("\na = %Lg", real(a));

printf("\na = %g", (double)real(a));

cout << "\na =" << a; /* рекомендуемый метод

Отметим, что поскольку printf не выполняет контроль типа аргументов, спецификатор формата должен иметь L, если передается

значение real(a) типа long double.



Прерывание выполнения программы


При выполнении программы вы можете получить доступ к отладчику, нажав клавишу прерывания программы. Используемые клавиши зависят от типа отлаживаемого приложения:

при отладке программ Windows 3.х используйте клавиши

Ctrl+Alt+SysRq;

при отладке программ Windows 32s используйте клавиши

Ctrl+Alt+F11;

при отладке программ Windows NT используйте клавишу

F12;

при отладке программ DOS используйте клавиши Ctrl+Break.

Это полезно использовать, когда в программе не установлены

точки останова.

Если при возврате в Turbo Debugger вы увидите окно CPU без

соответствующих программе инструкций, то возможно вы находитесь в

коде ядра Windows. При этом следует установить точку останова в

том месте, где должна выполняться ваша программа. Затем выполните

программу до точки останова (F9). После этого можно возобновить

отладку. Находясь в ядре Windows, не следует пытаться выполнять

программу по шагам или пытаться перезагрузить приложение. Это может привести к краху системы.



Приложения MDI


В каждом приложении MDI присутствуют определенные компоненты. Это основное окно (окно-рамка MDI), клиентное окно MDI в окне-рамке, содержащее дочерние окна (окна MDI) и др. При использовании классов Doc/View приложение может помещать в окна MDI отображаемые элементы.

Приложение MDI обычно имеет пункт меню Window, который управляет дочерними окнами MDI. Меню Window обычно имеет такие

пункты как Tile, Cascade, Arrange и Close All. Имя каждого открытого окна MDI автоматически добавляется в конец данного меню, а

текущее выбранное окно отмечается.

Дочерние окна MDI имеют некоторые характеристики перекрывающегося окна. Их можно максимизировать до полного размера клиентного окна MDI или минимизировать в пиктограмму внутри клиентного окна. Дочерние окна MDI никогда не выводятся вне своих клиентных

окон и окон-рамок. Хотя дочерние окна MDI не могут иметь меню,

можно использовать меню окна-рамки.

Для каждого типа окна MDI в ObjectWindows определены классы

TMDIFrame, TMDIClient и TMDIChild. В ObjectWindows окно-рамка MDI

владеет клиентным окном MDI, а клиентное окно MDI является владельцем каждого дочернего окна MDI.

Функции-элементы TMDIFrame управляют окном-рамкой и его меню. ObjectWindows сначала передает команды активному окну, а затем - его родительскому окну, поэтому клиентное окно может обрабатывать команды окна-рамки. Обычно создается экземпляр TMDIFrame. Так как TMDIChild является производным от TFrameWindow, оно

может быть окном-рамкой с клиентным окном. Таким образом, вы можете создать специализированные окна TMDIChild. Стиль их может

зависеть от конкретного приложения.



Пример класса с виртуальными функциями элементами


Определим класс shape с двумя виртуальными функциями элементами:

class shape {

public:

double xo, yo;

shape(double x, double y); // Конструктор создания shape (фигуры)

virtual double area(void); // Функция вычисляющая поверхность

virtual void draw(void); // Функция рисования shape

};

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

объектами данного класса.

Данные объекта Таблица Нужная

shape виртуальных функция

функций

>

xo, yo (*area)() * > shape::area()

vptr * (*draw)() * > shape::draw()

При вызове объектов shape функцией draw(), выполняется подстановка кода следующим образом:

My_shape.draw() > *my_shape.vptr1([]);

Каждая виртуальная функция элемент проиндексирована в таблице.

Это индексирование выполняется во время компиляции.


Для создания новых классов из shape можно использовать наследование и порождение.

class circle : public shape {

public:

double radius;

circle(double x, double y, double r);

double area(void); // Переопределяет shape::area()

void draw(void); // Переопределяет shape::draw()

};

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

Данные объекта Таблица Нужная

circle виртуальных функция

функций

>

xo, yo (*area)() * > circle::area()

radius

(*draw)() * > circle::draw();

vptr *

Класс circle копируют таблицу виртуальных функций элементов из

класса shape. Каждая виртуальная функция переопределяется классом

circle путем передачи входов модифицированной таблице.

Таблицы виртуальных функций элементов позволяют однозначно

использовать указатели на объекты и гарантировать точность вызова

виртуальных функций.

shape *p; // Объявление родового указателя shape

shape s(0,0); // исходной точки фигуры shape

circle c(10,10,50); // и круга circle фигуры shape

p = &s; // Точка фигуры shape

p->draw(); // Вызов shape::draw()

p = &c; // Точка круга circle

p->draw(); // Вызов circle::draw()

Так c помощью виртуальных функций мы можем управлять поведением

объектов. Вот таков полиморфизм в действии.

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



Пример наследования


Чтобы задать отношения наследования между классами, надо при

описании нового класса после имени класса поставить двоеточие и далее

перечислить через запятую имена потомков.


В этом примере из базового класса shape порождается класс

circle:

class shape { < Объявление класса

public:

double xo, yo; < Данные (координаты)

shape(double x, double y); < Конструктор

virtual double area(void); < Виртуальная функция элемент

};

Связывание порожденного класса с базовым

v

class circle : public shape { < Объявление порожденного класса

public:

double radius; < Дополнительные данные

double area(void); < Заимствованная функция элемент

circle(double x, double y, double r); < Конструктор

};



Ниже приводится несколько простых примеров,


Ниже приводится несколько простых примеров, демонстрирующих
различные операции, которые могут быть выполнены утилитой TLIB.
Чтобы создать библиотеку с именем MYLIB.LIB, в которую
должны входить модули X.OBJ, Y.OBJ и Z.OBJ, введите:
tlib mylib +x +y +z
Чтобы создать библиотеку как в примере #1, но наряду с
этим получить файл списка MYLIB.LST, введите:
tlib mylib +x +y +z, mylib.lst
Чтобы получить файл списка CS.LST существующей библиотеки
CS.LIB, введите:
tlib cs, cs.lst
Чтобы заменить модуль X.OBJ на новую версию, добавить модуль A.OBJ и удалить модуль Z.OBJ из библиотеки
MYLIB.LIB, введите:
tlib mylib -+x +a -z
Чтобы извлечь модуль Y.OBJ из библиотеки MYLIB.LIB и получить файл списка MYLIB.LST, введите:
tlib mylib *y, mylib.lst
Чтобы создать при помощи файла подсказки новый файл библиотеки с именем ALPHA, в который войдут модули A.OBJ,
B.OBJ,... , G.OBJ:
Сначала создайте текстовый файл ALPHA.RSP, содержащий
строки:
+a.obj +b.obj +c.obj &
+d.obj +e.obj +f.obj &
+q.obj
Затем введите команду TLIB, которая создает файл списка
ALPHA.LST:
tlib alрha @alрha.rsр, alрha.lst
Назад | Содержание | Вперед

Ниже приведены некоторые примеры явных


Ниже приведены некоторые примеры явных правил:
1. рrog.exe: myрrog.obj рrog2.obj
BCC myрrog.obj рrog2.obj
2. myрrog.obj: myрrog.c include\stdio.h
BCC -c myрrog.c
3. рrog2.obj: рrog2.c include\stdio.h
BCC -c -K рrog2.c
Эти три примера взяты из одного и того же формирующего файла. Повторно будут обрабатываться только те модули, которые подвергались модификациям. Если был модифицирован файл PROG2.C, то будет перекомпилироваться только этот файл. То же самое справедливо для файла MYPROG.C. Но если был изменен файл включения stdio.h, то будут перекомпилированы оба файла. Перекомпоновка будет осуществляться в том случае, если был модифицирован хотя бы один из объектных файлов, указанных в списке зависимости. Это имеет место в том случае, если в результате изменения исходного файла была произведена перекомпиляция.

Приведем полный текст программы


001: #include <stdio.h>

002:

003: class decompressor {

004: int srclen, c, rcnt;

005: unsigned char *p;

006: public:

007: decompressor(unsigned char *s, int len);

008: int next(void);

009: };

010:

011: decompressor::decompressor(unsigned char *s, int len)

012: {

013: p = s; srclen = len; rcnt = 0;

014: }

015:

016: int decompressor::next(void)

017: {

018: if (rcnt && rcnt-- > 0) return c; // Декомпрессия

019: if (!srclen || srclen-- <= 0) return -1;

020:

021: c = *p++; // Поместить следующий символ в буфер

022: if (c == 0xff) {

023: rcnt = *p++ - 1; // Отсчитать один записанный символ

024: c = *p++; // Здесь символ повторен

025: srclen -= 2;

026: }

027: return c;

028: }

029:

030: unsigned char buff[] = {'a',0xff,3,'b','c'};

031:

032: main()

033: {

034: int c;

035: decompressor dc(buff, sizeof(buff));

036:

037: while ((c = dc.next()) != -1) putchar(c);

038: return 0;

039: }



Продвинутые параметры


Продвинутые параметры определяют поведением приложения и его

внешним видом.



Проектирование шаблона документа


Для создание шаблона класса документа используется макрокоманда DEFINE_DOC_TEMPLATE_CLASS с 3 аргументами: классом документа, классом отображаемого элемента и именем шаблона класса. Классом документа должен быть класс, который вы хотите использовать

для включения данных. Класс отображаемого элемента должен быть

классом, используемым для вывода содержащихся в классе документа

данных. Имя шаблона должно указывать функцию шаблона и не должно

быть ключевым словом С++.



Программирование для Windows


В данном разделе описываются различные вопросы, касающиеся

16- и 32-разрядному программированию в Windows, включая файлы

сценариев ресурсов, файлы определения модулей, библиотеки импорта, файлы проектов и администратор проектов, администратор динамически распределяемой области памяти и 32-разрядное программирование в Windows.

Кроме компиляции исходного кода и компоновки файлов .OBJ,

программист, работающий в Windows, должен компилировать файлы

сценария ресурсов и связывать ресурсы с выполняемым файлом. Он

должен также иметь представление о динамической компоновки, библиотеках динамической компоновки (DLL) и библиотеках импорта.

Кроме того, при работе с интегрированной средой Borland C++ (IDE)

полезно знать, как использовать администратор проектов, который

автоматизирует построение приложения. Процесс построения приложения в Windows иллюстрируется следующей схемой:

4

.C v

.ASM

RW

1 .CPP BCC TASM

.INC

v

.H v v

.RC

.H .H

v v v v

2 .DEF TLINK .LIB BRC RW

-

v v v

.EXE .RES 5

v v

BRC

v

.EXE 6

При компиляции и компоновке программы Windows выполняются

следующие шаги:

Исходный код компилируется или ассемблируется и создаются

файлы .OBJ.

Файлы определения модулей (.DEF) сообщают компоновщику,

какой вид выполняемых файлов вы хотите получить.

Resource Workshop (или какой-либо другой редактор ресурсов) создает ресурсы, такие как пиктограмммы или битовые

массивы. Создается файл ресурса (.RC).

Файл .RC компилируется компилятором ресурсов или с помощью Resource Workshop. На выходе получается двоичный

файл .RES.

В результате компоновке создается выполняемый файл .EXE и

связанные с ним ресурсы.



Программирование со смешанными моделями и модификаторы адресации


Borland C ++ вводит восемь новых ключевых слов, отсутствующих в языке Си стандарта ANSI (near, far, huge, _cs, _ds, _es, _ss и _seg), которые с некоторыми ограничениями и предупреждениями могут использоваться в качестве модификаторов для указателей

(и в некоторых случаях, для функций).

В Borland C++ при помощи ключевых слов near, far или huge вы

можете модифицировать объявления функций и указателей. Указатели

данных near, far и huge рассматривались в выше. Объекты far объявляются при помощи ключевого слова far. Функции near запускаются

при помощи ближних вызовов (near), а выход из них происходит с

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

функции far вызываются дальними вызовами (far) и выполняют дальний (far) возврат. Функции huge похожи на функции far, за исключением того, что функции huge устанавливают регистр DS в новое значение, тогда как функции far не изменяют значения этого регистра.

Существует также четыре специальных ближних (near) указателя

данных: __cs, __ds, __es и __ss. Имеются 16-битовые указатели,

конкретно связанные с соответствующими сегментными регистрами.

Например, если вы объявите указатель следующим образом:

char _ss *p;

то p будет содержать 16-битовое смещение в сегмент стека.

Функции и указатели в данной программе по умолчанию бывают

ближними или дальними, в зависимости от выбранной модели памяти.

Если функция или указатель являются ближними, то они автоматически связываются с регистром CS или DS.

В следующей таблице показано, как это происходит. Отметим,

что размер указателя соответствует предельному размеру памяти,

равному 64К (ближний, в пределах сегмента) или 1 Мб (дальний, содержит собственный адрес сегмента).



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


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

Borland C++ имеет отдельную библиотеку с более чем 70 графическими функциями, начиная от функций высокого уровня (таких как

setviewport, bar3d и drawpoly) и кончая бит-ориентированными

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

их либо по горизонтали, либо по вертикали.

Эти функции находятся в библиотечном файле GRAPHICS.LIB, а

их прототипы - в файле заголовка graphics.h. Кроме этих двух файлов, в состав графического пакета входят драйверы графических устройств (файлы *.BGI) и символьные шрифты (файлы *.CHR). Эти дополнительные файлы рассматриваются в следующих разделах.

Если вы используете компилятор BCC.EXE, нужно в командной

строке указать библиотеку GRAPHICS.LIB. Например, если ваша программа, MYPROG.C, использует графику, то командная строка компилятора BCC должна иметь вид:

BCC MYPROG GRAPHICS.LIB

При построении программы компоновщик автоматически компонует

графическую библиотеку С++.

Поскольку графические функции используют указатели far, графика в случае модели памяти tiny не поддерживается.

Графическая библиотека только одна и не имеет версий по моделям памяти (по сравнению со стандартными библиотеками CS.LIB,

CC.LIB, CM.LIB и т.д., которые зависят от используемой модели памяти). Каждая функция в файле GRAPHICS.LIB является far (дальней)

функцией, а графические функции, использующие указатели работают

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

в каждом использующем графические функции модуле требуется директива #include graphics.h.



Производные классы


TGadget предусматривает ряд функций protected, которые вы

можете использовать для создания производных классов, а также пару виртуальных функция для инициализации и очистки реквизита Inserted и Remove. Inserted вызывается после включения реквизита в оно реквизитов, a Removed вызывается перед удалением реквизита

из окна реквизитов. Заданные по умолчанию версии этих функций никаких действий не выполняют.

Функция PaintBorder рисует границу реквизита. Она реализует

стандартные стили границы. Для создания нового стиля нужно переопределить эту функцию. Для использования стандартных стилей нужно также вызывать версию TGadget этой функции.

Функция Paint аналогична функции Paint TWindow. Paint описывается как virtual. Функция PaintGadgets в TGadget при изображении окна реквизита вызывает функцию Paint каждого реквизита. Заданная по умолчанию функция Paint только вызывает функцию PaintBorder. Вам нужно переопределить эту функцию.

При самостоятельном изображении реквизита с помощью функции

Paint часто требуется найти область внутри границ и полей реквизита. Эта область называется внутренним прямоугольником. Его можно определить с помощью функции GetInnerRect, которая помещает в

передаваемую ей структуру TRect координаты внутреннего прямоугольника.

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

две функции - Invalidate и InvalidateRect, аналогичные соответствующим функциям TWindow. Invalidate работает как соответствующая

функция API Windows, но не требуется параметра HWND. Родственной

функцией является функция Update, которая пытается обновить реквизит. Она аналогичная функции API Windows UpdateWindow.

Вы можете отслеживать события "мыши", происходящие внутри и

вне реквизита. Это делается с помощью псевдообработчиков событий

класса TGadget. Эти функции во многом аналогичны стандартным

функциям обработки событий ObjectWindows, но имена функций не

имеют префикса ev.

Так как реквизит на самом деле не является окном, он не имеет таблиц реакции, как другие классы ObjectWindows. Вся связь




реквизита с внешним миром осуществляется через окно реквизитов.

Когда в окне реквизитов происходит событие "мыши", окно пытается

определить, на какой из реквизитов оно влияет. C этой целью вы

можете вызвать функцию PtIn, которая возвращает True, если заданная аргументом точка находится внутри ограничивающего прямоугольника реквизита. Когда "мышь" попадает внутрь ограничивающего прямоугольника реквизита, окно реквизита вызывает функцию MouseEnter, первый аргумент которой содержит ключевую информацию, необходимую для передачи стандартного сообщения ObjectWindows EvMouseMove. Это указывает на нажатие различных виртуальных клавиш.

После того как окно реквизита вызывает функцию реквизита MouseEnter и информирует реквизит, что "мышь" вошла в его область.

Реквизит перехватывает перемещения "мыши", вызывая функцию GadgetSetCapture, обеспечивая вызов функции MouseLeave (эта функция

вызывается после выхода "мыши" за пределы ограничивающего прямоугольника). Функции LButtonDown и LButtonUp позволяют определить

положение левой кнопки "мыши".


Производные классы


Создав класс, производный от TGadgetWindow, вы можете создать собственное специализированное окно реквизитов. Как и обычные окна, TGadgetWindow реализует функцию Paint, которая выбирает

в контексте устройства шрифт окна и вызывает функцию PaintGadget,

выполняющую итерацию по реквизитам окна и запрашивающую отображение каждого из них.

Для определения общего необходимого размера используйте

функции GetDesiredSize и GetInnerRect (то есть размер, необходимый для размещения всех рамок, полей и реквизитов наибольшего

размера). GetInnerRect вычисляет область внутри рамок и полей и

помещает результат в rect.

В окне реквизитов могут использоваться следующие единицы измерения:

Элементы изображения.

Единицы схемы окна, определяемые делением шрифта "em" окна

на 8 вертикальных и 8 горизонтальных сегментов.

Единицы рамки основываются на толщине рамки окна. Обычно

они эквивалентны одному элементу изображения.

Обычно лучше использовать единицы схемы окна, так как они

основываются на размере шрифта (вам не нужно будет беспокоиться о

масштабировании). Для преобразования этих единиц в элементы изображения используется функция LayoutUnitsToPixels.

TGadgetWindow перехватывает следующие события:

WM_CTLCOLOR;

WM_LBUTTONDOWN;

WM_LBUTTONUP;

WM_MOUSEMOVE;

MW_SIZE;

WM_SYSCOLORCHANGE;

и реализуется соответствующие функции обработки событий.

ObjectWindows предусматривает ряд производных от TGadgetWindow классов, которые предусматривают ряд способов для вывода и

задания схемы расположения реквизитов. Это классы TControlBar,

TMessageBar, TStatusBar и TToolsBox.



Просмотр других файлов


Для просмотра любого файла на диске, включая двоичные и

текстовые, используйте окно File. При выборе в строке меню команды View File отладчик выводит диалоговое окно Enter Name of File.

Вы можете задать в нем трафаретные символы или конкретное имя

файла. В зависимости от содержимого файла в открываемом окне File

файлы выводятся в текстовом или шестнадцатиричном виде.



Просмотр и модификация файлов


Turbo Debugger предусматривает два способа просмотра файлов

на диске: окно Module и окно File. Окно Module чаще всего используется в отладчике. Его можно применять для просмотра исходного

кода выполняемого модуля, скомпилированного с отладочной информацией. Строка заголовка этого окна показывает имя текущего загруженного модуля, имя текущего исходного файла и номер строки курсора. Выполняемая строка в этом окне помечается символом точки

(.), а стрелка (>) в первой позиции показывает указатель команд.

Он всегда отмечает следующий выполняемый оператор. При загрузке

программы в отладчик окно Module загружается автоматически

При выполнении программы по шагам окно Module автоматически

показывает исходный код, соответствующий выполняемой инструкции.

Перемещаясь по исходному коду, вы можете установить точки останова и задать отслеживаемые выражения, а также проверить значения

переменных. Если в строке заголовка выводится opt, то программа

оптимизирована компилятором. Это может затруднить поиск переменных. Если файл модифицирован после последней компиляции, то в заголовке выводится modified. Это может привести к несоответствию

строк исходного текста. Перекомпилируйте программу.



Просмотр исходного кода класса


Чтобы просмотреть исходный код класса, выберите класс в области классов. Исходный код выводится в области редактирования.

Чтобы переместить курсор на конструктор, дважды щелкните "мышью"

на имени в области классов. Для перехода на обрабатываемое события дважды щелкните "мышью" на событии в области событий.



Просмотр элементов исходного кода


Средство просмотра позволяет просматривать иерархию объектов, классов, функций, переменных, констант и типов в используемых программах. Перед использованием средства просмотра установите в диалоговом окне Project Options следующие параметры:

Выберите Compiler Debugging и установите Debug information

in OBJs.

Выберите Compiler Debugging и отметьте Browser reference

information in OBJs.

Выберите Linker General и отметьте Include debug information.

Чтобы запустить средство просмотра, выберите Search Browse

Symbol, View Classes или View Globals. Вы можете также поместить

курсор на идентификатор в исходном коде и выбрать для вывода окна

просмотра Search Browse. Если программа в текущем окне просмотра

еще не скомпилирована, нужно скомпилировать и скомпоновать программу с включенной отладочной информацией.

В окне Enviroment Options вы можете установить несколько параметров просмотра. Выберите Options Enviroment, щелкните "мышью"

на Browser и выберите нужные параметры.

Чтобы увидеть "общий план" иерархии объектов в приложении,

выберите View Classes. Средство просмотра показывает объекты в

горизонтальном дереве, отображая отношения "родитель-потомок".

Красные линии в иерархии позволяют увидеть прямые связи текущего

выбранного объекта. Чтобы просмотреть информацию о конкретном

объекте, дважды щелкните на нем "мышью" или выберите объект с помощью клавиш стрелок и нажмите Enter.

Тип просматриваемых идентификаторов можно определить с помощью матрицы фильтрации Filters matrix. Чтобы увидеть описание

конкретного выводимого в списке идентификатора, дважды щелкните

на нем "мышью", выберите идентификатор и нажмите Enter. Выберите

идентификатор, нажмите Alt|+F10 и выберите в оперативном меню

Browse Symbol.

Чтобы открыть окно со списком глобальных идентификаторов,

выберите View Globals. Одна или две буквы слева от идентификатора

описывают вид идентификатора. Вы можете отфильтровать идентификаторы с помощью матрицы фильтрации.




Буква Идентификатор







F Функции
T Типы
V Переменные
C Целочисленные константы
? Отлаживаемые
I Наследуется от предка
V Виртуальный метод
Чтобы получить более подробную информацию о конкретном идентификаторе, щелкните на нем "мышью" или выделите с помощью клавиш

стрелок. Поле ввода Search в нижней части окна позволяет быстро

найти идентификатор в списке глобальных идентификаторов, набрав

первые несколько букв имени.

При поиске в некоторых окна просмотра можно использовать выражения, в которых допускаются следующие символы:

Символ Функция




. Совпадает с любым символом.
* Совпадает с 0 или более предыдущих символов. Например, fo* совпадает со всем, что начинается с

fo, а fo*x - c fx, fox или fooox.
+ Совпадает с 0 или более предыдущих символов. Например, fo+ совпадает со всем, что начинается с

fo, а fo+x - c fx, fox или fooox.
? Совпадает с 0 или более предыдущих символов. Например, fo? совпадает со всем, что начинается с

fo, а fo?x - c fx или fox.
Можно также просмотреть любой идентификатор в исходном коде.

Для этого подсветите его в программе и выберите Search Browse

Symbol или щелкните в окне редактора правой кнопкой "мыши" или

нажмите Alt+F10 для вывода оперативного меню, затем выберите

Browse Symbol.


Просмотр параметров проекта


Так как каждый узел может иметь свой собственный набор Style

Sheet, который можно переопределять, требуется быстрый способ

просмотра параметров каждого узла.

Чтобы просмотреть иерархию параметров, сделайте следующее:

Щелкните на узле правой кнопкой "мыши" и выберите View options hierarchy. Выводится диалоговое окно Options Hierarchy с перечнем узлов проекта и их параметров. Просмотр

списка можно настраивать как в окне проекта.

Щелкните "мышью" на узле, который вы хотите просмотреть.

Справа выведутся его параметры.

Если вы хотите отредактировать параметр, дважды щелкните

на параметре "мышью" или выделите его и щелкните на кнопке

Edit. Если параметр принадлежит к Style Sheet, то придется

редактировать весь набор Style Sheet. В противном случае

редактируется Local Override.

Когда закончите просмотр узлов, щелкните "мышью" на Close.



Простые ссылки


Для объявления ссылок вне функции может использоваться описатель ссылки:

int i = 0;

int &ir = i; // ir является псевдонимом i

ir = 2; // то же, что i = 2

В данном примере создается именующее значение ir, являющееся

псевдонимом i, при условии, что инициализатор имеет тот же тип,

что и ссылка. Выполнение операций с ir имеет тот же результат,

что и выполнение их с i. Например, ir = 2 присваивает значение 2

переменной i, а &ir возвращает адрес i.

Отметим, что type& var, type &var и type & var эквивалентны.



Прототипы функций


Прототипы функций в С++ записываются ранее того места, где эта

функция будет использована. Это позволяет компилятору контролировать

типы вызываемых функций. Рассмотрим, например, ошибочную функцию по

вычислению налога на добавленную стоимость:

int nalog(int, int, int);

Прототипы сообщают транслятору о количестве и типах параметров,

которые могут быть переданы внешне определенным функциям. В список

аргументов можно внести имена параметров:

int nalog(int priceOld, int priceNew, int nalog1);

priceOld=150.5;

priceNew=135.7;

delta=nalog(priceOld, priceNew, 0.28);

Такая запись будет ошибочной в стандартном Си, так как все аргументы приведутся к типу float и будут переданы в тело функции, которая ожидает передачу чисел типа int. В С++ это выражение преобразуется согласно прототипу функции. Таким образом, небольшое изменение

делает программы на С++ более надежными и позволяет избежать множества ошибок.

int nalog(int priceOld, int priceNew, int nalog1)

{

return (priceNew - priceOld)*nalog1;

}

Это реализация функции. Она может быть подключена из другого

файла.


Определение заголовка функции соответствует ее прототипу, который правильней разместить в заголовочном файле.



Пунктуаторы


В Borland C++ пунктуаторы, также называемые разделителями,

определяются следующим образом:

пунктуатор: одно из

[ ] ( ) { } , ; : ... * = #



- R -


R2001 Unable to open bitmap file имя_файла

Ошибка, возникающая при обработке информационных файлов Help

(невозможно открыть файл битового изображения имя_файла)

Указанный файл битового изображения не читается. Ошибка возникает в ответ на ошибку DOS при чтении файла.

R2003 Unable to include bitmap file имя_файла

Ошибка, возникающая при обработке информационных файлов Help

(невозможно включить файл битового изображения имя_файла)

Указанный файл битового изображения отсутствует либо не читается. Ошибка возникает в ответ на ошибку DOS при чтении файла

либо при исчерпании свободной памяти.

R2005 Disk full

Ошибка, возникающая при обработке информационных файлов Help

(на диске нет места)

Запись справочного файла на диск невозможна. Освободите на

диске необходимый объем дискового пространства.

R2009 Cannot use reserved DOS device name for file имя_файла

Ошибка, возникающая при обработке информационных файлов Help

(использование в качестве имени_файла зарезервированного в

DOS названия файла устройства невозможно)

Файл не может иметь имя COM1, LPT2, PRN и т.д. Назовите файл

другим именем.

R2013 Output file имя_файла already exists as a directory

Ошибка, возникающая при обработке информационных файлов Help

(существует каталог с именем, совпадающим с именем выходного

файла имя_файла)

В главном каталоге проекта имеется подкаталог, имя которого

совпадает с именем справочного файла. Переместите этот подкаталог

в другое место либо переименуйте его.

R2015 Output file имя_файла already exists as read-only

Ошибка, возникающая при обработке информационных файлов Help

(выходной файл имя_файла существует и защищен от записи)

Указанный файл не может быть записан поверх существующего

файла с таким же именем, поскольку последний защищен от записи.

Измените название файла описания проекта либо уберите у существующего файла атрибут "read-only" (только чтение).

R2017 Path for file имя_файла exceeds limit of 79 characters

Ошибка, возникающая при обработке информационных файлов Help




( длина полного имени файла превышает 79 символов)

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

оказалось длиннее 79 символов - максимально возможной длине имени, принятой в DOS. Соответствующий файл не обрабатывается (пропускается).

R2019 Cannot open file имя_файла

Ошибка, возникающая при обработке информационных файлов Help

(не могу открыть файл имя_файла)

Указанный файл не читается. Ошибка возникает в ответ на

ошибку DOS при чтении файла.

R2021 Cannot find file имя_файла

Ошибка, возникающая при обработке информационных файлов Help

(не нахожу файл имя_файла)

Указанный файл отсутствует либо не читается. Ошибка возникает в ответ на ошибку DOS при чтении файла либо при исчерпании

свободной памяти.

R2023 Not enough memory to build Help file

Ошибка, возникающая при обработке информационных файлов Help

(для построения справочного файла не хватает памяти)

Для высвобождения памяти следует удалить из нее не нужные в

данный момент прикладные программы, драйверы устройств и резидентные утилиты.

R2025 File environment error

Ошибка, возникающая при обработке информационных файлов Help

(ошибка файловой системы)

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

DOS дескрипторов (описателей)

файлов. Увеличьте в файле

CONFIG.SYS значения в строках FILES= и BUFFERS= и перезагрузите

ПЭВМ.

R2027 Build tag name имя_признака not defined in [BUILDTAGS] section of project file

Ошибка, возникающая при обработке информационных файлов Help

(oписание признака включения имя_признака в разделе

[BUILDTAGS] файла описания проекта отсутствует)

Указанный признак включения присвоен статье, но его имя не

указано в файле описания проекта. Указанный признак игнорируется.

R2033 Context string in Map section not defined to any topic

Ошибка, возникающая при обработке информационных файлов Help

(контекстная строка, указанная в разделе [MAP], не сопоставлена никакой статье)

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



Ошибка, возникающая при обработке информационных файлов

Help:

R2035 Build expression missing from project file

Ошибка, возникающая при обработке информационных файлов Help

(в файле описания проекта не указано условие включения)

Статьям сопоставлены признаки включения, однако условное выражения, определяемое отслеживания параметром BUILD=, в файле

описания отсутствует. Компилятор включает в справочный файл все

имеющиеся статьи.

R2037 File имя_файла cannot be created, due to previous error(s)



Ошибка, возникающая при обработке информационных файлов Help

(из-за ошибок, обнаруженных ранее, создание файла имя_файла

невозможно)

Создание справочного файла невозможно, поскольку статей,

пригодных для обработки больше не осталось. Исправьте все выявленные ошибки и повторите компиляцию.

R2039 Unrecognized table formatting in topic номер_статьи of file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статья номер_статьи в файле имя_файла содержит таблицу)

Компоновка информации в таблицу в данной версии компилятора

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

R2041 Jump контекстная_строка unresolved in topic номер_статьи on file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статья номер_статьи в файле имя_файла содержит неопределенную ссылку контекстная_строка)

Указанная статья содержит ссылку на несуществующую статью.

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

R2043 Hotspot text cannot spread over paragraph



Ошибка, возникающая при обработке информационных файлов Help

(текст ссылки не может пересекать границу параграфа)

Текст ссылки пересекает границу параграфа. Удалите код начала нового параграфа.

R2045 Maximum number of tab stops reached in topic номер_статьи on file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статья номер_статьи в файле имя_файла содержит избыточное



число позиций табулятора)

В указанной статье превышено максимально допустимое число

позиций табулятора, равное 32. Начиная с 32, используются позиции

табулятора, принятые по умолчанию.

R2047 File имя_файла not created



Ошибка, возникающая при обработке информационных файлов Help

(файл имя_файла не создан)

В информационных файлах отсутствуют статьи, пригодные для

компиляции, либо условие включения ложно для всех имеющихся статей. Справочный файл не создается.

R2049 Context string text is too long in topic номер_статьи

of file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла сопоставлена слишком

длинная контекстная строка)

Длина текста контекстной строки не должна превышать 64 символов. Строка игнорируется.

R2051 File имя_файла is not a valid RTF topic file



Ошибка, возникающая при обработке информационных файлов Help

(файл имя_файла не является корректным информационным файлом

в формате RTF)

Указанный файл не является файлом в формате RTF. Проверьте,

в этом ли формате вы записывали указанный файл при работе в текстовом процессоре.

R2053 Font название_шрифта is not in RTF font table

Ошибка, возникающая при обработке информационных файлов Help

(шрифт название_шрифта не содержится в таблице шрифтов RTF)

В тексте статьи используется шрифт, который не определен в

заголовке файла RTF. Компилятор использует системный шрифт, принятый по умолчанию.

R2055 File имя_файла not a usable RTF topic file

Ошибка, возникающая при обработке информационных файлов Help

(работа с файлом имя_файла как с файлом RTF невозможна)

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

Ошибка, возникающая при обработке информационных файлов

Help:

R2057 Unrecognized graphic format in topic номер_статьи on

file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статья номер_статьи в файле имя_файла ссылается на графическое изображение, записанное в неизвестном формате)



Компилятор поддерживает только те графические изображения,

которые записаны в формате битовых изображения, принятом в

Windows. Проверьте не используется ли в качестве графического

изображения метафайл либо форматы ПЭВМ Macintosh. Графическое

изображение игнорируется.

R2059 Context string identifier already defined in topic номер_статьи on file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла контекстная строка

уже присвоена)

У указанной статьи имеется две сноски со знаком #. Сноска со

знаком "#" используется для назначения статье идентифицирующей ее

контекстной строки. Компилятор использует контекстную строку, определяемую первой сноской со знаком #.

R2061 Context string контекстная_строка already used in file

имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(контекстная строка контекстная_строка уже использована в

файле имя_файла)

Указанная контекстная строка была сопоставлена ранее другой

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

R2063 Invalid context-string identifier for topic номер_статьи on file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла назначена некорректная контекстная строка)

Контекстная строка содержит символы, не являющая алфавитно-цифровыми, либо является пустой. Некорректная контекстная

строка игнорируется, соответствующая статья остается без идентификатора.

R2065 Context string defined for index topic is unresolved



Ошибка, возникающая при обработке информационных файлов Help

(контекстная строка, указанная в качестве идентификатора оглавления, не сопоставлена никакой статье)

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

первую встретившуюся статью.

R2067 Footnote text too long in topic номер_статьи on file

имя_файла





Ошибка, возникающая при обработке информационных файлов Help

(статья номер_статьи в файле имя_файла содержит сноску с

текстом избыточной длины)

Длина текста сноски не может превышать 1000 символов. Сноска

игнорируется.

R2069 Build tag footnote not at beginning of topic номер_статьи on file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(в статье номер_статьи, содержащейся в файле имя_файла,

сноска признака включения не является первой сноской)

Указанная статья содержит ссылку, определяющую признак включения, однако знак этой ссылки не является первым символом

статьи. Статье не назначается признак включения.

R2071 Foonote text missed in topic номер_статьи on file имя_

файла



Ошибка, возникающая при обработке информационных файлов Help

(статья номер_статьи в файле имя_файла содержит пустую сноску)

Указанная статья содержит сноску без текста.

R2073 Keyword string is null in topic номер_статьи on file

имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла сопоставлено пустое

ключевое слово)

Указанная статья имеет сноску, используемую для назначения

ключевых слов, которая не содержит никакого текста.

R2075 Keyword string is too long in topic номер_статьи on

file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла сопоставлено слишком

длинное ключевое слово)

Указанная статья имеет сноску, используемую для назначения

ключевых слов, длина текста которой превышает предельно допустимое значение, равное 255. Избыточные символы игнорируются.

R2077 Keyword(s) defined without title in topic номер_статьи

on file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла сопоставлено ключевое слово, а заголовок не сопоставлен)

Указанной статье назначены ключевые слова и при этом не сопоставлен заголовок. При поиске по ключевому слову статья без заголовка отображается в соответствующем блоке перечня в виде



Untitled topic<<.

R2079 Browse sequence string is null in topic номер_статьи

on file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла сопоставлена пустая

строка последовательности просмотра)

Указанная статья имеет сноску, используемую для назначения

порядкового номера в последовательности просмотра, однако она не

содержит никакого текста.

R2081 Browse sequence string is too long in topic номер_статьи on file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла сопоставлен слишком

длинный идентификатор последовательности просмотра)

Указанная статья имеет сноску, используемую для назначения

порядкового номера в последовательности просмотра, длина текста

которой превышает предельно допустимое значение, равное 128.

Сноска игнорируется.

R2083 Missing sequence number in topic номер_статьи on file

имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(у статьи номер_статьи в файле имя_файла опущен номер в последовательности просмотра)

Текст сноски, назначающей порядковый номер в последовательности просмотра, заканчивается символом ":". Удалите двоеточие,

либо введите после него требуемый порядковый номер.

R2085 Sequence number already defined in topic номер_статьи

on file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла сопоставлено два порядковых номера в последовательности просмотра)

Указанной статье уже сопоставлен номер в последовательности

просмотра. Второе определение номера игнорируется.

R2087 Build tag too long



Ошибка, возникающая при обработке информационных файлов Help

(длина имени признака включения слишком велика)

Длина имени признака включения, сопоставленного указанной

статье, превышает предельно допустимое значение, равное 32. Признак включения игнорируется.

R2089 Title string null in topic номер_статьи on file



имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла сопоставлен пустой

заголовок)

Указанная статья имеет сноску, используемую для назначения

заголовка, однако она не содержит никакого текста. Заголовок

статье не назначается.

R2091 Title too long in topic номер_статьи on file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла сопоставлен слишком

длинный заголовок)

Указанная статья имеет сноску, используемую для назначения

заголовка, длина текста которой превышает предельно допустимое

значение, равное 128. Избыточные символы игнорируются.

R2093 Title titlename in topic номер_статьи on file имя_файла used previously



Ошибка, возникающая при обработке информационных файлов Help

(cтатье номер_статьи в файле имя_файла сопоставлен ранее использованный заголовок)

Указанный заголовок был ранее сопоставлен другой статье.

R2095 Title assigned more than once in topic номер_статьи on

file имя_файла



Ошибка, возникающая при обработке информационных файлов Help

(статье номер_статьи в файле имя_файла сопоставлено несколько заголовков)

Указанная статья имеет несколько сносок, используемых для

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

R2501 Using old key-phrase table



Ошибка, возникающая при обработке информационных файлов Help

(используется старый словарь ключевых фраз)

Максимальная степень сжатия достигается при удалении старого

словаря фраз (файла с расширением .PH)

перед каждой компиляцией.

R2503 Out of memory during text compression



Ошибка, возникающая при обработке информационных файлов Help

(в процессе сжатия исчерпалась свободная память)

В процессе сжатия компилятор столкнулся с недостатком памяти. Компиляция продолжается в обычном режиме (без сжатия). Для

высвобождения памяти следует удалить из нее не нужные в данный

момент прикладные программы, драйверы устройств и резидентные

утилиты.



R2505 File environment error during text compression



Ошибка, возникающая при обработке информационных файлов Help

(ошибка файловой системы при сжатии файла)

Для продолжения операции сжатия не хватает наличия доступных

в DOS дескрипторов файлов. Компиляция продолжается в обычном режиме (без сжатия). Увеличьте в файле CONFIG.SYS значения в строках FILES= и BUFFERS= и перезагрузите компьютер.

R2507 DOS file error during compression



Ошибка, возникающая при обработке информационных файлов Help

(ошибка доступа к файлу в процессе сжатия)

В процессе сжатия при доступе к файлу произошла ошибка DOS.

Компиляция продолжается в обычном режиме (без сжатия).

R2509 Error during text compression



Ошибка, возникающая при обработке информационных файлов Help

(ошибка в процессе сжатия)

Произошла одна из ошибок процесса сжатия - R2503, R2505 или

R2507. Компиляция продолжается в обычном режиме (без сжатия).

R2701 Internal error



Ошибка, возникающая при обработке информационных файлов Help

R2703 Internal error



Ошибка, возникающая при обработке информационных файлов Help

(внутренняя ошибка)

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

(внутренняя ошибка)

R2705 Internal error



Ошибка, возникающая при обработке информационных файлов Help

(внутренняя ошибка)

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

R2707 Internal error



Ошибка, возникающая при обработке информационных файлов Help

(внутренняя ошибка)

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

R2709 Internal error



Ошибка, возникающая при обработке информационных файлов Help

(внутренняя ошибка)

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

record kind номер found, expected theradr or lheadr in

module имя_файла



Сообщение об ошибке утилиты TLIB

(найдена запись с указанным номером, требуется адрес в модуле имя_файла)

Библиотекарь не может распознать запись заголовка объектного



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

record length длина exceeds avaliable buffer in module модуль



Сообщение об ошибке утилиты TLIB

(длина записи в модуле превышает размер буфера)

Эта ошибка происходит, когда длина записи в модуле модуль

превышает объем доступного буфера. Это происходит, если TLIB исчерпала объем доступной памяти.

record type тип found, expected theard or lheard in модуль



Сообщение об ошибке утилиты TLIB

(найден тип записи, требуется адрес в модуле)

Утилита TLIB вместо ожидаемой записи THEADR или LHADER в модуле модуль обнаружила непредвиденный тип.

Redefinition of макрокоманда is not identical



Предупреждение этапа компиляции

(переопределение макрокоманды не идентично)

В исходном файле указанная макрокоманда переопределяется с

использованием текста, не идентичного тексту первого определения

макрокоманды. Новый текст заменит старый.

Redefinition of target имя_файла



Сообщение об ошибке утилиты MAKE

(повторное определение имени целевого файла)

Названный файл обнаружен с левой стороны нескольких явных

правил.

Reference initialized with тип_1, needs lvalue of тип_2



Сообщение об ошибке этапа компиляции:

(ссылка инициализируется типом_1, требуется именующее значение типа_2)

Ссылочная переменная или параметр, которые не описаны как

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

инициализируемой ссылке.

Reference member элемент in class without constructors



Сообщение об ошибке этапа компиляции

(ссылочный элемент в классе без конструкторов)

Класс, содержащий функции-элементы, должен иметь по крайней

мере один определенный пользователем конструктора, иначе такие

элементы инициализировать невозможно.

Reference member элемент initialized with a non-reference

parameter



Сообщение об ошибке этапа компиляции

(ссылка на элемент инициализирован не ссылочным параметром)



Попытка связать ссылочный элемент с параметром в конструкторе. Поскольку объект параметра прекращает существование в момент

выхода из конструктора, ссылка будет указывать на неопределенный

объект.

Reference member элемент is not initialized



Сообщение об ошибке этапа компиляции

(элемент-ссылка не инициализирован)

Ссылки всегда должны быть инициализированными. Элемент класса типа ссылки должен иметь инициализатор во всех конструкторах

для данного класса. Это означает, что вы не можете зависеть от

компилятора в вопросе генерации конструкторов для такого класса,

поскольку неизвестно, как инициализировать ссылки.

Reference member элемент needs a temporary for initialization



Сообщение об ошибке этапа компиляции

(элемент-ссылка требует для инициализации временную память)

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

Это требует, чтобы компилятор получил временную память для инициализации. Поскольку эта временная память отсутствует, инициализация недопустима.

Reference variable must be initialized



Сообщение об ошибке этапа компиляции

(ссылочная переменная должна инициализироваться)

Объект С++ описан как ссылка, но не инициализируется. Все

ссылки в точке их описания должны инициализироваться.

Register allocation failure



Фатальная ошибка этапа компиляции

(ошибка распределения регистров)

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

сложным, что генератор кода не смог выполнить свою работу. Упростите это выражение. Если это не помогло, постарайтесь обойтись

без него. В случае, если вы получите такое сообщение, уведомьте

об этом фирму Borland.

Relocation item exceeds 1MB DOS limit



Сообщение об ошибке утилиты TLINK

(перемещаемый элемент превышает предел DOS 1 мегабайт)

Формат выполняемого файла DOS не поддерживает перемещаемые

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



Даже если образ загружается с помощью расширителя DOS, формат выполняемого файла DOS ограничен описанием перемещаемых элементов в

первом мегабайте.

Relocation offset overflow



Сообщение об ошибке утилиты TLINK

(переполнение смещения перемещения)

Эта ошибка возникает только в 32-битовых объектных модулях и

указывает на смещение перемещения (корректировку сегмента), превышающее ограничение DOS в 64К.

Relocation table overflow



Сообщение об ошибке утилиты TLINK

(переполнение таблицы перемещений)

Эта ошибка возникает только в 32-битовых сегментах. Компонуемый файл содержит больше базовых корректировок, чем допустимо в

стандартной таблице перемещений DOS (базовые корректировки создаются в основном вызовами дальних функций).

Resident Name Table is greater than 64K



Предупреждение утилиты TLINK

(резидентная таблица имен превышает 64К)

Максимальный размер нерезидентной таблицы имен - 64К. Компоновщик продолжает работу, но игнорирует последующие нерезидентные

имена.

Restarting compile using assembly



Сообщение об ошибке этапа компиляции

(перезапуск компиляции с использованием ассемблирования)

Компилятор обнаружил оператор ASM в сопровождении а параметром командной строки -B и оператором #pragma inline. Компиляция

перезапускается с использованием возможностей ассемблера.

Results are safe in file имя_файла



Сообщение об ошибке утилиты TLIB

(результаты в файле имя_файла надежны)

Библиотекарь успешно сформировал библиотеку во временном

файле, но не может переименовать файл в требуемое имя библиотеки.

Временный файл не будет удален (поэтому библиотеку можно сохранить).

Rule line too long



Сообщение об ошибке утилиты MAKE

(слишком длинная строка правила). Неявное или явное правило превышает 4096 символов.


R79_2.shtml


Глава 6. Справочник по библиотеке Borland C++ 4.0

gcvt Преобразует число с плавающей точкой в строку

DOS UNIX Win16 #include<stdlib.h>

OS/2 Win32 char *gcvt(double value,int ndec,char

*buf)

geninterrupt Вызывает программное прерывание

DOS Win16 #include<dos.h>

OS/2 Win32 void geninterrupt(int intr_num)

getc Получает символ из потока

DOS UNIX Win16 #include<stdio.h>

OS/2 Win32 int getc(FILE *stream)

ANSI C++ ANSI C

getcbrk Получает параметры контроля прерывания по

<Ctrl/Break>

DOS Win16

#include <dos.h>

int getcbrk(void);

getch Вводит символ с консоли без эхо-отображения на

экране

DOS

Win32 #include<conio.h>

int getch(void);

getchar Получает символ из потока stdin

DOS UNIX #include<stdin.h>

OS/2 Win32 int getchar(void);

ANSI C++ ANSI C

getche Получает символ с клавиатуры и отображает его

на экран

DOS

OS/2 Win32 #include<conio.h>

ANSI C int getche(void);

getcurdir Определяет текущий каталог для указанного диска

DOS Win16 #include<dir.h>

OS/2 Win32 int getcurdir(int drive,char *directory);

getcwd Получает текущий рабочий каталог

DOS Win16 #include<dir.h>

OS/2 Win32 char *getcwd(char *buf,int buflen);

getdate Смотpи _dos_getdate
_getdcwd Определяет текущий каталог для указанного диска

DOS Win16 #include<direct.h>

OS/2 Win32 char* _getdcwd(int drive, char *buffer,

int buflen);

getdfree Получает размер свободного места на диске

DOS Win16 #include<dos.h>

OS/2 Win32 void getdfree(unsigned char drive,

struct dfree *dtable);

getdis,setdisk Получает или устанавливает текущий номер диска

DOS Win16 #include<dir.h>

OS/2 Win32 int getdisk(void);

int setdisk(int drive)

getdta Получает адрес пересылки диска

DOS Win16 #include<dos.h>

char far *getdta(void);

getenv Получает строку из среды

DOS UNIX Win16 #include<stdlib.h>

OS/2 Win32 char *getenv(const char *name);

ANSI C++ ANSI C

getfat Получает информацию из таблицы размещения файлов указанного диска

DOS Win16

#include<dos.h>

void getfat(unsigned char drive,

struct fatinfo *dtable);

getfatd Получает информацию из таблицы размещения файлов

DOS Win16

#include<dos.h>

void getfatd(struct fatinfo *dtable);

getftime,setftime Получает и устанавливает дату и время создания

файла

DOS Win16

OS/2 Win32 #include<io.h>

int getftime(int handle,struct ftime *ftimep);

int setftime(int handle,struct ftime *ftimep);

getpass Считывает пароль

DOS UNIX #include <conio.h>

OS/2 Win32 char *getpass(const char *prompt);

getpid Получает идентификатор процесса программы

DOS UNIX Win16 #include<process.h>

OS/2 Win32 unsighned getpid<void>

getpsp Получает префикс программного сегмента

DOS Win16 #include<dos.h>

unsigned *getpsp(void);

gets Получает строку из потока stdin

DOS UNIX Win16 #include<stdio.h>

OS/2 Win32 char *gets(char *s);

ANSI C++ ANSI C

gettext Копирует текст c экрана в текстовом режиме в

память

DOS

OS/2 Win32 #include<conio.h>

int gettext(int left, int top, int right,

int bottom, void *destin);

gettextinfo Получает видеоинформацию о текстовом режиме

DOS #include<conio.h>

OS/2 Win32 void gettextinfo(struct text_info *r);

gettime,settime Получает и устанавливает системное время

gettime #include<dos.h>

void gettime(struct time *timep);

DOS Win16

OS/2 Win32

---***---

settaime #include<dos.h>

void settime(struct time *timep);

DOS Win16

OS/2 Win32

getvect,setvect Получает и устанавливает вектор прерывания

DOS Win16 #include<dos.h>

OS/2 void interrupt(*getvect(int interruptno))();

void setvect(int interruptno, void

nterrupt (*isr) ());

getverify Получает состояние флага проверки DOS

DOS Win16 #include <dos.h>

OS/2 Win32 int getverify(void);

getw Получает целое число из потока

DOS UNIX Win16 #include<stdio.h>

OS/2 Win32 int getw(FILE *stream);

gmtime Преобразует дату и время во время по стандарту

Гринвича (GMT)

DOS UNIX Win16

OS/2 Win32 #include<time.h>

ANSI C++ ANSI C struct tm *gmtime(const time_t *timer);

gotoxy Позиционирует курсор в текстовом окне

DOS Win16 #include <conio.h>

OS/2 Win32 void gotoxy(int x, int y);

_heapadd Пpисоединяет блок к куче.

#include<malloc.h>

OS/2 Win32 int _heapadd(void *block, size_t size);

heapcheck Просматривает и проверяет кучу

DOS #include<alloc.h>

OS/2 Win32 int heapcheck (void);

heapcheckfree Проверяет свободные блоки кучи на заполнение

заданным значением

DOS

OS/2 Win32 #include<alloc.h>

int heapcheckfree (unsigned int fillvalue);

heapchecknode Ищет и проверяет отдельный узел кучи

DOS UNIX Win16 #include<alloc.h>

OS/2 Win32 int heapchecknode (void *node);

ANSI C

_heapchk Ограничивает и верифицирует кучу.

DOS UNIX Win16 #include <malloc.h>

OS/2 C++ Win32 int _headpchk(void);

heapfillfree Заполняет свободные блоки кучи заданным значением

DOS #include<alloc.h>

OS/2 Win32 int heapfillfree(unsigned int fillvalue);

_heapmin Освобождает неиспользованное

пространство кучи

DOS UNIX Win16

OS/2 Win32 #include <malloc.h>

ANSI C++ ANSI C int _headpmin(void);

_heapset Заполняет свободные блоки кучи константами

UNIX Win16 #include<mallok.h>

OS/2 Win32 int _heapset (unsigned int fillvalue);

ANSI C

heapwalk Используется для перемещения по куче от узла к

узлу

DOS UNIX Win16

OS/2 Win32 #include<alloc.h>

ANSI C int heapwalk(struct heapinfo *hi);

_heapwalk Смотри _rtl_heapwalk
highvideo Устанавливает режим вывода символов высокой яркости

DOS #include<conio.h>

OS/2 Win32 void highvideo(void);

hypot,hypotl Вычисляет гипотенузу прямоугольного треугольника

hypot

#include<math.h>

DOS UNIX Win16 double hypot(double x,double y);

OS/2 Win32

---***----

hupotl #include<math.h>

long double hypotl(long double x,

DOS Win16 long double y);

OS/2 Win32

initEasyWin Инициализирует "удобный" Windous

используется только в 16-pазpядном

Win16 Windous

#include<io.h>

void _intEasyWin (void);

inp Читает байт из аппаратного порта

DOS Win16 #include<conio.h>

int inp(unsigned portid);

inport Считывает слово из аппаратного порта

DOS Win16 #include<dos.h>

int inport(int portid);

inportb Считывает байт из аппаратного порта

DOS Win16 #include<dos.h>

OS/2 unsigned char inportb(int portid);

inpw Считывает слово из аппаратного порта

DOS Win16 #include<conio.h>

OS/2 unsigned inpw(unsigned portid);

insline Вставляет в текстовое окно пустую строку

DOS #include <conio.h>

OS/2 Win32 void insline(void);

int86 Общее программное прерывание процессора 8086

DOS Win16 #include<dos.h>

OS/2 int int86(int intno,union REGS *inregs,

union REGS *outregs);

int86x Общий интерфейс с программными прерываниями

процессора 8086

DOS #include<dos.h>

Win32 int int86x(int intno, union REGS *inregs,

union REGS *outregs,

union SREGS *segregs);

intdos Интерфейс с прерываниями DOS

DOS Win16 #include<dos.h>

int intdos(union REGS *intregs,

union REGS *outregs);

intdosx Общий интерфейс с функциями прерывания DOS

DOS Win16 #include<dos.h>

int intdosx(union REGS *inregs,

union REGS *outregs,

struct SREGS *segregs);

intr Альтернативный интерфейс программных прерываний

процессора 8086

DOS Win16 #include<dos.h>

int intr(int intno,struct REGPACK *preg);

ioctl Управляет устройствами ввода-вывода

DOS UNIX Win16 #include<io.h>

int ioctl(int handle, int func[, void

*argdx, int argcx]);

isalnum Макрос классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int isalnum(int c);

ANSI C++ ANSI C

isalpha Макрос классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int isalpha(int c);

ANSI C++ ANSI C

isascii Макрос классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int isascii(int c);

isatty Проверяет тип устройства

DOS UNIX Win16 #include <io.h>

OS/2 Win32 int isatty(int handle);

iscntrl Макро классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int iscntrl(int c);

ANSI C++ ANSI C

isdigit Макро классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int isdigit(int c);

ANSI C++ ANSI C

isgraph Макро классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int isgraph(int c);

ANSI C++ ANSI C

islower Макро классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int islower(int c);

ANSI C++ ANSI C

isprint Макро классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int isprint(int c);

ANSI C++ ANSI C

ispunct Макро классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int ispunct(int c);

ANSI C++ ANSI C

isspace Макрос классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int isspace(int c);

ANSI C++ ANSI C

isupper Макро классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int isupper(int c);

ANSI C++ ANSI C

isxdigit Макро классификации символов

DOS UNIX Win16 #include<ctype.h>

OS/2 Win32 int isxdigit(int c);

ANSI C++ ANSI C

itoa Преобразует целое в строку

DOS Win16 #include <stdlib.h>

OS/2 Win32 char *itoa(int value, char *string,int radix);

kbhit Контролирует нажатие клавиши

DOS Win16 #include <conio.h>

OS/2 Win32 int kbhit(void);

labs Возвращает абсолютное значение числа типа long

DOS UNIX Win16 #include <math.h>

OS/2 Win32 long int labs(long int x);

ANSI C++ ANSI C

ldexp,ldexpl Вычисляет значение X x 2**exp

ldexp #include <math.h>

double ldexp(double x,int exp);

DOS UNIX Win16

OS/2 Win32

ANSI C++ ANSI C

---***---

ldexpl #include <math.h>

long double ldexpl(long double x, int exp);

DOS Win16

OS/2 Win32

ldiv Делит два числа типа long и возвращает частное

и остаток

DOS Win16

OS/2 Win32 #include<stdlib.h>

ANSI C++ ANSI C ldiv_t ldiv(long int numer, long int denom);

lfind Выполняет линейный поиск

DOS UNIX Win16 #include<stdlib.h>

OS/2 Win32 void *lfind(const void *key, const void

ANSI C++ ANSI C *base, size_t *num, size_t width, int

(_USENTRY *fcmp)(const void *,

const void *));

loсaleconv Возвращает указатель на текущую структуру local

DOS Win16 #include<locale.h>

OS/2 Win32 struct lconv *loсaleconv (void);

ANSI C++ ANSI C

loсaltime Превращает дату и время в структуру

DOS UNIX Win16 #include<time.h>

OS/2 Win32 struct tm *localtime(const time_t *timer);

ANSI C++ ANSI C

lock Блокирует файл коллективного доступа

DOS Win16 #include<io.h>

OS/2 Win32 int lock(int handle, long offset, long

length);

locking Устанавливает или сбрасывает блокировку файла

коллективного доступа

DOS Win16 #include <io.h>

OS/2 Win32 #include <sys\locking.h>

int locking(int handle, int cmd, long length);

log,logl Вычисляет натуральный логарифм х

logl #include<math.h>

double log(double x);

DOS UNIX Win16

OS/2 Win32

ANSI C++ ANSI C

---***---

logl #include<math.h>

long double log(long double x);

DOS Win16

OS/2 Win32

log10,log10l Вычисляет десятичный логарифм log10(x)

log10 #include<math.h>

double log10(double x);

DOS UNIX Win16

OS/2 Win32

ANSI C++ ANSI C

---***---

log10l #include<math.h>

long double log10l(long double x)

DOS Win16

OS/2 Win32

longjmp Выполняет нелокальный переход

DOS UNIX Win16 #include<setjmp.h>

OS/2 Win32 void longjmp(jmp_buf jmpb, int retval);

ANSI C++ ANSI C

lowvideo Устанавливает режим вывода символов низкой яркости

DOS #include <conio.h>

OS/2 Win32 void lowvideo(void);

_lrotl,_lrotr Выполняет циклический сдвиг влево

беззнакового целого типа long

DOS Win16 #include<stdlib.h>

OS/2 Win32 unsigned long_lrotl(unsigned long val,

int count);

---***---

DOS UNIX Win16 #include<stdlib.h>

OS/2 Win32 unsigned long_lrotr(unsigned long val,

ANSI C++ ANSI C int count);

lsearch Выполняет линейный поиск

DOS UNIX Win16 #include<stdlib.h>

OS/2 Win32 void *lsearch(const void *key, void *base,

ANSI C++ ANSI C size_t *num, size_t width, int

(_USENTRY*fcmp) (const void *, const

void *));

lseek Перемещает указатель файла

DOS UNIX Win16 #include<io.h>

OS/2 C++ Win32 long lseek(int handle, long offset,

int fromwhere)

ltoa Преобразует значение типа long в строку

DOS Win16 #include<stdlib.h>

OS/2 Win32 char *ltoa(long value,char *string,int radix);

_makepath Строит маршрут доступа из его компонентов

DOS Win16 #include<stdlib.h>

OS/2 Win32 void _makepath(char *path, const char

*drive, const char *dir, const char

*name, const char *ext);

malloc Выделяет оперативную память

DOS UNIX Win16 #include<stdlib.h>

OS/2 Win32 void *malloc(size_t size);

ANSI C++ ANSI C

matherr,_matherrl Функция обработки математических ошибок, модифицируемая пользователем

DOS Win16

OS/2 Win32 #include<math.h>

int matherr(struct exeption *e);

int_matherrl(struct_exceptionl *e);

max Возвращает большее из двух значений

DOS Win16 #include<stdlib.h>

OS/2 Win32 (type)max(a,b);

mblen Определяет длину многобайтового символа

DOS Win16 #include <stdlib.h>

OS/2 Win32 int mblen(const char *s, size_t n);

ANSI C++ ANSI C

mbstowcs Преобразует многобайтовую строку в массив

wchar_t

DOS Win16

OS/2 Win32 #include <stdlib.h>

ANSI C++ ANSI C size_t mbstowcs(wchar_t *pwcs, const char *s,

size_t n);

mbtowc Преобразует многобайтовый символ в код wchar_t

DOS Win16 #include <stdlib.h>

OS/2 Win32 int mbtowc(wchar_t *pwc, const char *s,

ANSI C++ ANSI C size_t n);

memccpy,_fmemccpy Копирует блок размером n байт

memccpy #include<mem.h>

Короткий вызов функции:

DOS UNIX Win16 void *memccpy(void *dest,const void *src,

OS/2 Win32 int c,size_t n);

---***---

_memccpy #inlcude<mem.h>

Длинный вызов функции:

DOS Win16 void far * far _fmemccpy(void far * dest,

const void far *src, int c, size_t n)

memchr,_fmemchr Просматривает n байт в поисках символа "c"

memchr #include<mem.h>

void *memchr(const void *s,int c, size_t n);

DOS UNIX Win16

OS/2 Win32

ANSI C++ ANSI C

---***---

_fmemchr #include<mem.h>

void far*far _fmemchr(const void far *s, int c,

DOS Win16 size_t n);

memcmp,_fmemcmp Сравнивает два блока размером n байт

memcmp #include<mem.h>

int memcmp(const void *s1, const void *s2,

DOS UNIX Win16 size_t n);

OS/2 Win32

ANSI C++ ANSI C

---***---

_fmemcmp #include<mem.h>

int far _fmemcmp(cons void far *sl,

DOS Win16 const void far *s2, size_t n)

memcpy,fmemcpy Копирует блок размером n байт

memcpy #include<mem.h>

void *memcpy(void *dest, const void *src,

DOS UNIX Win16 size_t n);

OS/2 Win32

ANSI C++ ANSI C

---***---

fmemcpy #include<mem.h>

void far *far_fmemcpy(void far*dest,

DOS Win16 const void far *src, size_t n);

memicmp,_fmemicmp Сравнивает n байт двух массивов символов, игнорируя различия регистров

DOS UNIX Win16

OS/2 Win32 #include<mem.

int memicmp(const void *s1, const void *s2,

size_t n)

---***---

_fmemicmp #include<mem.h>

int far _fmemicmp(const void far *s1,

DOS Win16 const void far *s2, size_t n)

Win32

memmove,_fmemmove Копирует блок размером n байт

DOS UNIX Win16 #include<mem.h>

OS/2 Win32 void *memmove(void *dest,const void *src,

ANSI C++ ANSI C size_t n);

---***----

DOS Win16 #include<mem.h>

void far * far _fmemmove (void far dest,

const void far *src , saze_t n)

memset,_fmemset Устанавливает значения n байт блока памяти

равными значению c

memset #include<mem.h>

void *memset(void *s,int c, size_t n)

DOS UNIX Win16

OS/2 Win32

ANSI C++ ANSI C

---***---

_fmemset #include<mem.h>

void far * far_fmemset(void far *s, int c,

DOS Win16 size_t n)

min Возвращает меньшее из двух значений

DOS Win16 #include<stdlib.h>

OS/2 Win32 (type) min(a,b)

mkdir Создает каталог

DOS UNIX Win16 #include <dir.h>

OS/2 Win32 int mkdir(const char *path);

MK_FP Формирует указатель с дальней адресацией

DOS Win16 #include<dos.h>

Win32 void far *MK_FP(unsigned seg, unsigned ofs);

mktemp Создает уникальное имя файла

DOS UNIX Win16 #include <dir.h>

OS/2 Win32 char *mktemp(char *template);

mktime Преобразует время к календарному времени

DOS Win16 #include <time.h>

OS/2 Win32 time_t mktime (struct tm *t);

ANSI C++ ANSI C

modf,modfl Разделяет число типа double или long double на

целую и дробную части

modf #include<math.h>

double modf(double x,double *ipart);

DOS UNIX Win16

OS/2 Win32

ANSI C++ ANSI C

---***---

modfl #include<math.h>

long double modfl(long double x,

DOS UNIX Win16 long double *ipart);

OS/2 Win32

ANSI C++ ANSI C

movedata Копирует n байт

DOS Win16 #include <mem.h>

void movedata(unsigned srcseg, unsigned srcoff,

unsigned dstseg, unsigned dstoff, size_t n);

movmem,fmovmem Перемещает блок размером length байт

DOS Win16 #include <mem.h>

void movmem(void *src, void *dest,unsigned

length);

void _fmovmem(const void far *src,

void far *dest, unsigned length);

movetext Копирует текст на экране из одного окна в другое

DOS #include <cohio.h>

OS/2 Win32 int movetext(int left,int top,

int right,int bottom,

int destleft,int desttop);

_msize Возвpащает pазмеp кучи блоков

OS/2 Win32 #include<malloc.h>

size_t _msize(void *block);

normvideo Устанавливает нормальную яркость для символов

DOS Win16 #inсlude <conio.h>

OS/2 Win32 void normvideo(void);

offsetof Выдает байт принадлежности к группе

DOS UNIX Win16 #include<stddef.h>

OS/2 Win32 size_t offsetof(struct_type,struct_member);

ANSI C++ ANSI C

_open Смотри _rtl_open.
open Открывает файл для чтения или записи

DOS UNIX Win16 #include<fcntl.h,io.h>

OS/2 Win32 int open(const char *path,int access

[,unsigned mode]);

opendir Открывает поток каталога для чтения

DOS UNIX Win16 #include <dirent.h>

OS/2 Win32 DIR *opendir(char *dirname);

outp Выводит байт в аппаратный порт

DOS Win16 #include <conio.h>

int outp(unsigned portid, int value);

outport,outportb Выводит слово или байт в аппаратный порт

DOS Win16 #include <dos.h>

void outport(int portid,int value)

void outportb(int portid, unsigned char value);

outpw Выводит слово в аппаратный порт

DOS Win16 #include <conio.h>

unsigned outpw(unsigned portid,unsigned

value);

Назад | Содержание | Вперед



R79_3.shtml


Глава 6. Справочник по библиотеке Borland C++ 4.0

parsfnm Анализирует имя файла

DOS Win16 #include <dos.h>

char *parsfnm(const char *cmdline,

struct fcb *fcb, int opt);

_pclose Ожидает объекта управляющего окончанием работы

OS/2 Win32 #include <stdio.h>

int _pclose(FILE * steam);

peek Возвращает слово памяти с адресом

segment:offset

DOS Win16

#include <dos.h>

int peek (unsigned segment, unsigned offset);

peekb Возвращает байт памяти c адресом segment:offset

DOS Win16 #include <dos.h>

OS/2 char peekb (unsigned segment, unsiged

offset);

perror Выводит системное сообщение об ошибке

DOS UNIX #include <stdio.h>

OS/2 Win32 void perror(const char *s);

ANSI C++ ANSI C

_pipe Создает объект записи/чтения

OS/2 Win32 #include<io.h>

#include<fcntl.h>

int _pipe (int *handles, unsigned int

syze,int mode);

poke Записывает целочисленное значение в память по

адресу segment:offset

DOS Win16 #include <dos.h>

void poke(unsigned segment, unsigned offset,

int value);

pokeb Записывает заданный байт в память по адресу

segment:offset

DOS Win16 #include <dos.h>

void pokeb(unsigned segment,

unsigned offset, char value);

poly,polyl Формирует полином из заданных аргументов

poly #include<math.h>

double poly (double x, int degree,

DOS UNIX Win16 double coeffs[]);

OS/2 Win32

---***---

polyl #include<math.h>

long double polyl(long double x, int degree,

DOS Win16 long double coeffs[]);

OS/2 Win32

_popen Создает объект управляющий процессом.

#include <stdio.h>

OS/2 Win32 FILE * _popen(const char *command, const

char * mode);

pow,powl Вычисляет значения х в степени y

pow #include<math.h>

double pow(double x, double y);

DOS UNIX Win16

OS/2 Win32

ANSI C++ ANSI C

---***---

powl #include<math.h>

long double powl(long double x, double y);

DOS Win16

OS/2 Win32

pow10,pow10l Вычисляет значение 10 в степени p

pow10 #include<math.h>

double pow10(int p);

DOS UNIX Win16

OS/2 Win32

---***---

pow10l #include<math.h>

long double pow10l(int p);

DOS Win16

OS/2 Win32

printf Осуществляет форматный вывод в поток stdout

DOS UNIX #include<stdio.h>

OS/2 Win32 int printf(const char *format[,аргумент,...]);

ANSI C++ ANSI C

putc Выводит символ в поток

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int putc (int c, FILE *stream);

ANSI C++ ANSI C

putch Выводит символ на экран

DOS Win16 #include<conio.h>

OS/2 Win32 int putch(int c);

putchar Выводит символ в поток stdout

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int putchar (int c);

ANSI C++ ANSI C

putenv Добавляет строку в текущее описание среды

DOS UNIX Win16 #include<stdib.h>

OS/2 Win32

int putenv(const char *name);

puts Выводит строку в поток stdout

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int puts (const char *s);

ANSI C

puttext Копирует текст из памяти на экран в текстовом

режиме

DOS

OS/2 Win32 #include <conio.h>

int puttext(int left, int top, int right,

int bottom, void *source);

putw Выводит целое в поток

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int putw (int w,FILE *stream);

qsort Производит сортировку по ускоренному алгоритму

DOS UNIX Win16 #include<stdlib.h>

OS/2 Win32 void qsort (void *base, size_t nelem

ANSI C++ ANSI C size_t width,int(*fcmp)

(const void *,const void *));

raise Посылает программный сигнал выполняющейся

программе

DOS UNIX Win16

OS/2 Win32 #include<signal.h>

ANSI C++ ANSI C int raise(int sig);

rand Генератор случайных чисел

DOS UNIX Win16 #include <stdlib.h>

OS/2 Win32

ANSI C++ ANSI C int rand(void);

random Генератор случайных чисел

DOS Win16 #include<stdlib.h>

OS/2 Win32 int random(int num);

randomize Инициализирует генератор случайных чисел

DOS Win16 #include<stdlib.h>

OS/2 Win32 #include<time.h>

ANSI C++ ANSI C void randomize(void);

_read Смотри _rtl_read
read Читает из файла

DOS UNIX Win16 #include <io.h>

OS/2 Win32 int read(int handle,void *buf,unsigned len);

readdir Считывает текущий элемент потока каталога

DOS UNIX Win16 #include <dirent.h>

OS/2 Win32 struct dirent readdir(DIR *dirp);

realloc Перераспределяет основную память.

DOS UNIX Win16 #include<stdlib.h>

OS/2 Win32 void *realloc(void *block, size_t size);

ANSI C++ ANSI C

remove Удаляет файл

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int remove(const char *filename);

ANSI C++ ANSI C

rename Переименовывает файл

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int rename (const char*oldname,

ANSI C++ ANSI C const char*newname);

rewind Устанавливает указатель текущего байта

на начало файла

DOS UNIX Win16

OS/2 Win32 #include <stdio.h>

ANSI C++ ANSI C void rewind(FILE *stream);

rewinddir Устанавливает указатель на первый элемент

каталога

DOS UNIX Win16

OS/2 Win32 #include <dirent.h>

ANSI C++ ANSI C void rewinddir(DIR *dirp);

rmdir Удаляет каталог файлов DOS

DOS UNIX Win16 #include <dir>

OS/2 Win32 int rmdir (const char *path);

rmtmp Уничтожает временные файлы

DOS Win16 #include <stdio.h>

OS/2 C++ Win32 int rmtmp(void);

_rot,rotl Поразрядный сдвиг беззнакового целого числа

влево

DOS Win16

OS/2 Win32 #include <stdlib.h>

unsigned _rotl(unsigned value, int count);

unsigned _rotr(unsigned value, int count);

_rtl_chmod Пpисваивает и выдает атpибуты файла

DOS Win16 #include <dos.h>

Win32 #include <io.h>

int _rtl_mode (const char *path, int func

[, int attrib]);

rtl_close Закpывает файл

DOS Win16 #include <io.h>

Win32 int _rtl_close(int handle);

_rtl_creat Создает новый файл или записывает его на

уже имеющийся

DOS

Win16 Win32 #include <dos.h>

#include <io.h>

int _rtl_creat_(const char *path, int

attriib);

_rtl_heapwalk Пpовеpяет кучу один за одним

#include <malloc.h>

Win32 int _rtl_heapwalc (_HEAINFO #hi);

_rtl_open Открывает существующий файл для чтения

и записи.

DOS Win16

Win32 #include<fcntl.h>

#include<share.h>

#include<io.h>

int _rtl_open(const char *filename, int

oflags);

_rtl_open Читает из файла

DOS Win16 #include <io.h>

#include <dos.h>

int _rtl_read (int hadle,void *buf,

unsigned len);

_rtl_write Записывает в файл

DOS Win16 #include <io.h>

Win32 int _rtl_write(int handle, void *buf,

unsigned len);

scanf Выполняет форматный ввод из потока stdin

DOS UNIX #include <stdio.h>

OS/2 Win32 int scanf(const char *format[,adress,...]);

ANSI C++ ANSI C

_searchenv Поиск файла по маршруту, указанному в окружении

DOS Win16 #include <stdlib.h>

OS/2 Win32 char *_searchenv(const char *file,

const char *varname, char *buf);

searchpath Ищет маршрут доступа к файлу в DOS

DOS Win16 #include <dir.h>

OS/2 Win32 char *searchpath (const char *file);

_searchstr Устанавливает каталог для файла.

DOS Win16 #include<stdlib.h>

OS/2 Win32 void _searhstr(const char *file, const

char *ipath,char *buf);

segread Читает сегментные регистры

DOS Win16 #include <dos.h>

Win32 void segread(struct SREGS *segp);

ANSI C++

setbuf Устанавливает буферизацию потока

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 void setbuf(FILE *stream, char *buf);

ANSI C++ ANSI C

setcbrk Устанавливает режим проверки control-break

DOS Win16 #include<dos.h>

OS/2 int setcbrk(int cbrkvalue);

_setcursortype Устанавливает наличие и вид куpсоpа

DOS #include<conio.h>

OS/2 Win32 void _setcurcortype(int cur_t);

setdate Смотpи _dos_getdate.
setdisk Смотpи getdisk.
setdta Устанавливает адрес передачи диска

DOS Win16 #include<dos.h>

void setdta(char far *dta);

settime Смотpи getftime.
setjmp Выполняет нелокальный переход

DOS UNIX Win16 #include <setjmp.h>

OS/2 Win32 int setjmp(jmp_buf env);

ANSI C++ ANSI C

setlocale Определяет локализацию

DOS Win16 #incude <locale.h>

OS/2 Win32 char*setlocale (int category, char*locale);

ANSI C++ ANSI C

setmem Заполняет область памяти определенным символом

DOS UNIX Win16 #include <mem.h>

OS/2 Win32 void setmem(void *dest, unsigned

length, char value);

setmode Устанавливает тип открытого файла

DOS Win16 #include <fсntl.h>

OS/2 Win32 int setmode(int handle, int amode);

setvbuf Назначает буферизацию потока

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int setvbuf(FILE *stream, char *buf, int type,

ANSI C++ ANSI C size_t size);

setvect Смотpи getvect
setverify Устанавливает проверочный флаг в DOS

DOS Win16 #include <dos.h>

OS/2 Win32 void setverify(int value);

signal Определяет действия по сигналу

DOS UNIX Win16 #include <signal.h>

OS/2 Win32 void(*signal(int sig,void(*func)

ANSI C++ ANSI C (int sig[,intsubocde])))(int);

sin,sinl Вычисляет тригонометрическую функцию синуса

sin #include <math.h>

double sin(double x);

DOS UNIX Win16

OS/2 Win32

----***----

sinl #include <math.h>

long double sinl(long double x);

DOS Win16

OS/2 Win32

sinh,sinhl Вычисляет гиперболическую функцию синуса

sinh #include <math.h>

double sinh(double х);

DOS UNIX Win16

OS/2 Win32

ANSI C++ ANSI C

---***---

sinhl #include <math.h>

long double sinhl(long double x)

DOS Win16

OS/2 Win32

sleep Приостанавливает выполнение процесса на

указанный интервал времени (в секундах)

DOS UNIX

OS/2 Win32B #include <dos.h>

void sleep(unsigned seconds);

sopen Открывает разделяемый файл

DOS UNIX Win16 #include <fcntl.h>

OS/2 Win32 #include <sys\stat.h>

#include <share.h>

#include <io.h>

int sopen(char *path, int access,

int shflag, int mode);

spawnl, (...) Создает и запускает порожденный процесс

spawnle

spawnlp #include <process.h>

spawnlpe #include <stdio.h>

spawnnv int spawnl(int mode, char *path, char

spawnve *arg0, arg1, ...,argn, NULL);

spawnvp int spawnle(int mode, char *path, char

spawnvpe *arg0, arg1, ..., argn, NULL, char *envp[]);

OS int spawnlp(int mode, char *path, char

OS/2 Win32 *arg0, arg1, ...,argn,NULL);

int spawnlpe(int mode, char *path, char

*arg0, arg1, ..., argn, NULL, char

*envp[]);

int spawnv(int mode, char *path, char

*argv[]);

int spawnve(int mode, char *path, char

*argv[], char *envp[]);

int spawnvp(int mode, char *path,

char argv[]);

int spawnvpe(int mode, char *path,

char *argv[], char envp[]);

_splitpath Разбивает полное имя маршрута на компоненты

DOS Win16 #include <stdlib.h>

OS/2 Win32 void_splitpath(const char *path, char

*drive, char *dir,char *name,char *ext);

sprintf Выполняет форматный вывод в строку

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int sprintf(char *buffer,

ANSI C++ ANSI C cnst char *format[,аргумент,...]);

sqrt,sqrtl Для аргумента, выраженного натуральным числом

вычисляет положительный квадратный корень входного значения

sqrt #include <math.h>

double sqrt(double х);

DOS UNIX Win16

OS/2 Win32

ANSI C++

---***---

sqrtl #include <math.h>

lond double sqrtl(long double x);

DOS Win16

OS/2 Win32

srand Инициализирует генератор случайных чисел

DOS UNIX Win16 #include <stdlib.h>

OS/2 Win32 void srand(unsigned seed);

ANSI C++ ANSI C

sscanf Выполняет форматированный ввод из строки

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int sscanf(const char *buffer,

ANSI C++ ANSI C const char *format[,addres,...]);

stackavail Получает объем доступной памяти

DOS Win16 #include <malloc.h>

OS/2 Win32 size_t stackavail(void);

stat Смотpи fstat
_status87 Выдает статус обработки чисел с плавающей

точкой

DOS Win16 #include <float.h>

OS/2 Win32 unsigned int _status87(void);

stime Устанавливает системные дату и время

DOS UNIX Win16 #include <time.h>

OS/2 int stime(time_t *tp);

stpcpy Копирует одну строку в другую

DOS UNIX Win16 #include <string.h>

OS/2 Win32 char *stpcpy(char *dest, const char *src);

strcat,_fstrcat Добавляет одну строку к другой

#include <string.h>

DOS UNIX Win16 Короткий вызов функции:

OS/2 Win32 char *strcat(char *dest, const char *src);

ANSI C++ ANSI C Длинный вызов функции:

char far * far_fstrcat(char far *dest,

const char far *src);

strchr,_fstrchr Ищет в строке 1-ое вхождение заданного символа

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C char *strchr(const char *s, int c);

Длинный вызов функции:

char far *far_fstrchr(const char far *s,int c);

strcmp,_fstrcmp Сравнивает одну строку с другой

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C char *strcpy(char *dest, const char *src);

Длинный вызов функции:

int far _fstrcmp(const char far *s1, const

char far *s2);

strcmpi Сравнивает одну строку с другой без различения

больших и маленьких букв

DOS UNIX #include <string.h>

OS/2 Win32 int strcmpi(const char *s1, const char *s2);

strcoll Сравнивает две строки

DOS Win16 #include <string.h>

OS/2 Win32 int strcoll(char* s1,char* s2)

ANSI C++ ANSI C

strcpy,_fstrcpy Копирует одну строку в другую

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C char *strcpy(char *dest, const char *src);

Длинный вызов функции:

char far * _fstrcpy(char far *dest, const

char far *src);

strcspn,_fstrcspn Ищет в строке первый сегмент, не содержащий ни

одного символа из заданного набора символов

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C size_t strcspn(const char *s1, const char *s2);

Длинный вызов функции:

size_t far _fstrcspn(const char far *s1,

const char far *s2);

_strdate Преобразует текущую дату в строку

DOS Win16 #include <time.h>

OS/2 Win32 char *_strdate(char *buf);

strdup,_fstrdup Копирует строку во вновь создаваемую область

памяти

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

char *strdup(const char *s);

Длинный вызов функции:

char far *far _fstrdup(const char far *s);

_strerror Позволяет адаптировать сообщение об ошибке

DOS Win16 #include <string.h>

OS/2 Win32 char *_strerror(const char *s);

strerror Возвращает указатель на строку сообщения об

ошибке

DOS Win16

OS/2 Win32 #include <string.h>

ANSI C++ ANSI C char *strerror(int errnum);

strftime Форматирует время для выходных данных

DOS UNIX Win16 #inciude <time.h>

OS/2 Win32 size_t_cdecl strftime(char*s, size_t

ANSI C++ ANSI C maxcsize, const char*fmt,const struct

tm*t);

stricmp,_fstricmp Cравнивает одну строку с другой без различения

больших и маленьких букв

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C int stricmp(const char *s1, const char *s2);

Длинный вызов функции:

int far _fstricmp(const char far *s1,

const char far *s2);

strlen,_fstrlen Вычисляет длину строки

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C size_t strlen(const char *s);

Длинный вызов функции:

size_t far _fstrlen(const char far *s);

strlwr,_fstrlwr Преобразует в строке большие буквы (буквы верхнего регистра) в маленькие буквы (буквы нижнего регистра)

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C char *strlwr(char *s);

Длинный вызов функции:

char far *far _fatrlwr(char char far *s);

strncat,_fstrncat Добавляет часть одной строки к другой

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C char *strncat(char *dest, const char*src,

size_t maxlen);

Длинный вызов функции:

char far * far _fstrncat(char far *dast,

const char far *src,

size_t maxlen)

strncmp,_fstrrncmp Сравнивает часть одной строки с частью другой

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C int strncmp(const char *s1, constchar *s2,

size_t maxlen);

Длинный вызов функции:

int far _fstrncmp(const char far *s1,

const char far *s2,

size_t maxlen)

strncmpi Сравнивает часть одной строки с частью другой

без различения больших и маленьких букв

DOS UNIX Win16 #include <string.h>

int strncmpi(const char *s1, const char *s2,

size_t n);

strncpy,_fstrncpy Копирует заданное число байт из одной строки в

другую, при необходимости производится отбрасывание или приращение

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C char *strncpy(char *des, const char *src,

size_t maxlen);

Длинный вызов функции:

char far * far _fstrncpy(char far *dest,

const char far *src, size_t maxlen)

strnicmp,_fstrnicmp Сравнивает часть одной строки с частью другой

без учета различия больших и маленьких букв

DOS Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C int strnicmp(const char *s1,

const char *s2, size_t maxlen);

Длинный вызов функции:

int far _fstrnicmp(const char far *s1,

const char far *s2, size_t maxlen);

strnset,_fstrnset Заменяет заданное количество символов в строке

на указанный символ

DOS Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

char *strnset(char *s, int ch,size_t n);

Длинный вызов функции:

char far * far _fstrnset(char far *s, int ch,

size_t n);

strpbrk,_fstrpbrk Ищет в строке первое вхождение любого символа

из переданного функции набора символов

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C char *strpbrk(const char *s1, const char *s2);

Длинный вызов функции:

char far * far _fstrpbrk(const char far *s1,

const char far *s2);

strrchr,_fstrrchr Ищет в строке последнее вхождение заданного

символа

DOS UNIX Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C char *strrchr(const char *s, int c);

Длинный вызов функции:

char far * _fstrrchr(const char far *s, int c);

strrev,_fstrrev Перевертывает строку

DOS Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

char *strrev(char *s);

Длинный вызов функции:

char far * far _fstrrev(char far *s);

strset,_fstrset Заменяет все символы строки на заданный символ

DOS Win16 #include <string.h>

OS/2 Win32 Короткий вызов функции:

char *strset(char *s, int ch);

Длинный вызов функции:

char far * far _fstrset(char far *s, int ch);

strspn,_fstrspn Ищет в строке первый сегмент, который является

подмножеством заданного функции набора символов

DOS UNIX Win16

OS/2 Win32

ANSI C++ ANSI C #include <string.h>

Короткий вызов функции:

size_t strspn(const char *s1, const char *s2);

Длинный вызов функции:

size_t far _fstrspn(const char far *s1, const

char far *s2);

strstr,_fstrstr Ищет в строке вхождение заданной подстроки

DOS UNIX Win16 #include < string.h>

OS/2 Win32 Короткий вызов функции:

ANSI C++ ANSI C char *strstr(const char *s1, const char *s2);

Длинный вызов функции:

char far * far _fstrstr(const char far *s1,

const char far *s2);

_strtime Преобразует текущее время в строку

DOS UNIX Win16 #include <time.h>

OS/2 Win32 char *_strtime(char *buf);

ANSI C++ ANSI C

strtod,_strtold Преобразует строку в числовое значение типа

double

strtod

#include <stdlib.h>

DOS UNIX Win16 double strtod(const char *s, char **endptr);

OS/2 Win32

ANSI C++ ANSI C

---***---

_strtold #include <stdlib.h>

long double _strtold(const char *s, char

DOS Win16 **endptr);

OS/2 Win32

strtok,_fstrtok Ищет в первой строке лексемы, которые разделены

любым из символов, входящих во вторую строку

DOS UNIX Win16

OS/2 Win32 #include <string.h>

ANSI C++ ANSI C Короткий вызов функции:

char *strtok(char *s1, const char *s2);

Длинный вызов функции:

char far * far _fstrtok(char far *s1,

const char far *s2);

strtol Преобразует строку в числовое значение типа

long

DOS Win16

OS/2 Win32 #include <stdlib.h>

ANSI C++ ANSI C long strtol(const char *s, char **endptr,

int radix);

_strtold Смотpи strtod
strtoul Преобразует строку в число типа usigned long c

заданным основанием

DOS Win16

OS/2 Win32 #include <stdlib.h>

ANSI C++ ANSI C unsigned long strtoul(const char *s,

char **endptr, int radix);

strupr,_fstrupr Преобразует маленькие буквы (буквы нижнего ре-

гистра) в строке в большие (верхнего регистра)

DOS Win16

OS/2 Win32 #include <string.h>

ANSI ANSI C Короткий вызов функции:

char *strupr(char *s);

Длинный вызов функции:

char far * far _fstrupr(char far *s);

strxfrm Трансформирует часть строки

DOS Win16 #include<string.h>

OS/2 Win32 size_t strxfrm(char*s1,char*s2,size_t n);

ANSI C++ ANSI C

swab Меняет местами байты

DOS UNIX Win16 #include <stdlib.h>

OS/2 Win32 void swab(char *from, char *to, int

nbytes);

system Вызывает команду DOS

DOS UNIX #include <stdlib.h>

OS/2 Win32 int system(const char *command);

tan,tanl Вычисляет тангенс

tan #include <math.h>

double tan(double x);

DOS UNIX Win16

OS/2 Win32

ANSI C++ ANSI C

---***---

tanl #include <math.h>

long double tanl(long double x);

DOS UNIX Win16

OS/2 Win32

tanh,tanhl Вычисляет гиперболический тангенс

tanh #include <math.h>

double tanh(double x);

---***---

tanhl #include <math.h>

версия long double tanhl(long double x);

DOS Win16

OS/2 Win32

tell Получает текущую позицию указателя файла

DOS UNIX Win16 #include <io.h>

OS/2 Win32 ANSI C long tell(int handle);

tempnam Создает уникальное имя файла в специфицированном каталоге

DOS UNIX Win16

OS/2 Win32 #include <stdio.h>

char *tempnam(char *dir, char *prefix);

textattr Устанавливает текстовые атрибуты

DOS #include <conio.h>

OS/2 Win32 void textattr(int newattr);

textbackground Устанавливает новый цвет фона

DOS #include <conio.h>

OS/2 Win32 void textbackground(int newcolor);

textcolor Устанавливает новый цвет символов в текстовом

режиме

DOS

OS/2 Win32 #include <conio.h>

void textcolor(int newcolor);

textmode Переводит экран в текстовый режим

DOS #include <conio.h>

OS/2 Win32 void textmode(int newmode);

time Получает время дня

DOS UNIX Win16 #include <time.h>

OS/2 Win32 time_t time(time_t *timer);

ANSI C++ ANSI C

tmpfile Открывает временный файл в двоичном режиме

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 FILE *tmpfile(void);

ANSI C++ ANSI C

tmpnam Создает уникальное имя файла

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 char *tmpnam(char *s);

ANSI C++ ANSI C

toascii Преобразует символ в формат ASCII

DOS UNIX Win16 #include <ctype.h>

OS/2 Win32 int toascii(int c);

_tolower Преобразует символы в символы нижнего регистра

DOS UNIX Win16 #include <ctype.h>

OS/2 Win32 int _tolower(int ch);

tolower Преобразует символы в символы нижнего регистра

DOS UNIX Win16 #include <ctype.h>

OS/2 Win32 int tolower(int ch);

ANSI C++ ANSI C

_toupper Преобразует символы в символы верхнего регистра

DOS UNIX Win16 #include <ctype.h>

OS/2 Win32 int _toupper(int ch);

toupper Преобразует символы в символы верхнего регистра

DOS UNIX Win16 #include <ctype.h>

OS/2 Win32 int toupper(int ch);

ANSI C++ ANSI C

tzset Устанавливает значение глобальных переменных

daylight, timezone и tzname

DOS UNIX Win16

OS/2 Win32 #include <time.h>

void tzset(void);

ultoa Преобразует значение типа unsigned long в строку

DOS Win16

OS/2 Win32 #include <stdlib.h>

char *ultoa(unsigned long value,

char *string, int radix);

umask Устанавливает маску, разрешающую чтение/запись

DOS Win16 #include <io.h>

OS/2 Win32 unsigned umask(unsigned mode);

ungetc Возвращает символ обратно во входной поток

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int ungetc(int c, FILE *stream);

ANSI C++ ANSI C

ungetch Возвращает символ обратно в буфер клавиатуры

DOS UNIX #include <conio.h>

OS/2 Win32 int ungetch(int ch);

unixtodos Преобразует дату и время из UNIX к формату DOS

DOS Win16 #include <dos.h>

OS/2 Win32 void unixtodos(long time, struct date *d,

struct time *t);

unlink Уничтожает файл

DOS UNIX Win16 #include<io.h>

OS/2 Win32 int unlink(const char *filename);

unlock Разрешает совместное использование файла

DOS Win16 #include <io.h>

OS/2 Win32 int unlock(int handle, long offset,

long length);

utime Устанавливает время и дату работы с файлом

DOS UNIX Win16 #include <utime.h>

OS/2 Win32 int utime(char *path, struct utimebuf *times);

va_arg
va_end
va_start
Позволяет использовать переменный список

аргументов

#include <stdarg.h>

DOS UNIX Win16 void va_start(va_list ap, lastfix);

OS/2 Win32 type va_arg(va_list ap,type);

ANSI C++ ANSI C void va_end(va_list ap);

vfprintf Пересылает форматированный вывод в поток

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int vfprintf(FILE *stream, const char *format,

ANSI C++ ANSI C va_list arglist);

vfscanf Осуществляет форматированный ввод из потока

DOS UNIX Win16 #include <stdio.h>

OS/2 Win32 int vfscanf(FILE *stream, const char

*format, va_list arglist);

vprintf Пересылает форматированный вывод в stdout

DOS UNIX #include <stdarg.h>

OS/2 C++ Win32 int vprintf(const char *format,

ANSI C++ va_list arglist);

vscanf Осуществляет форматированный ввод из stdin

DOS UNIX Win16 #include <stdargio.h>

OS/2 Win32 int vscanf(const char *format,va_list

arglist);

vsprintf Посылает форматированный вывод в строку

DOS UNIX Win16 #include <stdarg.h>

OS/2 Win32 int vsprintf(char *buffer,const char *format,

ANSI C++ ANSI C va_list arglist);

vsscanf Осуществляет форматированный ввод из потока

DOS UNIX Win16 #include <stdarg.h>

OS/2 Win32 int vsscanf(const char *buffer,

const char *format, va_list arglist);

wait Пpиостанавливает один и более подпpоцессов

пpи их выполнении.

OS/2 Win32 #include <process.h>

int wait (int *statloc)

wcstombs Преобразует массив типа wchar_t в байтовую

строку

DOS UNIX Win16 #include <stdlib.h>

OS/2 Win32 size_t wcstombs(char *s,const wchar_t *pwcs,

ANSI C++ ANSI C size_t n);

wctomb Преобразует код типа wchar_t в многобайтовый

символ

DOS UNIX Win16

OS/2 Win32 #include <stdlib.h>

ANSI C++ ANSI C int wctomb(char *s, wchar_t wc);

wherex Возвращает горизонтальную позицию курсора внутри окна

DOS Win16 #include <conio.h>

OS/2 Win32 int wherex(void);

wherey Возвращает вертикальную позицию курсора внутри

окна

DOS Win16 #include <conio.h>

OS/2 Win32 int wherey(void);

window Описывает активное в текстовом режиме окно

DOS #include <conio.h>

OS/2 Win32 void window(int left, int top, int right,

int bottom);

_write Смотpи _rtl_write
write Записывает в файл

DOS UNIX Win16 #include<io.h>

OS/2 Win32 int write(int handle, void *buf, unsigned len);

Назад | Содержание | Вперед



Работа программ с оверлеями


Программа управления оверлеями (VROOMM, или Virtual Run-time

Object-Oriented Memory Manager) выполняет за вас большую часть

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

этого же модуля и из базового модуля, но не из других модулей.

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

при активизации занимают один и тот же участок физической памяти.

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

Эта обычная схема не обеспечивает достаточной гибкости. Она

требует полного учета всех возможных обращений между модулями

программы и, соответственно, планируемой вами, группировки оверлеев. Если вы не можете разбить вашу программу в соответствии со

взаимозависимостью обращений между ее модулями, то вы не сможете

и разбить ее на оверлеи.

Схема VROOMM совершенно иная. Она обеспечивает динамический

свопинг сегментов. Основной единицей свопинга является сегмент.

Сегмент может состоять из одного или нескольких модулей. И что

еще более важно, любой сегмент может вызывать любой другой сегмент.

Вся память делится на базовую область и область свопинга.

Как только встречается вызов функции, которая не находится ни в

базовой, ни в области свопинга, сегмент, содержащий вызываемую

функцию, помещается в область свопинга, возможно, выгружая оттуда

при этом другие сегменты. Это мощное средство - подобное виртуальной программной памяти. От вас больше не требуется разбивать

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

Что происходит, когда возникает необходимость поместить сегмент в область свопинга? Если эта область имеет достаточно свободного места, то данная задача выполняется просто. Если же нет,

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




сегменты для выгрузки? Действующий здесь алгоритм очень сложен.

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

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

там требуемого сегмента. Такой метод называется динамическим свопингом.

Чем больше памяти выделено для области свопинга, тем лучше

работает программа. Область свопинга работает как кэш-память: чем

больше кэш, тем быстрее работает программа. Наилучшие значения

размера области свопинга определяются размерами рабочего множества данной программы.

После загрузки оверлея в память он помещается в оверлейный

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

оверлейного буфера вычисляется и устанавливается при загрузке

программы, но его можно изменить при помощи глобальной переменной

_ovrbuffer. Если достаточный размер памяти недоступен, то появляется либо сообщение об ошибке DOS ("Program too big to fit in memory" - "Программа слишком велика для имеющейся памяти").

Важной возможностью программы управления оверлеями является

ее способность при удалении моделей из оверлейного буфера выполнять их свопинг с дополнительной расширенной памятью. Следующий

раз, как только данный модуль понадобится, он в этом случае будет

не считываться с диска, а просто копироваться из этой памяти. Это

существенно ускоряет свопинг.

При использовании оверлеев память распределяется, как показано на следующем рисунке:


Работа с администратором документа и отображаемыми элементами


TDocument имеет две функции для работы с отображаемыми элементами - NotifyViews и QueryViews, для которых указывается три

параметра (событие, параметр события, и TView*). Последний параметр позволяет вам исключить из запроса или уведомления и передать функции указатель на отображаемый элемент. Эти две функции

являются основными средствами передачи информации между документом и его отображаемыми элементами.

Обе функции могут работать с таблицами реакции отображаемого

элемента. Функцию NotifyViews можно использовать для уведомления

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

вызывает с теми же параметрами функции NotifyViews всех дочерних

документов. После этого событие и параметр передается отображаемым элементам документа. Функция возвращает булевское значение,

передаваемое соответствующим отображаемым элементом.

QueryViews также передает событие и сопровождающий параметр,

но вместо True или False возвращает указатель на первый отображаемый документ, возвращающий True. Это позволяет найти отображаемый элемент, отвечающий некоторым условиям, а затем выполнить с

ним некоторые действия. QueryViews останавливается на первом

отображаемом элементе, возвращающим True.



Работа с буфером Clipboard


Чтобы скопировать элемент в буфер Clipboard, позиционируйте

на элементе курсор, нажмите клавишу Ins для его подсветки, затем

нажмите клавиши Shift+F3. Чтобы вставить содержимое буфера в окно

или диалоговое окно, нажмите Shift+F4. Выводится диалоговое окно

Pick, содержащее список всех элементов буфера Clipboard и набор

кнопок с зависимой фиксацией, позволяющих вам выполнять различным

образом вставку элементов: String, Location и Contents. Это позволяет вам интерпретировать элемент, как вставляемый одним из

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

Для вставки элемента в диалоговое окно, подсветите элемент,

выделите соответствующую категорию, затем нажмите клавишу Enter

или активизируйте кнопку OK (для редактирования записи) или Paste

(если вы хотите отредактировать запись).

Выбор команды View Clipboard выводит на экран окно Clipboard, в котором перечисляются все вырезанные элементы.

[*] Clipboard

Module : @#TCDEMO#36 nlines ^

Inspector : nlines 0 (0x0)

Module : @#TCDEMO#38 totalcharacters

Inspector : totalcharacters 0 (0x0)

v

< >

В левом поле этого окна описывается тип записи, за которым

следует двоеточие и вырезанный элемент. Если вырезанный элемент

представляет собой выражение из окна Watch, переменную из окна

Inspector или данные, регистр или флаг из окна CPU то за элемен-

том следует его значение или значения.

Тип Описание

Address Адрес без соответствующих данных или кода.
Control flag Значение управляющего флага сопроцессора.
Coprocessor Регистр арифметического сопроцессора 80х87.
CPU code Адрес и список байт выполняемых инструкций из

области кода окна CPU.

CPU data Адрес и список байт данных в памяти из области

данных в окне CPU или в окне Dump.

CPU flag Значение флага ЦП из области флагов окна CPU.
CPU register Имя регистра и значение из области регистров

окна CPU или окна Register.

CPU stack Исходная позиция и кадр стека из области стека

окна CPU.

Expression Выражение из окна Watches.
File Позиция в файле (в окне File), которая не является модулем в программе.
Inspector Одно из следующих:

имя переменной из окна Inspector;

значение константы из окна Inspector или Watch;

регистровая переменная окна Inspector.;

битовое поле окна Inspector.

Module Содержимое модуля, включая позицию в исходном

коде, аналогично переменной из окна Module.

Status flag Значение флага состояния сопроцессора 80х87.
String Текстовая строка, например, отмеченный блок из

окна File.

При вставке элементов из буфера Clipboard их тип должен со-

ответствовать типу поля ввода. SpeedMenu окна Clipboard содержит

следующие команды:

Команда Описание

Inspect Позиционирует курсор в то окно, из которого был

извлечен элемент.

Remove Удаляет подсвеченный элемент или элементы. Тот

же эффект для подсвеченного элемента имеет клавиша Del.

Delete all Удаляет все в буфере Clipboard.
Freeze Приостанавливает динамическое обновление элемента Clipboard.



Работа с контекстами устройств


При работе с GDI Windows для доступа ко всем устройства, от

окон до принтеров и графопостроителей, следует использовать контекст устройства (DC) - поддерживаемую GDI структуру, которая содержит важную информацию об устройстве (основной и фоновый цвет,

шрифт, палитру и др.). ObjectWindows 2.0 инкапсулирует информацию

контекста устройства в нескольких классах контекста. Для всех

этих классов базовым классом является TDC. TDC содержит большую

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



Работа с меню


Команды глобальных меню Turbo Debugger выводятся в верхней

части экрана в строке меню. Если вы не находитесь в диалоговом

окне, то эти команды всегда доступны. Чтобы открыть меню Turbo

Debugger, нажмите F10, с помощью стрелой переместитесь в нужному

пункту и нажмите Enter. После F10 для перехода к нужному пункту

можно также нажать его подсвеченную букву, либо сразу нажмите

Alt+буква (без F10). Системное меню выбирается по Alt+пробел. Меню открывается также щелчком "мышью" на соответствующем пункте.



Ранее связывание с помощью переопределяемых функций


Действие механизма переопределяемых функций несколько сходно с

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

блок процедур, то переопределяемые функции, в зависимости от заданных

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

то же имя функции. Дело в том, что компиляторы Турбо и Borland С++,

различают функции не только по их именам, но и по типу их аргументов.

Достичь полиморфизма через "игру" с аргументами можно: потерей

одного из аргументов (осторожно, так чтобы компилятор не спутал

отсутствие аргумента с особой "потерей" аргументов, принимаемыми "по

умолчанию", описываемыми далее), изменить тип аргумента, или использовать различное число аргументов. Например, функцию, вычисляющую

площадь прямоугольника

double sqr (double x, double y){return x*y;}

можно дополнить одноименной, но вычисляющей площадь квадрата, имеющую

отличный тип у аргумента x и меньшее число параметров:

int sqr (int x){return x*x;}

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

типы и по отличию в типе аргумента определяет ту или иную функцию.

Переопределяемые функции

v v v

double sqr (double x, double y); int sqr(int x);

{ { ^

return x*y; return x * x;

} }

int i, k;

Проверка типов

v v

k = add(i);

Как вы видите наблюдается некоторая дополнительная работа (компилятора языка С++ по отношению к Си), при раннем связывании функций

объектов - проверка типов.

Однако нужно иметь в виду, что компилятор не отличит эти же

функции, если тип аргумента сделать одинаковым, а изменить лишь тип

возвращаемого значения, например:

double sqr (double x){return x*x;};

и

int sqr (double x){return x*x;}



Распределение памяти для оверлейных структур


Модель MEDIUM Модель LARGE

класс CODE Резидентный класс CODE

код

Эти сегменты класс OVRINFO Данные для класс OVRINFO

генерируются управления

компоновщиком оверлеями

автоматически

класс STUBSEG Один сегмент класс STUBSEG

stub для

каждого

оверлейного

сегмента

_DATA _DATA

Ближняя динами- класс DATA класс DATA

чески распреде-

ляемая область и ближняя куча Отдельный

стек совместно ^ сегмент ^

используют сег- стек стека стек

мент данных

оверлейный буфер оверлейный буфер

(распределяется (распределяется

при загрузке) при загрузке)

дальняя дальняя

динамически динамически

распределяемая распределяемая

v область v область

Модель HUGE

Резидентный класс CODE

код

Эти сегменты Данные для класс OVRINFO

генерируются управления

компоновщиком оверлеями

автоматически

Один дополни- класс STUBSEG

тельный сег-

мент для

каждого

оверлейного

сегмента

. . . Несколько

сегментов

данных

Отдельный

сегмент ^

стека стек

оверлейный буфер

(распределяется

при загрузке)

дальняя

динамически

распределяемая

v область



Расширение функциональных возможностей документа


Описываемые здесь функции в основном отвечают всем потребностям при работе с классом документа. Однако вы можете расширить

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

производные классы.

Так как модель View/Doc отличается гибкостью, никаких требований или ограничивающих правил здесь не применяется. Документ

может работать практически с любым типом данных. Базовые классы

ObjectWindows обеспечивают функциональные возможности для расширения модели Doc/View.



Расширение TDib


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

Элемент данных Описание

Info Указатель на структуру BITMAPINFO или BIT-

MAPCOREINFO, содержащую атрибуты, таблицу

цветов и другую информацию о DIB.

Bits Указатель на область памяти с фактическими

графическими данными для DIB.

NumClrs Содержит фактическое число используемых в

DIB цветов (не возможных, а фактически используемых).

W Ширина DIB в элементах изображения.
H Высота DIB в элементах изображения.
Mode Режим DIB (RGB или палитра).
IsCore Имеет значение True, если Info указывает на

структуру BITMAPCOREINFO.

IsResHandle Указывает, был ли DIB загружен из ресурса,

и, следовательно, является ли Handle описателем ресурса.

Функция InfoFromHandle позволяет заполнить структуру Info.

Она выделяет информацию из Handle и заполняет атрибуты в структуре Info. Эта функция не имеет параметров и не возвращает значения.

Функция Read считывает из файла, указываемого объектом TFile, DIB, совместимые с Windows 3.0 или Presentation Manager. При

загрузке Read проверяет заголовок DIB, атрибуты, палитры и битовый массив. Совместимые с Presentation Manager DIB сразу преобразуются в DIB Windows. При удачном чтении возвращается True.

Чтобы загрузить DIB из приложения или модуля DLL, вы можете

использовать функцию LoadResource. Эта функция имеет два параметра, первый из которых - это HINSTANCE приложения или модуля DLL,

из которого вы загружаете DIB, а TResId указывает конкретный ресурс в модуле, который вы хотите загрузить. Для загрузки DIB из

файла можно использовать функцию LoadFile с единственным параметром - строкой имени файла.



Расширения Borland C++ по сравнению с Си стандарта ANSI


__asm __except __import (2) pascal
_asm __export _import (2) __saveregs (1)
__cdecl __far (1) _interrupt (1) _saveregs (1)
_cdecl _far (1) interrupt (1) __seg (1)
cdecl far (1) __loadds (1) _seg (1)
__cs (1) __fastcall _loadds (1) ___ss (1)
_cs (1) _fastcall __near (1) __ss (1)
__ds (1) __finally _near (1) __rtti
_ds (1) __huge (1) near (1) __thread (2)
__es (1) _huge (1) __pascal __try
_es (1) huge (1) _pascal


(1) - доступны только для 16-разрядных компиляторов


(2) - доступны только для 32-разрядных компиляторов



Расширенные макрокоманды диагностики


Макрокоманда Назначение

CHECKX Выводит заданное сообщение и генерирует

исключительную ситуацию, если определенное в аргументе условие равно 0.

Данную макрокоманду можно использовать

для проверки значения в функции.

PRECONDITIONX Выводит заданное сообщение и генерирует

исключительную ситуацию, если определенное в аргументе условие равно 0.

Данную макрокоманду можно использовать

на входе в функцию для проверки корректности ее вызова.

TRACEX Трассирует только при разрешении за данных в аргументах группы и уровня.
WARNX Выводит предупреждение только при раз решении заданных в аргументах группы и уровня.
DIAG_DECLARE_GROUP Описывает группу с заданным в аргументе именем.
DIAG_DEFINE_GROUP Определяет группу с заданным в аргументе именем.
DIAG_CREATE_GROUP Определяет и описывает группу с заданным в аргументе именем.
DIAG_ENABLE Устанавливает флаг разрешения указанной

группы в заданное значение.

DIAG_ISENABLED Если заданная группа разрешена, возвращает ненулевое значение.
DIAG_SETLEVEL Устанавливает пороговый уровень задан ной группы в указанное значение.
DIAG_DETLEVEL Получает пороговый уровень заданной группы.

При использовании TRACEX и WARNX требуется возможность создания групп. Пороговые уровни представляют собой произвольные

числовые значения, устанавливающие порог разрешения макрокоманд.

Макрокоманда с большим пороговым уровнем, чем пороговый уровень

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

группе с уровнем 1 или выше игнорируются.



Расширяемость кода


Наследование позволяет повторно использовать существующие исходные тексты программ, подправлять их и перекомпилировать. Эта способность готового к компиляции исходного текста названа расширяемостью.

Наследование >

Новый класс

shape.h + circle.h = circle.h

shape.obj circle.c circle.obj

Для дополнения класса shape (фигура) классом circle (круг),

достаточно лишь объявления его в классе shape (без изменения функций

элементов класса) в модуле shape.h и скомпилировать исходный текст в

shape.obj. Таким образом нет необходимости изменять исходный текст

shape.c.

Успешное создание потомков позволяет увеличивать программу за

счет накопления уже готовых текстов программ. Так, круг наследуют все

свойства фигуры, а цилиндры наследуют все свойства круга и фигуры.

Цилиндр: cylinder() ht area() vol()

Круг: circle() radius area()

Фигура: shape() xo yo area()

Возможно вы заметили по картинке, что класс цилиндр имеет три

функции area(). Действительно, унаследована одна функция area() у окружности, и одна у фигуры. Заимствование этих двух функций, для цилиндра оставляет возможность доступа к ним.

Примечание: порожденный класс может только наращивать базовый класс,

но не способен удалять какие-либо элементы.

Программист, без исходного текста программы, располагая лишь

описанием интерфейса с некоторым классом, может определить новый

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

класса так, как ему нужно.



Раздел дизассемблирования


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

После этого следуют несколько инструкций программы. Эти последующие команды перечисляются для обеспечения ссылок с целью

нахождения вызвавшей особую ситуацию задачи.



Раздел модулей


В разделе модулей файла регистрации перечисляются модули,

которые выполнялись во время возникновения исключительной ситуации. Здесь приводится следующая информация:

маршрут для программы, выполняющей файл;

дату;

размер файла;

имя модуля;

описатель модуля;

счетчик ссылок (сколько элементов использует модуль).



Раздел очереди сообщений


Раздел очереди сообщений файла регистрации представляет:

последнее сообщение, фактически полученное в ходе обработки. Кроме того, дается список сообщений, ожидающих в очереди во время

исключительной ситуации. Перечисляется следующая информация:

описатель (дескриптор) окна (идентифицирует, какое это окно):

номер идентификатора сообщений (идентифицирует, каким он

был);

два параметра (присутствующие для любого заданного окна).

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

очереди сообщений нужно иметь это в виду.

Раздел задач

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

ситуации. Здесь приводится следующая информация:

полный маршрут выполняемого файла;

имя модуля;

описатель окна модуля;

описатель задачи;

каким было значение сегмента данных для задачи (описатель

экземпляра).



Раздел регистров


Раздел регистров файла регистрации представляет значения,

которые находились в стандартных регистрах во время исключительной ситуации. Для регистров CS, DS, ES и SS даны ограничения и

полномочия доступа.



Раздел трассировки стека


Первая строка раздела трассировки стека файла регистрации

идентифицирует функцию или процедуру, которая выполнялась во время исключительной ситуации. Stack Trace information включает в

себя:

номер кадра стека;

имя модуля;

имя ближайшей функции перед адресом функции, вызвавшей

особую ситуацию, плюс число, указывающее как далеко вы находились от этой функции (эта информацию указывается только при наличии файла .SYM);

логический или физический адрес кадра стека;

куда ваша программа возвращается после вызова.

Когда WinSpector дает имена функций, он ищет в файле .SYM

ближайший идентификатор, который встречается перед адресом стека

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

представлять ближайшую функцию в файле .SYM с адресом, предшествующим адресу стека. Если поле смещение показывает слишком большое значение, то имя функции подозрительно.



Различимость регистра символов в идентификаторе: параметр /C


Когда вы добавляете к библиотеке какой-либо модуль, утилита

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

идентификатор, то утилита TLIB выдаст сообщение, но модуль не добавит.

Обычно когда утилита TLIB проверяет библиотеку на наличие дублируемых идентификаторов, буквы верхнего и нижнего регистров обычно не различаются. Например, идентификаторы lookuр и LOOKUP будут восприниматься как дубликаты. Так как Си обрабатывает буквы верхнего и нижнего регистров как различным образом, для добавления в библиотеку модуля, содержащего идентификатор, отличающийся от другого, уже имеющегося в библиотеке идентификатора, только регистром букв, нужно пользоваться параметром /C. Параметр /C указывает утилите TLIB, что нужно считать допустимыми модули, в

которых идентификаторы отличаются от уже имеющихся в библиотеке

только регистром букв.

Если вы хотите использовать эту библиотеку с другими компоновщиками (или позволить другим лицам использовать эту библиотеку с другими компоновщиками), то во избежание "неприятностей", параметр /C использовать не рекомендуется.



Разные подпрограммы


Эти подпрограммы предоставляют задержку времени, различные

звуковые эффекты и локальные эффекты.

delay (dos.h) sound (dos.h)
nosound (dos.h)



Разработка программ с оверлеями


Этот раздел содержит важные сведения о разработке программ с

оверлеями с хорошими характеристиками.

При компиляции оверлейного модуля вы должны использовать

большую модель памяти (medium, large или huge). При всяком вызове

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

активные в текущий момент функции являются дальними.

Вы обязаны компилировать все оверлейные модули с параметром

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

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

Размер оверлейного буфера по умолчанию в два раза превышает

размер самого большого оверлея. Для большинства прикладных программ такое умолчание вполне адекватно. Однако, представим себе

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

размер этих модулей превышает размер оверлейного буфера, то если

модули часто вызывают друг друга, это приведет к интенсивному

свопингу.

Очевидно, что решение здесь заключается в увеличении размера

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

можно сделать, установив через глобальную переменную _ovrbuffer

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

оверлейного буфера равным 128К, включите в ваш код следующий оператор:

unsigned _ovrbuffer = 0x2000;

Общей формулы для определения идеального размера оверлейного

буфера не существует.

Не создавайте оверлейных модулей, содержащих обработчики

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

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

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



Реакция на блоки списка


Функции-элементы для модификации и опроса блоков списка позволяют вам установить значения или определить в каждый конкретный

момент состояние нужного управляющего элемента. Однако, чтобы

знать, что пользователь делает с блоком списка на этапе выполнения, нужно отвечать на уведомляющие сообщения от управляющего

элемента.

Пользователь может прокручивать список или щелкать на элементе "мышью". При этом Windows посылает родительскому окну блока

списка уведомляющее сообщение. Обычно функции реакции на такое

сообщение определяются в объекте родительского окна.



Реакция на сообщения полосы прокрутки


Когда пользователь перемещает скользящий маркер полосы прокрутки или щелкает "мышью" на клавишах стрелок, Windows посылает

родительскому окну уведомляющее сообщение. Если вы хотите, чтобы

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

маркера и выполняются соответствующие действия.

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

а затем ответить на это. Можно также задать реакцию объекта полосы прокрутки на его собственные уведомляющие сообщения. TWindow

имеет встроенную поддержку диспетчеризации таких сообщений.



Реализация потоковых классов


Большинство функций-элементов, добавляемых к вашему классу с

функцией DECLARE_STREAMABLE, - это поставляемые функции. Однако

некоторые из них являются исключением и должны реализовываться

вне класса. Для таких определений также предусмотрены макрокоманды.

Макрокоманда IMPLEMENT_CASTABLE обеспечивает рудиментарный

надежный по типу механизм приведения. При построении с помощью

Borland C++ 4.0 вам не нужно это использовать, так как Borland

C++ 4.0 поддерживают информацию о типе этапа выполнения. Однако,

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

макрокоманду IMPLEMENT_CASTABLE. Макрокоманда DECLARE_CASTABLE

имеет несколько вариантов:

DECLARE_CASTABLE( cls )

DECLARE_CASTABLE( cls, base1 )

DECLARE_CASTABLE( cls, base1, base2 )

DECLARE_CASTABLE( cls, base1, base2, base3 )

DECLARE_CASTABLE( cls, base1, base2, base3, base4 )

DECLARE_CASTABLE( cls, base1, base2, base3, base4, base5 )

В некоторой точке своей программы вам следует вызвать эту

макрокоманду, указав в качестве параметра имя своего потокового

класса, а в качестве последующих параметров - имена потоковых базовых классов, например:

class Base1 : public virtual TStreamableBase

{

...

DECLARE_STREAMABLE( IMPEXMACRO, Base1, 1 );

};

IMPLEMENT_CASTABLE( Base1 ); // нет потоковой базы

class Derived : public Base1, public virtual Base2

{

...

DECLARE_STREAMABLE( IMPEXMACRO, Derived1, 1 );

};

IMPLEMENT_CASTABLE2( Derived, Base1, Base2 );

// две потоковых базы

class MostDerived : public Derived

{

...

DECLARE_STREAMABLE( IMPEXMACRO, MostDerived, 1 );

};

IMPLEMENT_CASTABLE1( MostDerived, Derived );

// одна потоковая база

Класс Derived использует IMPLEMENT_CASTABLE2, т.к. имеет два

потоковых базовых класса.

Кроме макрокоманд IMPLEMENT_CASTABLE где-либо в программе

вам следует вызвать макрокоманды IMPLEMENT_STREAMABLE. Эти макро-

команды выглядят аналогично:

DECLARE_STREAMABLE( cls )

DECLARE_STREAMABLE( cls, base1 )

DECLARE_STREAMABLE( cls, base1, base2 )

DECLARE_STREAMABLE( cls, base1, base2, base3 )

DECLARE_STREAMABLE( cls, base1, base2, base3, base4 )

DECLARE_STREAMABLE( cls, base1, base2, base3, base4, base5 )

Однако макрокоманда IMPLEMENT_STREAMABLE имеет одно важное

отличие от макрокоманд IMPLEMENT_CASTABLE: при использовании макрокоманд IMPLEMENT_STREAMABLE вам следует в списке параметров перечислить все потоковые классы и перечислить все виртуальные базовые классы, являющиеся потоковыми. Это связано с тем, что макрокоманда IMPLEMENT_STREAMABLE определяет специальный конструктор, который использует объектный потоковый код. Этот конструктор

должен вызывать все соответствующие конструкторы для всех прямых

базовых классов и всех соответствующих виртуальных классов.



Редактирование атрибутов с помощью TargetExpert


Целевые атрибуты описывают тип цели. Вы можете изменить атрибуты цели для типов Standard и AppExpert (но не для Source Pools). Чтобы изменить атрибуты:

Выберите в окне проекта цель и щелкните на ней правой

кнопкой "мыши".

Выберите в SpeedMenu TargetExpert. Выводится диалоговое

окно TargetExpert.

Измените атрибуты цели, затем выберите OK.



Редактирование атрибутов узла


Параметры узла описывают узел и определяют параметры и

трансляторы, используемые при трансляции узла. Для редактирования

атрибутов сделайте следующее:

Выберите узел в окне проекта и щелкните на нем правой

кнопкой "мыши".

Выберите в SpeedMenu Edit node attributes. Выводится диалоговое окно Node Attributes.

Измените атрибуты узла, затем выберите OK. Атрибуты определяются следующим образом:

Атрибут Описание

Name Имя узла.
Description Любой описывающий узел текст.
Style Sheet Имя таблицы стилей, используемых администратором проекта при трансляции узла.
Translator Используемый для узла транслятор.
Node Type Определяет узел и доступные для узла трансляторы.



Редактирование дерева проекта


Редактировать дерево проекта можно с помощью оперативных

клавиш или команд меню. Некоторые команды меню выводятся только в

SpeedMenu. Чтобы вывести в окне Project оперативное меню SpeedMenu, щелкните на узле правой кнопкой "мыши". Доступные в SpeedMenu

команды отражают тип выбранного режима.

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

перемещать целевые файлы и узлы, а также копировать узлы. Можно

также изменять атрибуты узла и цели.



Редактирование Style Sheet


Существующие наборы Style Sheet вы можете редактировать, переименовывать и копировать. Для просмотра диалогового окна Style

Sheet выберите Options Style Sheets.

Compose позволяет вам создавать Style Sheet, комбинируя несколько наборов параметров:

Создайте новый набор Style Sheet (щелкнув на New и набрав

имя), затем щелкните "мышью" на Compose.

Выберите Style Sheet, включаемый в новый набор Style Sheet, затем щелкните "мышью" на Add.

Продолжайте добавлять наборы Style Sheet, затем выберите OK.

Для копирования Style Sheet:

Выберите Style Sheet и щелкните "мышью" на Copy.

Наберите имя для скопированного набора Style Sheet и щелкните "мышью" на OK. С помощью кнопки Edit вы можете отредактировать набор.

Для редактирования Style Sheet:

Выберите Style Sheet и щелкните "мышью" на Edit.

Внесите изменения и щелкните на OK.

Для переименования Style Sheet:

Выберите Style Sheet и щелкните "мышью" на Rename.

Наберите имя Style Sheet и щелкните на OK.

Удалить Style Sheet можно с помощью Remove.



Редактируемые управляющие элементы


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

ввод текста пользователем;

динамический вывод текста (приложением);

вырезание, копирование и вставку из буфера обмена;

многострочное редактирование (для текстовых редакторов).

Примеры содержатся в подкаталоге EXAMPLES\OWL\OWLAPI\VALIDATE.

Один из конструкторов TEdit имеет параметры начальной строки

текста, максимальной длины строки текста и флаг, определяющий,

является ли текстовый управляющий элемент многострочным.

По умолчанию редактируемый управляющий элемент имеет стили

ES_LEFT (выравнивание влево), ES_AUTOHSCROLL (автоматическая горизонтальная прокрутка) и WS_BORDER (видимое обрамление управляющего элемента). Многострочные элементы имеют дополнительно стили

ES_MULTILINE (многострочный), ES_AUTOSCROLL (автоматическая вертикальная прокрутка), WS_VSCROLL (вертикальная полоса прокрутки)

и WS_HSCROLL (горизонтальная полоса прокрутки).

С помощью функций-элементов TEdit вы можете передавать текст

между редактируемым управляющим элементом и буфером обмена Clipboard. Обычно пользователи могут обращаться к этим функциям через

выводимое в окне меню Edit. Редактируемые управляющие элементы

имеют встроенную реакцию на пункты этого меню, такие как Copy или

Undo.

Функция-элемент Команда меню Описание

Copy CM_EDITCOPY Копирование текста в

буфер Clipboard.

Cut CM_EDITCUT Вырезание текста включение его в буфер.
Undo CM_EDITUNDO Отмена последнего редактирования.
Paste CM_EDITPASTE Вставка текста из буфера.
DeleteSelection CM_EDITDELETE Удаление выделенного текста.
Clear CM_EDITCLEAR Очистка всего редактируемого элемента.

Чтобы добавить в окно меню редактирования, определите ресурс

меню. Писать новые функции-элементы не потребуется.

TEdit имеет ряд функций опроса. Это функции IsModified, GetText, GetLine, GetNumLines, GetLineLength, GetSelection, GetSubText, GetLineIndex, GetLineFromPos, GetRect, GetHandle, GetFirstVisibleLine, GetPasswordChar, GetWordBreakProc и CanUndo.

Текст, который занимает в редактируемом управляющем элементе

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

элемента функции элементы TEdit сохраняют это форматирование.

TEdit поддерживает операции изменения текста, а также позволяет прокручивать редактируемый управляющий элемент. Для этих

операций используются функции Clear, DeleteSelection, DeleteSubText, DeleteLine, Insert, Paste, SetText, SetSelection,

Scroll, ClearModify, Search, SetRect, SetRectNP, FormatLines,

SetTabStops, SetHandle, SetPasswordChar, SetReadObly, SetWordBreakProc и EmptyUndoBuffer.



Регистрация оконных классов


Когда вы создаете интерфейсный элемент из интерфейсного объекта с помощью Create или Execute, объект проверяет, имеется ли

другой объект того же зарегистрированного в Windows типа. Если

да, то элемент создается на основе существующего класса регистрации. Если нет, то объект автоматически регистрируется, а затем

создает на базе только что зарегистрированного класса. Это освобождает программиста от необходимости регистрировать все оконные

классы перед их использованием.



Регистрация сообщений


Окно Windows Messages имеет ряд команд для трассировки и

проверки получаемых программой оконных сообщений. С его помощью

вы можете устанавливать точки останова по сообщениям (выполнение

программы будет приостанавливаться при получении сообщения конкретным окном). Вы можете также регистрировать получаемые окном

сообщения. Данное окно открывается командой View Message и имеет

три области: область выбора окна, область класса сообщения и область регистрации.



Регистровые псевдопеременные Borland C++


_AH _CL _EAX (*) _ESP
_AL _CS _EBP (*) _FLAGS
_AX _CX _EBX (*) _FS
_BH _DH _ECX (*) _GS (*)
_BL _DI _EDI (*) _SI
_BP _DL _EDX (*) _SP
_BX _DS _ES _SS
_CH _DX _ESI (*)

(*) - для 32-разрядного компилятора эти псевдопеременные всегда

доступны. 16-разрядный компилятор может их использовать только

при указании параметра генерации инструкций 80386.



с плавающей точкой вы должны


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

В режиме эмуляции сопроцессора 80х87 циклический переход

в регистрах, а также ряд других особенностей 80х87 не

поддерживается.

Если вы смешиваете операции с плавающей точкой и встроенные коды на языке Ассемблера, то при использовании регистров следует должны принимать некоторые меры предосторожности. Это связано с тем, что набор регистров сопроцессора 80х87 перед вызовом функции в Borland C++ очищается. Вам может понадобиться извлечь из стека и сохранить

регистры сопроцессора 80х87 до вызова функции, использующей сопроцессор, если вы не уверены, что свободных регистров достаточно.


Регистры общего назначения


Аккумулятор (математические операции) Базовый регистр (индексирование)  
Счетчик (индексирование)  
Регистр данных

AX AH AL
BX BH BL
CX CH CL
DX DH DL



Регистры общего назначения


SP Указатель стека
BP Указатель базы
SI Индекс источника
DI Индекс приемника

Общие регистры чаще всего используются для работы с данными.

Каждый из них выполняет некоторые специальные функции, которые

доступны только ему, например, некоторые математические операции

могут использовать только регистр AX, регистр BX может служить

базовым регистром, CX применяется инструкцией LOOP и некоторыми

строковыми инструкциями, а DX используется некоторыми математическими операциями неявно. Однако во многих операциях можно использовать все эти регистры и заменять один из них на другой.

Сегментные регистры содержат начальный адрес каждого из 4

сегментов. Как описывается ниже, 16-разрядное значение в сегментном регистре для получения 20-разрядного адреса сегмента сдвигается влево на 4 (умножается на 16).

16-разрядный сегментный 16-разрядное

регистр смещение

V

умножение на 16

/сдвиг влево на 4/

V

Значение сегмента,

умноженное на 16,

равно 20-разрядно-

му значению

> + <

V

20-разрядное значение адреса памяти

Процессоры 80х86 имеют также некоторые специальные регистры:

Регистры SI и DI могут выполнять многие функции общих регистров, но могут также использоваться в качестве индексных регистров. Они используются и в регистровых переменных Borland С++.

Регистр SP указывает на текущую вершину стека и представляет смещение в сегменте стека.

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

Функции Borland С++ используют регистр базы (BP) в качестве

базового регистра для аргументов и переменных. Параметры имеют

положительные смещения от BP, зависящие от модели памяти. При наличии кадра стека BP указывает на сохраненное предыдущее значение BP. Если параметр Standard Stack Frame выключен (Off), то функции без аргументов не используют и не сохраняют BP.

16-разрядный регистр флагов содержит все необходимую информацию о состоянии процессора 80х86 и результатах последних инструкций.




только 80386 286/386 все процессоры 80х86

31 23 15 7 0

V R N IOP O D I T S Z A P C

Виртуальный режим 80х86

Возобновление

Вложенная задача

Уровень защиты ввода-вывода

Переполнение

Направление

Разрешение прерывания

Прерывание

Знак

Признак нуля

Вспомогательный перенос

Четность

Перенос

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

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

арифметических и логических операций.

Прочие флаги управляют режимом операций процессора 80х86.

Флаг направления управляет направлением, в котором строковые инструкции выполняют перемещение, а флаг прерывания управляет тем,

будет ли разрешено внешним аппаратным средствам, таким, например,

как клавиатура или модем, временно приостанавливать текущий код

для выполнения функций, требующих немедленного обслуживания. Флаг

перехвата используется только программным обеспечением, которое

служит для отладки другого программного обеспечения (отладчики).

Регистр флагов не считывается и не модифицируется непосредственно. Вместо этого регистр флагов управляется в общем случае с помощью специальных инструкций (таких, как CLD, STI и CMC), а также с помощью арифметических и логических инструкций, модифицирующих отдельные флаги. И наоборот, содержимое отдельных разрядов регистра флагов влияет на выполнение инструкций (например, JZ, RCR и MOVSB). Регистр флагов не используется на самом деле,

как ячейка памяти, вместо этого он служит для контроля за состоянием и управления процессором 8086.


Регуляторы и индикаторы


Регуляторы (slider) - это специализированные объекты прокрутки. Класс TSlider является производным от TScrollBar. Регуляторы используются для позиционирования информации без прокрутки.

TSlider имеет два производных класса - THSlider и TVSlider (вертикальная и горизонтальная версия).

Индикаторы - это управляющие элементы, которые выводят на

экран информацию о продолжительности или другую информацию о выполняющемся процессе. Индикаторы реализует класс TGauge, производный от TControl. Параметр конструктора определяет, хотите вы

получить вертикальный или горизонтальный индикатор (вертикальные

обычно используются для вывода аналоговой информации). Примеры

таких управляющих элементов вы можете найти в подкаталоге

EXAMPLES\OWL\OWLAPI\SLIDER.