Подготовка программ для отладки
Когда вы выполняете компиляцию и компоновку с помощью одного
из языков фирмы 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, если вызов не использовался; в противном случае она не определена. | |
Следующие символические имена определяются согласно выбранной во время компиляции модели памяти:
| Для конкретной компиляции определенным является только одна
из этих макрокоманд. Прочие по определению не определены. Например, если при компиляции выбрана малая модель памяти (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.