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

         

Оператор EXPORTS


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

Ключевое слово EXPORTS отмечает начало определений. После него

может следовать любое число определений экспорта, каждое в отдельной строке. Оператор имеет синтаксис:

EXPORTS

имя_эксп [номер] [RESIDENTNAME] [параметр]

где "имя_эксп" задает строку ASCII, которая определяет экспортируемый идентификатор. Она имеет следующую форму:

имя_точки_входа [=внутр_имя]

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

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

"Номер" определяет значение перечисления функции. Оно имеет

следующую форму:

@номер

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

перечисления функции.

Когда модуль прикладной программы или модуль DLL вызывает

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

на функцию по имени или по значению перечисления. С точки зрения

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

функции по перечислению (с точки зрения DLL этой функции) и импортирование/вызов функции по перечислению (с точки зрения модуля

вызова) являются более эффективными.

Когда функция экспортируется по номеру, имя располагается в



нерезидентной таблице имен, а когда по имени, то в резидентной

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

Параметр RESIDENTNAME позволяет указывать, что имя функции

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

когда производится экспортирование по перечислению (когда имя не

будет резидентным по умолчанию).

"Параметр" является необязательным целым значением, задающим

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



Оператор IMPORTS


IMPORTS определяет имена и атрибуты функций, импортируемых

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

командной строке TLINK или (в IDE) включить библиотеку импорта

для DLL в проект.

Ключевое слово IMPORTS указывает начало определений. После

него может идти любое число определений импорта, каждое в отдельной строке. Оператор имеет синтаксис:

IMPORTS [внутр_имя=]имя_модуля.точка_входа

где "внутр_имя" является строкой ASCII, определяющей уникальное

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

Поле "имя_модуля" задает один или несколько символов ASCII в

верхнем регистре, которые определяют имя выполняемого модуля, со-

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

исполнимого файла. Например, файл SAMPLE.DLL имеет имя модуля

SAMPLE.

Поле "точка_входа" задает импортируемую функцию. Она может

быть строкой ASCII, которая именует функцию, или целым, которое

задает значение перечисления функции.



Оператор LIBRARY


LIBRARY определяет имя модуля DLL. Файл определения модуля

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

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

библиотека MYLIB.DLL имеет имя модуля MYLIB. Оператор имеет следующий синтаксис:

LIBRARY имя_библиотеки [INITGLOGAL INITINSTANCE]

где "имя_библиотеки" задает строку ASCII, которая определяет имя

модуля библиотеки. Если вы не указываете имя, то TLINK использует

имя исходного файла без расширения. Если файл определения модуля

не содержит операторов NAME или LIBRARY, то TLINK подразумевает

оператор NAME без параметра имени библиотеки.

INITGLOBAL означает, что подпрограмма инициализации модуля

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



Оператор NAME


NAME определяет имя выполняемого модуля прикладной программы. Имя модуля идентифицирует модуль, который экспортирует функции. Оператор имеет синтаксис:

NAME имя_модуля [WINDOWSAPI] [WINDOWCOMPAT]

где "имя_модуля" задает один или несколько символов ASCII в

верхнем регистре, которые определяют имя выполняемого модуля. Имя

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

прикладная программа с выполняемым файлом SAMPLE.EXE имеет имя

модуля SAMPLE.

Параметр "имя_модуля" не является обязательным. Если параметр не включен, TLINK считает, что имя модуля соответствует имени выполняемого файла. Например, если вы не задали имя модуля, а

выполняемый файл имеет имя MYAPP.EXE, то TLINK считает, что модуль имеет имя MYAPP.

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

NAME, ни утверждения LIBRARY, TLINK использует утверждение NAME

без параметра "имя_модуля".

WINDOWSAPI задает выполняемый файл Windows (эквивалент пара-

метра /aa TLINK32).

WINDOWCOMPAT определяет совместимый с Windows выполняемый

файл символьного режима (эквивалент параметр /ap TLINK32).



Оператор SEGMENTS


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

данных и имеет синтаксис:

SEGMENTS

имя_сегмента [CLASS 'имя_класса'] [мин_распр]

[SHARED NONSHARED]

[PRELOAD LOADONCALL]

где имя_сегмента задает символьную строку, именующую новый сегмент. Это может быть любое имя, включая стандартные имена сегментов _TEXT и _DATA, представляющее стандартные сегменты кода и данных.

Поле "имя_класса" является необязательным ключевым словом,

задающим имя класса для указанного сегмента. Если не задано имя

класса, то TLINK использует стандартное имя класса CODE.

Поле "мин_распр" является необязательным целым значением,

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

TLINK это значение игнорирует.

SHARED (задается по умолчанию для 16-разрядных DLL) означает, что одна копия сегмента совместно используется процессами.

NONSHARED (задается по умолчанию для программ и 32-разрядных DLL)

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

PRELOAD означает, что сегмент загружается сразу же;

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



Оператор STACKSIZE


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

библиотек DLL STACKSIZE использовать нельзя. Оператор имеет синтаксис:

STACKSIZE байты

где "байты" является целым значением, задающим размер стека в

байтах.



Оператор STUB


STUB присоединяет выполняемый файл DOS, заданный с помощью

поля "имя_файла", в начало модуля. Если пользователь не загрузил

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

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

Borland C++ добавляет в начало прикладной программы встроенный

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

для того, чтобы просто включить WINSTUB.EXE, так как компоновщик

будет делать это для вас автоматически.

Оператор имеет синтаксис:

STUB "имя_файла"

где "имя_файла" задает имя выполняемого файла DOS, который будет

присоединен к модулю. Имя должно иметь формат файла DOS.

Если файл с именем "имя_файла" не находится в текущем каталоге, TLINK ищет файл в каталогах, заданных с помощью пользовательской переменной среды PATH.



Описание и определение таблиц реакции


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

конец определения класса.

После описания таблицы реакции вы должны определить ее (вне

определения класса). Помочь вам в этом может макрокоманда DEFINE_RESPONSE_TABLEx, где x зависит от наследования класса и равно

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

имеет x+1 аргумент - имя класса, для которого определяется таблицей, и имена каждого непосредственного базового класса. Таблица

реакции заполняется записями и завершается макрокомандой END_RESPONSE_TABLE. Приведем пример:

DEFINE_RESPONSE_TABLE(TMyFrame, TFrameWindow)

EV_WM_LBUTTONDOWN,

EV_WM_LBUTTONUP,

EV_WM_MOOUSEMOVE,

EV_WM_RBUTTONDOWN,

EV_WM_RBUTTONUP,

END_RESPONSE_TABLE;



Описание операций


Операциями называются лексемы, вызывающие некоторые вычисления с переменными и прочими объектами, указанными в выражении.

Borland C++ имеет особенно богатый набор операций, включающий в

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

манипуляции с данными на битовом уровне, доступа к элементам

структур и объединений, а также операции с указателями (ссылка и

разыменование).



Определение буфера передачи


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

Чтобы определить буфер передачи, определите для каждого

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

тип управляющего элемента имеет разную информацию для хранения.

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

информации (строки, элементы данных и индексы выбора), буфер передачи использует класс TListBoxData с несколькими функциями-элементами для работы с информацией блока списка (AddItemData, AddString, AssStringItem, GetSelString, GetSelStringLenght, ResetSelections, Select и SelectString) и элементами данных (ItemDatas,

SelIndices и Strings).

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

класс TComboBoxData с элементами данных ItemDatas, Selection и

Strings и функциями-элементами AddItemData, AddString и AddStringItem.



Определение макрокоманд


Макроопределение имеет следующую форму:

имя_макрокоманды = текст_макрорасширения

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

содержащей символов пробела, хотя пробелы между "именем_макрокомандЫ" и знаком равенства (=) допустимы. "Текст_макрорасширения"

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

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

Если "имя_макрокоманды" уже было определено ранее (либо с

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

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

model, Model и MODEL определяют разные макрокоманды.



Определение соответствующего окна или диалогового блока


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

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

в котором определены элементы соответствующего буфера передачи.

Для разрешения передачи используйте вызов SetTransferBuffer с

указателем на буфер передачи.

Так как объекты диалоговых окон получают свои определения и

определения своих управляющих элементов из ресурса, вам следует

строить объекты управляющих элементов с помощью конструкторов,

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

DisableTransfer.

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

передачи по умолчанию запрещен. Чтобы разрешить его, вызовите

функцию-элемент EnableTransfer.



Определение записей таблицы реакции


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

данной функции. Если нет, то оно передается выше родительскому

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

по умолчанию. ObjectWindows предусматривает для таблицы реакции

набор макрокоманд:

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

Стандартные макрокоманды Windows для обработки сообщений

Windows.

Зарегистрированные макрокоманды (сообщения, возвращаемые

RegisterWindowMessage).

Макрокоманды уведомления от дочерних объектов, позволяющие

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

Макрокоманды уведомления управляющих элементов, которые

обрабатываются сообщения от специализированных управляющих

элементов, таких как командные кнопки, комбинированные

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

др.

Макрокоманды администратора документов для уведомления

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

событиях администратора документа.

Уведомления управляющих элементов VBX.



Опрос объектов меню


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

пунктов меню), GetMenuCheckMarkDimensions (размер битового массива для вывода отметки меню), GetMenuItemID (идентификатор пункта в заданной позиции), GetMenuState (флаги состояния заданного пункта), GetMenuString (текст заданного пункта меню), GetSubMenu

(описатель меню в заданной позиции).



Оптимальное использования оверлеев Borland C++


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

создаваемых Borland C++, сделайте следующее:

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

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

добиться наиболее комфортных условий для создаваемой программы (начните со 128К и регулируйте этот размер вверх и

вниз, пока не установите желаемое соотношение между быстродействием и размером программы).

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

рассматриваемые здесь средства, являющиеся достоинствами с

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



Организация класса GDI


Большинство классов, инкапсулирующих функциональные возможности GDI, являются производными от класса TGdiObject. Это абстрактный класс для объектов GDI ObjectWindows. Он обеспечивает

базовый деструктор, операцию преобразования HGDIOBJ и базовую

функцию GetObject.

Другими классами GDI ObjectWindows являются классы:

TDC - корневой класс для инкапсуляции контекста устройства

GDI ObjectWindows. Вы можете создать объект TDC непосредственно или в производных классах, определив более специализированное поведение.

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

используя существующий оператор пера, объект пера или логическое перо.

TBrush реализует объекты кисти Windows. Вы можете построить специальную кисть, создать непрерывную, стилизованную

или шаблонную кисть, или использовать описатель существующей кисти, объект кисти или логическую кисть.

TFont позволяет вам легко использовать шрифты Windows. Вы

можете построить шрифт со специальной спецификацией, либо

задать существующий описатель шрифта, объект шрифта или

логический шрифт (структуру LOGFONT).

TPalette инкапсулирует палитру GDI. Вы можете построить

новую палитру или использовать существующие таблицы цветов

из различных DIB.

TBitmap определяет битовые (растровые) массивы Windows. Вы

можете построить такой массив из многих ресурсов, включая

файлы, описатели битовых массивов, ресурсы приложений и т.д.

TRegion определяет область окна. Вы можете построить области различной формы. Это псевдо GDI-объект, он не является производными от TGdiObject.

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

TCursor инкапсулирует курсор Windows. Вы можете построить

курсор из ресурса или на основе явной информации.

TDib инкапсулирует класс битового массива, независимого от

устройства (DIB). DIB не имеет не имеет описателя Windows.

Это просто структура, содержащая формат и информацию о палитре, а также битовый набор. Этот класс обеспечивает удобный способ, работы с DIB, как и другие объекты GDI.

Многие из функций классов GDI ObjectWindows могут показаться

вам знакомыми, но это не совсем так. Поскольку классы GDI ObjectWindows дублируют функции многих объектов Windows, то существующая терминология сохранилась. Однако в функции внесены некоторые улучшения.



Основные типы


Непосредственно поддерживаются основные типы char, short,

int, long, char* (интерпретируется как строка), float, double,

long double и void*. Интегральные типы форматируются в соответствии заданными по умолчанию типами для printf (если вы не изменили эти правила установками флагов ios).



Отладка библиотек DLL


Динамически компонуемая библиотека DLL - это библиотека

подпрограмм и ресурсов, компонуемая с приложением Windows на этапе выполнения. Это позволяет подпрограммам использовать одну копию подпрограмм, ресурсов и драйверов устройств. Когда приложению

требуется доступ к DLL, Windows проверяет, загружена ли DLL в память. Если это так, то вторая копия не загружается.

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

способами:

при загрузке программы (DLL загружается при статической

компоновке ее с программой с помощью утилиты IMPLIB);

когда ваша программа обращается с вызовом LoadLibrary.



Отладка драйвера устройства


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

средства удаленной отладки, о которых рассказывается ниже. Для

применения этого последнего способа выполните следующие шаги:

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

С помощью утилиты TDSTRIP (см. файл TD_UTILS.TXT) выделите из драйвера устройства отладочную информацию.

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

Измените файл CONFIG.SYS удаленной системы, чтобы он загружал драйвер удаленной системы. Затем перезагрузите уда ленную систему.

Для получения адреса драйвера загрузите на удаленной системе TDMEM.

Загрузите на удаленной системе TDREMOTE.

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

удаленной системой.

Загрузите в отладчике с помощью команды File Symbol Load

таблицу идентификаторов драйвера устройства.

Используйте команду File Table Relocate для помещения

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

коду (программе). Для этого в ответ на подсказку отладчика задайте адрес сегмента Seg вашей резидентной программы, который можно определить с помощью TDMEM.

Задайте в начале драйвера устройства точку останова.

Выберите команду File Resident, чтобы сделать резидентным

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

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

выполнения файла CONFIG.SYS. Единственная резидентной

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

Когда вы вернетесь снова к командной строке DOS на уда ленной системе, сделайте что-либо для активизации вашего

драйвера устройства. Например, выведите информацию на со ответствующее устройство.

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

отладку вашей программы. (Кроме того, вы можете повторно

войти в отладчик из DOS, дважды нажав клавиши Ctrl-Bre ak.)



Отладка кода запуска DLL


Когда ваша программа загружает DLL, выполняется код запуска

DLL. По умолчанию Turbo Debugger не выполняет по шагам этот код.

Однако, если вам нужно проверить корректность загрузки DLL, то

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

LibMain (по умолчанию) и скомпонованный с DLL код ассемблера.

Этот код инициализирует процедуры запуска и эмулирует математические пакеты (этот режим отладки выбирается параметром -l командной строки отладчика).

Чтобы начать отладку кода запуска DLL, нужно перезагрузить

программу (Run Program Reset или F2), а затем выполнить следующие

шаги:

вывести диалоговое окно Load Module Source or DLL Symbols (F3);

подсветите в блоке списка DLL & Programs DLL, код запуска

которой вы хотите отладить;

выберите кнопку с зависимой фиксацией Debug Startup (если

нужной DLL в списке нет, добавьте ее как описано выше);

повторите эти шаги, если нужно задать отладку для нескольких DLL;

для перезагрузки приложения выберите команду Run Program

Reset или F2.

При отладке имейте в виде следующее:

Перед перезагрузкой текущего приложения выполняйте до конца код запуска DLL, иначе Windows может зависнуть.

Установка точек останова на первой строке приложения или

первой строке после вызова LoadLibrary гарантирует возврат

управления в Turbo Debugger.

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

пройти его до конца и вернуться в приложение.



Отладка мультинитевых программ


Окно Thread, которое открывается по команде View Thread,

поддерживает мультинитевую среду Windows NT. Это окно содержит

три области: списка нитей, детализации и информационную.

В информационной области перечисляется общая информация о

нити. Поле Last указывает последнюю нить, выполненную перед передачей управления в Turbo Debugger, поле Current показывает нить,

которая выводится в окнах отладчика, поле Total - общее число активных программных нитей, а поле Notify - Yes или No для статуса

Notifu или Termination отдельных нитей. Общий статус устанавливается с помощью команды All Threads.



Отладка на уровне ассемблера


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



Отладка объектно-ориентированных программ


В Turbo Debugger предусмотрен ряд средств для отладки объектно-ориентированных программ С++.



Отладка оверлейных программ


Большинство отладчиков либо имеет весьма ограниченные средства отладки программ с оверлейной структурой, либо вообще не имеет таких средств. Иначе дело обстоит с интегрированным со средой

разработки программ отладчиком Borland C++ и автономным отладчиком фирмы Borland (Turbo Debugger). Оба эти отладчика полностью

поддерживают пошаговую отладку и установку точек останова в оверлеях совершенно "прозрачным" для вас способом. Благодаря использованию оверлеев вы имеете возможность легко разрабатывать и отлаживать громоздкие прикладные программы - как в интегрированной

среде, так и при помощи Turbo Debugger.



Отладка программ ObjectWindows


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

ObjectWindows 1.0х, то нужно конфигурировать отладчик, чтобы он

распознавал систему диспетчеризации сообщений Objecwindows DDVT.

Для этого запустите TDWINST, для вывода диалогового окна Source

Debugging выберите команду Options Source Debugging, включите

кнопку с независимой фиксацией OWL 1.0X Window Messages, затем

сохраните конфигурацию и выйдите из TDWINST.



Отладка резидентной в памяти программы


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

вы начинаете отлаживать резидентную часть. Давайте рассмотрим

процесс отладки резидентной программы.

С помощью Turbo Debugger вы можете отлаживать драйвер клавиатуры. При этом для перемещения по отладчику пользуйтесь "мышью".

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

обеспечьте наличие в ней отладочной информации.

Запустите отладчик и загрузите программу.

Установите точку останова в начале резидентной части кода.

С помощью команды Run Run запустите рабочую часть программы.

Отладьте рабочую часть программы с помощью обычных методов.

Затем выйдите из TSR. Резидентная часть остается в памяти.

Чтобы сделать резидентным отладчик, выберите команду File Resident. На TSR это не повлияет. После этого вы можете вернуться в DOS и вызвать TSR.

В командной строке DOS нажмите оперативные клавиши вызова

резидентной программы и работайте с ней как обычно.

Выйдите из TSR. Теперь выполняется резидентная часть TSR,

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

Второй метод отладки резидентной части TSR предусматривает выполнение ее из командной строки DOS и использование

окна CPU отладчика для отладки содержащей TSR области ОЗУ.

Скомпилируйте программу с отладочной информацией.

Используйте утилиту TDSTRIP для удаления из программы

таблицы идентификаторов и помещения ее в файл .TDS.

Запустите TSR из командной строки.

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

Загрузите отладчик и с помощью команды File Symbol Load

загрузите таблицу идентификаторов TSR (файл .TDS).

Установите в начале резидентной части TSR точку останова.

Чтобы сделать отладчик резидентным, выберите команду File Resident.

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

нажав ее оперативную клавишу, и работайте с программой




как обычно. При обнаружении точки останова отладчик приостанавливает TSR в начале резидентной части. Чтобы облегчить работу, синхронизируйте таблицу идентификаторов с

кодом в памяти. Идентификаторы в таблице отстоят друг от

друга на корректное число байт, но абсолютный адрес первого идентификатора не определен, так как DOS загрузила

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

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

Используйте команду File Table Relocate для помещения

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

коду (программе). Для этого в ответ на подсказку отладчика задайте адрес сегмента Seg вашей резидентной программы, который определен с помощью утилиты TDMEM, плюс шестнадцатиричное значение 10 (для PSP размером 256 байт).

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

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

же строке, что и информация из таблицы идентификаторов.

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

ваша резидентная программа, используйте команду Goto

(клавиши Ctrl-G). Это можно сделать, используя адрес сегмента вашей программы TSR, за которым следует смещение

0000H, или с помощью перехода на конкретную метку вашей

программы.

Отладьте резидентную часть программы.


Отладка резидентных программ и драйверов устройств


С помощью TD.EXE вы можете отлаживать не только обычные выполняемые файлы, но также резидентные в памяти программы (TSR) и

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

как резидентную программу (в то время, как работаете на уровне

DOS или запускаете другие программы).



Отладка в Windows


Дополнительная сложность программ для Windows вызывает появление новых категорий ошибок. Turbo Debugger имеет ряд средств,

которые помогут вам найти ошибке в программе для Windows.



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


По умолчанию программа Borland C++ в случае переполнения или

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

плавающей точкой, вызывая в main _control87 перед любой операцией

с плавающей точкой. Например:

#include <floar.h>

main() {

_control87(MCW_EM,MCW_EM);

...

}

Можно определить особую ситуацию для операции с плавающей

точкой, вызвав функции _status87 или _clear87.

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

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

выполняется вывод на экран сообщений об ошибке и возврат значения

NAN (код IEEE "not-a-number" - "не число"). Использование NAN

(нечисловых значений) скорее всего приведет далее к возникновению

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

Если вы не желаете, чтобы сообщение выводилось на экран, вставьте

в программу соответствующую версию matherr.

#include <math.h>

int cdecl matherr(struct exception *e)

{

return 1; /* ошибка обработана */

}

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

математических ошибок недопустимо, так как она считается устаревшей и может не поддерживаться последующими версиями Borland C++.



Отображаемые элементы


Объекты отображаемых элементов служат для представления объектов документов. Без такого объекта вы не могли бы видеть документ и работать с ним. Когда вы в шаблоне документа связываете

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

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

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

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

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

элементов по сравнению с методом фиксированного вывода текста

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

документом. Вы можете предусмотреть для документа три или четыре

отображаемых элемента.

Базовые функции отображаемого элемента обеспечивает класс

TView.



Отображение интерфейсного элемента


Создание объекта и соответствующего элемента не означает,

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

или сброса в элементе данных интерфейсного объекта Attr.Style.

Создаваемый интерфейсный элемент выводится на экран только в случае установки стиля WS_VISIBLE.

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

вызова IsWindowVisible. В случае видимости объекта эта функция

возвращает True.

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

спрятан вызовом функции-элемента интерфейсного объекта Show.



Отслеживание версий объектов


Объекты в потоках имеют связанный с ними номер версии. Номер

версии - это 32-битовое значение, которое не должно быть равно

нулю. Когда объект записывается в поток, записывается также его

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

считываете ли вы старую версию потока, и интерпретировать поток

соответствующим образом.



Оверлеи и обработка исключительных ситуаций


Если вы пишете оверлейную программу, содержащую конструкции

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

могут содержать конструкцию обработки исключительных ситуаций:

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

Шаблоны функций.

Функции-элементы или шаблоны классов.

Конструкция обработки исключительной ситуации включает в себя написанный пользователем блок try/catch и __try/__except. Кроме того, компилятор также может включать обработчики исключительных ситуаций и блоки с локальными динамическими переменными, спецификациями исключительных ситуаций и некоторые выражения new/delete.

Если вы пытаетесь использовать в оверлее вышеуказанные конструкции обработки исключительных ситуаций, компоновщик идентифицирует функцию и модуль следующим сообщением:

Error: Illegal local public in функция in module модуль

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

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

удалить функцию их оверлейного модуля.

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

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

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

Error: Illegal local public in класс: in module модуль

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

В классе контейнера (в BIDS?.LIB) есть механизм обработки

исключительной ситуации, который по умолчанию выключен. Однако

диагностическая версия генерирует исключительные ситуации и не

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

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



Оверлеи (VROOMM)


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

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

функции.

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

Оверлеи используются только в 16-разрядных программах DOS. В

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

можете пометить сегменты как Discardable (выгружаемые).



_Ovrbuffer (dos.h)


Данная переменная изменяет размер оверлейного буфера и имеет

следующий синтаксис:

unsigned _ovrbuffer = size;

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

дополнительный свопинг.

Решением здесь будет увеличения размера оверлейного буфера,

так что в каждый момент времени памяти будет достаточно, чтобы

вместить все оверлеи с частыми перекрестными вызовами. Сделать

это можно с помощью установки в требуемый размер (в параграфах)

глобальной переменной _ovrbuffer в 128К:

unsigned _ovrbuffer = 0x2000;

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



- P-


P1001 Unable to read имя_файла

Ошибка, возникающие при обработке файла описания проекта Help(чтение файла имя_файла невозможно)

Файл, указанный в файле описания проекта, не читается. Ошибка возникает в ответ на ошибку DOS при чтении файла.

P1003 Invalid path specified in Root option

Ошибка, возникающие при обработке файла описания проекта Help(название каталога, указанное в параметре Root, недопустимо)

Указанный в параметре ROOT каталог отсутствует. Компиляция

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

P1005 Path and filename exceed limit of 79 characters

Ошибка, возникающие при обработке файла описания проекта Help(длина полного имени файла превышает 79 символов)

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

оказалось длиннее 79 символов - максимально возможной длине имени, принятой в DOS. Соответствующий файл не обрабатывается (пропускается)

P1007 Root path exceeds maximum limit of 66 characters

Ошибка, возникающие при обработке файла описания проекта Help(длина названия главного каталога превышает 66 символов)

Длина названия каталога, указанного в параметре ROOT, превышает предельное значение, принятое в DOS (66 символов). Указанное

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

P1009 [FILES] section missed

Ошибка, возникающие при обработке файла описания проекта Help(отсутствует раздел [FILES])

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

[FILES]. Компиляция завершается аварийно.

P1011 Option название_параметра previously defined

Ошибка, возникающие при обработке файла описания проекта Help(параметр название_параметра уже установлен)

Значение указанного параметра уже установлено ранее. Попытка

переопределить параметр игнорируется и компиляция продолжается.

P1013 Project file extension cannot be .HLP

Ошибка, возникающие при обработке файла описания проекта Help(файл описания проекта не может иметь расширение имени .HLP)




Компилятор не может работать с файлом описания проекта, имеющим расширение имени ".HLP". Обычно, файлы описания проекта имеют расширение имени ".HPJ".

P1015 Unexpected end-of-file

Ошибка, возникающие при обработке файла описания проекта Help(непредвиденный конец файла)

Компилятор обнаружил конец файла, хотя из контекста следует,

что этого быть не может. Такая ошибка может возникать при наличии

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

P1017 Parameter exceeds maximum length of 128 characters

Ошибка, возникающие при обработке файла описания проекта Help(длина параметра превышает максимально допустимое значение,

равное 128)

Длина текста параметра, контекстной строки либо номера,

признака включения или какого-либо другого параметра, содержащегося в указанной строке, превышает максимально допустимое значение, равное 128. Соответствующая строка игнорируется.

P1021 Context number already used in [MAP] section

Ошибка, возникающие при обработке файла описания проекта Help(контекстный номер уже использован в разделе [MAP])

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

сопоставлен другому контекстному идентификатору. Соответствующая

строка игнорируется.

P1023 Include statements nested too deeply

Ошибка, возникающие при обработке файла описания проекта Help(уровень вложенности директивы include слишком велик)

Уровень вложенности директивы #include, содержащейся в указанной строке, превышает предельно допустимое значение, равное

пяти.

P1025 Section heading название_раздела unrecognized

Ошибка, возникающие при обработке файла описания проекта Help(название раздела название_раздела некорректно)

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

P1027 Bracket missing from section heading название_раздела

Ошибка, возникающие при обработке файла описания проекта Help(в названии раздела название_раздела пропущена квадратная



скобка)

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

компиляцию.

P1029 Section heading missing

Ошибка, возникающие при обработке файла описания проекта Help(опущен заголовок раздела)

Заголовок раздела в указанной строке не удовлетворяет соответствующему синтаксическому правилу. Это же сообщение появляется

в случае, когда первая строка файла описания проекта не является

корректным заголовком раздела. Компилятор переходит к обработке

следующей строки.

P1030 Section название_раздела previously defined

Ошибка, возникающие при обработке файла описания проекта Help(раздел название_раздела был определен ранее)

В файле описания проекта содержатся два одинаковых раздела.

Содержимое раздела-дубликата пропускается и компилятор переходит

к обработке следующего раздела.

P1031 Maximum number of build tags exceeded

Ошибка, возникающие при обработке файла описания проекта Help(превышено максимально возможное число признаков включения)

Максимально допустимое число используемых признаков включения равно 30. Избыточные признаки игнорируются.

P1033 Duplicate build tag in [BUILDTAGS] section

Ошибка, возникающие при обработке файла описания проекта Help(в разделе [BUILDTAGS] обнаружены признаки-дубликаты)

Имя одного и того же признака включения описано в разделе

[BUILDTAGS] несколько раз.

P1035 Build tag length exceeds maximum (длина имени признака включения превышает предельно допустимое значение)

Длина имени признака включения, содержащегося в указанной

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

P1037 Build tag имя_признака contains invalid characters*

Ошибка, возникающие при обработке файла описания проекта Help(имя признака включения имя_признака содержит недопустимые

символы)

Имя признака включения должно состоять из алфавитно-цифровых

символов и символа подчеркивания (_). Строка игнорируется.

P1039 [BUILDTAGS] section missing



Ошибка, возникающие при обработке файла описания проекта Help(отсутствует раздел [BUILDTAGS])

В файле описания проекта указан параметр BUILD с условием

включения статей, а раздел [BUILDTAGS] отсутствует. Условие игнорируется, в справочный файл включаются все имеющиеся статьи.

P1043 Too many tags in Build expression

Ошибка, возникающие при обработке файла описания проекта Help(в логическом выражении параметра BUILD содержится избыточное число признаков включения)

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

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

игнорируется.

P1045 [ALIAS] section found after [MAP]

Ошибка, возникающие при обработке файла описания проекта Help(раздел [ALIAS] находится после раздела [MAP])

Если в файле описания проекта имеется раздел [ALIAS], то он

должен предшествовать разделу [MAP]. В противном случае, содержимое раздела [ALIAS] игнорируется.

P1047 Context string строка already assigned an alias

Ошибка, возникающие при обработке файла описания проекта Help(контекстной строке строка уже присвоено альтернативное имя)

Переопределение альтернативного имени (сначала a=b, а затем

a=c) невозможно. (Контекстная строка может иметь единственное

альтернативное имя). Указанной контекстной строке уже сопоставлено альтернативное

имя в разделе [ALIAS]. Попытка переопределения альтернативного

имени игнорируется.

P1049 Alias string aliasname already assigned

Ошибка, возникающие при обработке файла описания проекта Help(альтернативное имя уже использовано)

Альтернативное имя нельзя присвоить альтернативному имени(сначала a=b, а затем b=c)

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

P1051 Context string строка cannot be used as alias string

Ошибка, возникающие при обработке файла описания проекта Help(использование контекстной строки строка в качестве альтернативного имени невозможно)

Присваивание сначала a=b, а затем c=a невозможно.

Контекстная строка, которой сопоставлено альтернативное имя



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

P1053 Maximum number of font ranges exceeded

Ошибка, возникающие при обработке файла описания проекта Help(превышено максимально возможное число диапазонов шрифтов)

Допустимо одновременное использование не более 5 команд MAPFONTSIZE. Избыточные команды игнорируются.

P1055 Current font range overlaps previouly defined range

Ошибка, возникающие при обработке файла описания проекта Help(указанные диапазоны шрифтов перекрываются)

В двух командах MAPFONTSIZE указаны перекрывающие диапазоны

размеров шрифтов. Измените указанные диапазоны либо удалите команду, из-за которой происходит перекрытие. Вторая команда MAPFONTSIZE из двух с перекрывающимся диапазонами игнорируется и

соответствующее перемасштабирование не производится.

P1056 Unrecognized font name in Forcefont option

Ошибка, возникающие при обработке файла описания проекта Help(в параметре FORCEFONT указан несуществующий шрифт)

В параметре FORCEFONT указано название шрифта, неизвестного

компилятору. Указанное название игнорируется, компилятор использует шрифт гарнитуры Гельветика (Helvitica)

P1057 Font name is too long

Ошибка, возникающие при обработке файла описания проекта Help(шрифт имеет слишком длинное название)

Длина название шрифта не может превышать 20 символов. Указанное название игнорируется.

P1059 Invalid multiple-key syntax

Ошибка, возникающие при обработке файла описания проекта Help(синтаксическая ошибка в параметре MULTIKEY)

Параметр MULTIKEY определен некорректно. Синтаксис этого параметра описан в разделе "Построение справочного файла системы

интерактивной документации".

P1061 Character already used

Ошибка, возникающие при обработке файла описания проекта Help(символ уже используется)

Указанный идентификатор альтернативной таблицы ключевых слов

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

качестве идентификатора какой-либо другой символ.

P1063 Characters 'K' and 'k' cannot be used



Ошибка, возникающие при обработке файла описания проекта Help(использование символов 'K' и 'k' запрещено)

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

P1065 Maximum number of keyword tables exceeded

Ошибка, возникающие при обработке файла описания проекта Help(используется слишком много таблиц ключевых слов)

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

слов, равное 5. Используйте меньшее число таблиц. Избыточные таблицы игнорируются.

P1067 Equal sign missing

Ошибка, возникающие при обработке файла описания проекта Help(опущен знак равенства)

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

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

P1069 Context string missing

Ошибка, возникающие при обработке файла описания проекта Help(опущена контекстная строка)

В указанной строке слева от знака равенства некорректно опущен контекстный идентификатор (строка)

P1071 Incomplete line in название_раздела section(некорректная строка в разделе название_раздела)

Указанная строка содержит некорректную информацию. Строка

игнорируется.

P1073 Unrecognized option in [OPTIONS] section

Ошибка, возникающие при обработке файла описания проекта Help(в разделе [OPTIONS] указан неверный параметр)

В разделе [OPTIONS] указан параметр, незнакомый компилятору.

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

P1075 Invalid build expression

Ошибка, возникающие при обработке файла описания проекта Help(неверное условие включения)

Логическое выражение параметра BUILD, содержащееся в указанной строке, содержит логические либо синтаксические ошибки.

P1077 Warning level must be 1, 2 or 3

Ошибка, возникающие при обработке файла описания проекта Help(уровень сообщений должен быть равен 1, 2 или 3)

Уровень сообщений, указываемый параметром WARNING, должен

принимать одно из значений 1, 2 или 3. По умолчанию дается наиболее развернутая информация об ошибках (уровень 3)



P1079 Invalid compression option

Ошибка, возникающие при обработке файла описания проекта Help(ошибка в параметре COMPRESS)

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

TRUE или FALSE. Компиляция продолжается в обычном режиме (без

сжатия)

P1081 Invalid title string

Ошибка, возникающие при обработке файла описания проекта Help(неверный заголовок)

В параметре TITLE указана либо пустая строка либо строка

длиннее 32 символов. Избыточные символы игнорируются.

P1083 Invalid context identification number

Ошибка, возникающие при обработке файла описания проекта Help(контекстный номер недопустим)

Контекстный номер, содержащийся в указанной строке, содержит

недопустимые символы (либо отсутствует вообще)

P1085 Unrecognized text

Ошибка, возникающие при обработке файла описания проекта Help(ошибочный текст)

Ошибочный текст, следующий в указанной строке за корректным

текстом, игнорируется.

P1086 Invalid font range syntax

Ошибка, возникающие при обработке файла описания проекта Help(диапазон размеров шрифта указан неверно)

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

игнорируется. Проверьте синтаксис параметра MAPFONTSIZE.

P1089 Unrecognized sort ordering

Ошибка, возникающие при обработке файла описания проекта Help(порядок сортировки некорректен)

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

Parameter names are used only with a function body

Сообщение об ошибке этапа компиляции(имена параметров используются только в теле функции)

При объявлении функции (без определения тела функции) вы

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

функции. Список имен параметров не разрешен.

Примеры объявлений:

int func();

/* объявление без прототипа допустимо */

int func(int, int);

/* объявление с прототипом допустимо */

int func(int i, int j);

/* имена параметров в прототипе - допустимы */



int func(i, j);

/* только имена параметров не допускается */

Parameter число missing name

Сообщение об ошибке этапа компиляции(в параметре пропущено имя)

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

только из спецификатора типа число без имени параметра. В Си это

не допускается (в С++ это допустимо, не невозможно сослаться на

такой параметр в функции)

Parameter параметр is never used

Сообщение об ошибке этапа компиляции(параметр не используется)

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

и часто является следствием описки в параметре. Это предупреждение появляется также, если в теле функции данный параметр переобъявлен как динамическая локальная (automatic)

переменная. Параметр маскируется локальной динамической переменной и не используется.

маршрут - path is too long

Сообщение об ошибке утилиты TLIB(слишком длинный маршрут)

Данная ошибка возникает, когда длина маршрута библиотечного

файла или модуля превышает 64 символа.

Pointer required on left side of -> or ->*

Сообщение об ошибке этапа компиляции(в левой части -> или ->* требуется указатель)

В левой части операции -> или ->* недопустимо ничего, кроме

указателя.

Possible reference to undefined extern xxxx::i in module модуль

Предупреждение утилиты TLINK(возможна ссылка не неопределенный внешний адрес в модуле

"модуль")

Статический элемент данных описан в приложении, но не определен.

Possible unresolved external симв referenced from module модуль

Предупреждение утилиты TLINK(возможно неудовлетворенная внешняя ссылка на "симв" из модуля "модуль")

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

определены.

Possible use of идентификатор before definition

Предупреждение этапа компиляции(возможное использование идентификатора до определения)

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



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

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

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

Possibly incorrent assignment

Предупреждение этапа компиляции(возможно некорректное присваивание)

Данное предупреждение генерируется, когда компилятор обнаруживает операцию присваивания в основном операторе условного выражения (то есть в части оператора if, while, do-while). Чаше всего это происходит из-за опечатки в операции присваивания. Если вы

хотите подавить данное предупреждение, заключите присваивание в

скобки и сравните все с нулем явным образом, то есть:

if (a = b)

...

следует переписать в виде:

if ((a = b) !=0)

...

Program entry point may not reside in an overlay

Сообщение об ошибке утилиты TLINK(точка входа программы не может находится в оверлее)

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

стартовый адрес программы не должен находиться в оверлее. Обычно

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

инициализации C0x.OBJ, задав, например, перед модулем инициализации параметр /o.

public идентификатор in module модуль_1 clashes with prior

module модуль_2

Сообщение об ошибке утилиты TLIB(имеется конфликт между общедоступным идентификатором в модуле_1 и предыдущим модулем модуль_2)

Общедоступный идентификатор может входить в библиотечный

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

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

указывается имя модуля_2.

public идентификатор in module имя_файла clashes with prior module

Сообщение об ошибке утилиты TLIB(имеется конфликт между общедоступным идентификатором в имени_файла и предыдущим модулем модуль)

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


Память и списки модулей


В TDW вы можете записать в окно Log содержимое глобальной

и локальной динамической памяти или список используемых программой модулей. Окно Windows Information (доступное с помощью команды Display Windows Info в SpeedMenu окна Log) позволяет выбрать тип выводимого списка и где вы хотите его начать.

Глобальная динамически распределяемая область памяти - это

память, которую Windows делает доступной для всех приложений. Эта

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

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

Information кнопку с зависимой фиксацией Global Heap и щелкните

"мышью" на OK. Объекты данных выводятся в окне Log.

Кнопка с зависимой фиксацией Start At позволяет вам выводить

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

Чтобы вывести список всех задач и модулей DLL, загруженных в

Windows, выберите в диалоговом окне Windows Information кнопку

Module List, затем OK. Модули будут перечисляться в окне Log.



Параметр быстрых вычислений с плавающей точкой


Borland C++ имеет параметр быстрых вычислений с плавающей

точкой (параметр компилятора режима командной строки -ff). Выключить этот параметр можно при помощи параметра командной строки

-ff-. Его назначение состоит в выполнении некоторой оптимизации,

противоречащей правильной семантике языка Си. Например:

double x;

x = (float)(3.5*x);

Для вычисления по обычным правилам x умножается на 3.5, давая точность результата double, которая затем усекается до точности float, после чего x записывается как double. При использовании параметра быстрых вычислений с плавающей точкой произведение типа long double преобразуется непосредственно в double. Поскольку лишь очень немногие программы чувствительны к потере точности при преобразовании от более точного к менее точному типу с

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



Параметр совместимости -N


Параметр командной строки -N увеличивает совместимость с

утилитой фирмы Microsoft NMAKE. Его следует использовать только в

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

формирующих файлов, созданных для утилиты NMAKE. Предпочтительнее

запускать утилиту MAKE без параметра -N, так как данный параметр

вносит в утилиту MAKE некоторые трудноуловимые отличия:

$$ расширяется в один символ $, а $ расширяется в "пусто".

Символ каре (^) приводит к литеральной обработке последующего символа, если это специальный символ. Например, макрокоманда:

TEST = this is ^

a test

приведет к тому, что TEST будет расширяться в this is \na

test, где \n - это символ языка Си перевода на новую строку. Это особенно полезно, когда вам нужно закончить строку символом продолжения строки:

SOURCEDIR = C:\BOB\OBJ^\

Если за символом каре следует обычный символ (не имеющий

специального значения), то символ каре игнорируется.

Макрокоманда $d не будет специально определяемой текстовой

макрокомандой. Используйте вместо нее директивы !ifdef и

!ifndef.

Предопределенные макрокоманды, которые возвращают маршрут,

не будут заканчиваться обратной косой чертой. Например,

без параметра -N переключатель $(<D) может возвращать

C:\OBJS\, а с параметром -N переключатель $(<D) возвратил

бы C:\OBJS.

Без соответствующей директивы .suffixes утилита MAKE будет

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

началу.

Макрокоманда $* всегда расширяется в имя целевого файла.

(В обычном режиме $* расширяется в имя файлов зависимостей

в неявном правиле.)



Параметр TLINK


Если не указано обратное, описываемые ниже параметры действуют как для TLINK, так и для TLINK32. Регистр параметров различается. Перед параметрами нужно указывать - или /. Отключить заданный по умолчанию параметр можно указанием после него символа

"-", например -P-.

Параметр Команда IDE Linker Описание

/3 Linker 16-bit
Linker Enable 32-bit processing
Выполняет компоновку 32- разрядного кода, создаваемого TASM или совместимого с ним ассемблера.
/aa Target Attributes
Target Model
Задает целевое приложение

Windows.

/ap Target Attributes
Target Model
Задает целевое консольное

приложение.

/A:dd 16-bit Segment Alignment Задает выравнивание страницы в файле .EXE.
/B:xxxxxx 32-bit Linker Image base address Задает базовый адрес образа для 16-разрядных

приложений (в шестнадцатиричном виде).

/c General Case-sensitive link Различает регистр символов в идентификаторах.
/C General Case-sensitive exports, imports Различает регистр в секциях EXPORTS и IMPORTS файла определения модуля.
/d Warnings Warn duplicate symbol in .LIB Предупреждает о дублировании идентификатора в

библиотеке.

/E 16-bit Linker Process extended dictionaries Разрешает обработку в библиотеке расширенных

словарей.

/Enn 32-bit Linker Maximum linker errors Задает максимальное число

ошибок, после которого

обработка прекращается.

/e 16-bit Process extended Dictionaries Игнорирует расширенные

словари в библиотеках. (отмена)

/f 16-bit Linker Inhibit optimizing far to near Запрещает оптимизацию вызовов ближних данных.
/Gn 16-bit Linker Discard nonresident name table Выгрузка нерезидентной

таблицы имен.

/Gr 16-bit Transfer resident to nonresident table Преобразует резидентные

имена в нерезидентную

таблицу имен.

/Gm Map File Print mangled names in map file Включает в файл map правленные имена.
/i 16-bit Linker Initialize segments Инициализирует все сегменты.
/l Map File Include source line numbers Включает номера строк исходного текста.
/L Directory Library (кроме IDE) Задает маршруты поиска

библиотек.

/m Map File Public Создает файл map с общедоступными идентификаторами.
/m General Default Libraries Не использует заданные по

умолчанию библиотеки.

/o Overlay module (атри бутокна) Оверлейные модули или

узла диалогового библиотеки

/P General Pack code segments Упаковка сегментов кода.
/Rk Resource Pack fast load area (не в Linker) Задает параметры RLINK.


.EXE.

/Rv нет ресурсов. Расширенная компоновка
/Rexxxx нет Переименовывает выполняемый файл в xxxx.
/S:xxxxx 32-bit Linker Stack size Задает размер стека (в

шестнадцатиричном виде).

/s Map File Detailed Создает детальную схему

сегментов.

/t нет Создает файл .COM для

DOS (модель tiny).

/Tdc нет Построение файла .COM

DOS.

/Tde нет Построение файла .EXE

DOS.

/Tpc TargetExpert Platform Задает в качестве целевого приложения 32-разрядный файл .EXE.
/Tpd TargetExpert Platform Задает в качестве целевого приложения 32-разрядный файл .DLL.
/Twd TargetExpert Target Type Задает целевое приложение

Windows (файл .EXE).

/Twd TargetExpert Target Type Задает целевое приложение

Windows (файл .DLL).

/v General Include debug information Включает полную отладочную информацию.
/wxxx Уровень предупреждений Разрешает или запрещает

предупреждения.

/x Map File Off Не создает файл map.
/ye нет Использует для свопинга

дополнительную память.

/yx нет Использует для свопинга

TLINK расширенную память.



Параметр -WE


Параметр -WE создает объектный модуль, содержащий только

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

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

Параметр -WE работает только в сочетании с ключевым словом

_export. Этот параметр не экспортирует данные функции, перечисленные в секции EXPORTS или в файле определения модуля. Фактически, этот параметр не работает в сочетании с секцией EXPORTS. В

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

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



Параметр -WS


Параметр -WS создает объектный модуль с функциями, использующими эффективные обратные вызовы. Эта форма начального и завершающего кода подразумевает, что DS==SS, то есть используемый по

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

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

Windows).

Экспортируемым функциям, которые используют этот параметр,

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

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

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

Для DLL эффективные обратные вызовы отсутствуют, так как для

DKLL DS != SS. Из-за предположения о равенстве DS == SS вы можете

использовать этот параметр только в приложениях. Кроме того DS не

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

Windows этого делать не следует).



Параметр -WSE


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

функциями. Этот параметр используется только в BCC (16-разрядный

режим).



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


Параметры дочерних окон и отображаемых элементов MDI определяют класс для дочернего окна или документа/отображаемого элемента.



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


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

код.



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


Параметры идентификационной информации Admin Options идентифицируют информацию, помещаемую в начало всех генерируемых проектом файлов.



Параметры экспорта и импорта


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

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

создавать запись в заголовке выполняемого файла. Это позволяет в

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

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

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

компоновки при загрузке в .EXE библиотеки DLL.



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


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

MDI Client определяют класс, представляющий клиентную область

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



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


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

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



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


Параметры командной строки управляют поведением утилиты MAKE. Заметьте, что имеет значение регистр букв (верхний или нижний); параметр -d не является допустимой заменой параметру -D.

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

черту (/), либо дефис (-).

Параметр Действие

-? или -h Выводит информационное сообщение. Отображаются стандартные параметры, за которыми следует

знак плюс.

-B Осуществляет полную перекомпиляцию всех результирующих файлов вне зависимости от дат создания файлов.
-Dмакро Определяет "макро" как один символ - выражение !ifdef макро будет возвращать True.
[-D]ид=[стр] Определяет названный идентификатор "ид" как строку "стр", стоящую после знака равенства. Эта строка не может содержать ни пробелов, ни знаков табуляции.
-fимя_файла Использует "имя_файла" в качестве формирующего файла для утилиты MAKE. Если "имя_файла" не существует и не задано расширение имени файла, то утилита MAKE пытается найти файл FILENAME.MAK.
-Iкаталог Осуществляет поиск файлов включения в указанном каталоге (а также в текущем каталоге).
-K Сохраняет (не стирает) временные файлы, созданные утилитой MAKE. Все временные файлы имеют формат MAKEnnnn.$$$, где nnnn лежит в диапазоне от 0000 до 9999.
-N Выполняет MAKE как Microsoft NMAKE.
-Uидентиф Отменяет все заданные ранее описания названного идентификатора.
-W Заносит в файл MAKE.EXE заданные в настоящий момент нестроковые параметры (типа -s или -a).
-a Проверяет зависимости включаемых файлов и вложенных включаемых файлов, связанных с файлами .OBJ, и обновляет файл .OBJ, если файл .H изменен.
-c Кэширует информацию о зависимостях, что улучшает

производительность MAKE. Не используйте его с -a а также если MAKE изменяет включаемые файлы.

-dкаталог Используется с -S для задания диска и каталога, который MAKE использует для свопинга (для MAKER не действует).
-e Игнорирует макрокоманду, если ее имя совпадает с

именем переменной операционной среды.

-i Игнорирует состояние завершения всех запускаемых

из MAKE программ и продолжает процесс построения.

-m Выводит дату и время каждого файла при обработке

его MAKE.

-n Выводит команды, но не выполняет их (полезно использовать при отладке).
-p Перед выполнением формирующего файла выводит все макроопределения и неявные правила.
-q Возвращает 0, если цель имеет новую дату и время

и не 0 в противном случае (используется в командных файлах).

-r Игнорирует все правила, определенные в BUIL-

TINS.MAK.

-s Подавляет вывод команд на экран.
-S Выгружает MAKE из памяти при выполнении команд,

что уменьшает использование памяти и позволяет компилировать большие модули. Для MAKER не действует.



Параметры компиляции


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



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



Параметр Команда IDE Описание
@имя_файла имя файла проекта Ввод компилятора считывается из указанного файла подсказки.
+имя_файла нет Используется указанный файл конфигурации.
-1 нет Указывает системе Borland C++, что нужно генерировать расширенный набор команд процессора 80186.
-2 16-bit Compiler Processor 80286 Указывает системе Borland C++, что нужно генерировать команды, совместимые с защищенным режимом работы процессора 80286.
-3 16-bit Compiler Processor 80386 Указывает системе Borland C++, что нужно генерировать 16-разрядные команды, совместимые с защищенным режимом работы процессора 80386.
-3 32-bit Compiler Processor 80386 Указывает системе Borland C++, что нужно генерировать 32-разрядные инструкции защищенного режима процессора 80386.
-4 16-bit Compiler Processor i486 Указывает системе Borland C++, что нужно генерировать 16-разрядные команды защищенного режима процессора 80486.
-4 32-bit Compiler Processor i486 Указывает системе Borland C++, что нужно генерировать 32-разрядные команды защищенного режима процессора 80486.
-5 32-bit Compiler Processor Pentium Указывает системе Borland C++, что нужно генерировать 32-разрядные команды защищенного режима процессора Pentium.
-A Compiler Source ANSI Согласование со стандартом ANSI.
-A-, -AT Compiler Source Borland extensions Согласование со стандартом Borland C++.
-AK Compiler Source Kernighan and Ritchie Согласование со стандартом языка, определенными Кегниганом и Риччи.
-AU Compiler Source UNIX V Согласование со стандартом языка UNIX V.
-an 16-/32-bit Compiler Processor Byte, Word, Double Word Выравнивание на n: 1=байт, 2=слово, 4=двойное слово (для 32-разрядного режима).
-a- 16-bit Compiler Processor Byte Выравнивание на 1 байт.
-B нет Компиляция и вызов ассемблера для обработки кода ассемблера.
-b Compiler Code Generation Allocate enums and ints Указывает компилятору, что для перечислимых типов всегда нужно выделять целое слово.
-b- Compiler Code Generation Allocate enums and ints (отмена) Этот параметр указывает компилятору, что нужно выделять
для перечислимого типа байтовый размер (когда это возможно).
-C Compiler Source Nested Comments Включает вложенные комментарии.
-C- Compiler Source Nested Comments (отмена) Выключает вложенные комментарии.
-c <Project Compile> Компиляция в .OBJ без компоновки.
-Dимя Compiler Defines Определяет имя нулевой строкой.
-Dимя=стр Compiler Defines Определяет имя заданной строкой "стр".
-d Compiler Code Generation Duplicate strings merged Объединяет дублируемые строки.
-d- Compiler Code Generation Duplicate strings merged (отмена) Не объединяет дублируемые строки.
-dc 16-bit Compiler Memory Model Put strings in segments Перемещает строковые литералы из сегмента данных в сегмент кода (16-разрядный режим).
-eимя_файла Редактирования атрибутов узла в администраторе проекта. Компоновка для получения файла с указанными именем.
-Eимя_файла нет Использование указанного файла с указанными именем.
-Fc Compiler Compiler Output Generate COMDEFs Генерирует COMDEF.
-Ff 16-bit Compiler Memory Mode Automatic far data Автоматическое создание переменных (16-разрядный режим).
-Ff=размер 16-bit Compiler Memory Mode Far data Threshold Автоматическое создание переменных. Устанавливает порог в значение размера (16-разрядный режим).
-Fm нет Разрешает параметры -Fc, -Ff и -Fs.
-Fs <Target Expert Alternate startup> Во всех моделях памяти предполагается, что DS=SS (только 16-разрядный режим).
-f Compiler Floating point No floating (отмена) Разрешает плавающую точку.
-f- Compiler Floating point No floating Запрещает плавающую точку.
-ff Compiler Floating point Fast floating point Быстрые операции с плавающей точкой.
-ff- Compiler Floating point Fast floating point (отмена) Операции с плавающей точкой
строго в формате ANSI.
-f87 нет Использование аппаратных инструкций 8087.
-f287 <TargetExpert, шелчок на Fast floating point> Использование аппаратных инструкций 80287 (для приложений DOS).
-G Optimizations Specific Executable Speed Оптимизация по скорости.
-G- Optimizations Specific Executable Size Оптимизация по размеру.
-gn Messages Stop after n warnings Предупреждения: остановка после n сообщений (по умолчанию 100).
-H Compiler Precompiled headers Generate and use Генерация и использование предварительно скомпилированных заголовков.
-Hc нет Кэширование предварительно скомпилированных заголовков. Используется с -H или -Hxxx.
-Hu Compiler Precompiled headers Use but don't generate Использовать, но не генерировать предварительно скомпилированные заголовки.
-H"xxx" Compiler Precom piled headers Stop precompiling after header Остановить генерацию предварительно скомпилированных заголовков в файле "xxx" (32-разряднгый режим). Долиспользоваться с параметрами -H, -Hu или -H=имя_файла.
-H=им_файла Compiler Precompiled headers Precompiled headers file name Задает имя файла для предварительно скомпилированных заголовков.
-h 16-bit Compiler Memory Model Fast huge pointers Использует быстрые арифметические операции с указателями huge (16-разрядный режим).
-lмаршрут Directories Include Задать маршрут поиска для
каталогов и включаемых файлов.
-in Compiler Source Identifier length Определяет длину идентификаторов как n символов (по умолчанию 32).
-Jg C++ Options Template Smart Генерирует определения для
всех экземпляров шаблонов и
объединяет дубликаты.
-Jgd C++ Options Template Global Генерирует определения public для всех экземпляров
шаблонов и дублирует результат в случае ошибок переопределения.
-Jgx C++ Options Templates External Для всех экземпляров шаблонов генерирует все экземпляры шаблонов.
-jn Messages Stop after n errors Останов после n ошибок.
-K Compiler Code Generation Unsigned characters По умолчанию используется
символьный тип unsigned.
-K- Compiler Code Generation Unsigned characters (отмена) По умолчанию используется
символьный тип signed.
-K2 C++ Options C++ Compatibility Mode Don't treat char as distinct Допускает только 2 символьных типа - signed и unsigned
(char интерпретируется как
signed). Применяется для
совместимости с Borland С++
3.1 и младше.
-k Compiler Debugging Standard stack frame Включает стандартный кадр
стека.
-Lмаршрут Compiler Library Использует маршрут поиска
библиотечных файлов.
-lx <параметры компоновщика> Передает компоновщику параметр x (можно указывать несколько параметров).
-l-x <параметр компоновщика> Запрещает для комповновщика
параметр x.
-M выбор Linker Map File Segment, Public или Detailed Задает создание компоновщиком map-файла.
-mc 16-bit Compiler Memory Model Compact Компиляция с использованием
компактной модели памяти
(16-разрядный режим).
-mh 16-bit Compiler Memory Model Huge Компиляция с использованием
огромной модели памяти
(16-разрядный режим).
-ml 16-bit Compiler Memory Model Large Компиляция с использованием
большой модели памяти
(16-разрядный режим).
-mm 16-bit Compiler Memory Model Medium Компиляция с использованием
cредней модели памяти
(16-разрядный режим).
-mml 16-bit Compiler Memory Model Medium and Never Компиляция с использованием
средней модели памяти
(16-разрядный режим). Предполагается, что DS!=SS.
-ms 16-bit Compiler Memory Model Small Компиляция с использованием
малой модели памяти
(16-разрядный режим).
-ms! 16-bit Compiler Memory Model Small and Never Компиляция с использованием
малой модели памяти
(16-разрядный режим). Предполагается, что DS!=SS.
-mt 16-bit Compiler Memory Model Tiny Компиляция с использованием
крошечной модели памяти
(16-разрядный режим).
-mt! 16-bit Compiler Memory Model Tiny and Never Компиляция с использованием
крошечной модели памяти
(16-разрядный режим). Предполагается, что DS!=SS.
-N Compiler Debugging Test stack overflow Проверка переполнения стека.
-nмаршрут Directories Final Задает выходной каталог.
-O Optimization Size Jump optimizations Оптимизирует переходы.
-O1 Optimizations Specific Executable size Генерирует код минимального объема.
-O2 Optimizations Specific Executable size Генерирует код с оптимизацией по выполнению.
-Oa Optimizations Specific Assume no pointer aliasing Оптимизация предполагает,
что выражения с указателями
не имеют псевдонимов или общих подвыражений.
-Ob Optimizations Size Dead code eliminations Исключает не используемый
код.
-Oc Optimizations Spe cific Optimize locally Устраняет дублирование выражений в базовых блоках.
-Od Optimizations Disable all optimizations Запрещает все виды оптимизазации.
-Oe Optimizations Size Global register allocation Распределяет глобальные регистры и определяет диапазон
действия переменной.
-Og Optimizations Specific Optimize globally Устаняет дублирование выражений в функциях.
-Oi Optimizations Speed Inline intristic functions Расширяет общие встроенные
функции как подставляемые.
-Ol Optimizations Size Loop optimizations Оптимизация циклов.
-Om Optimizations Speed Invariant code motions Перемещает из циклов инвариантный код.
-Op Optimizations Speed Copy propagations Распространение копий.
-Os Optimizations Specific Executable size Генерирует код минимального
размера.
-Ot Optimizations Specific Executable speed Генерация кода с максимальной скоростью выполнения.
-Ov Optimizations Speed Induction variables Разрешает индукцию переменых
цикла.
-OW Optimizations Size Windows prolog/ epilog Подавляет inc bp/dec bp в
инструкциях far Windows.
-Ox Optimizations Specific Executable
speed
Генерация кода с максимальной скоростью выполнения.
-oимя_файла нет Компилирует исходные файлы в
файл с указанными именем.
-P <использование Tools> Выполняет компиляцию С++ независимо от расширения исходного файла.
-Pрасшир <использование Tools> Выполняет компиляцию С++ и
устанавливает заданное п
о умолчанию расширение в "рас
шир".
-P- <использование Tools> В зависимости от расширения
исходного файла выполняет
компиляцию Си или С++.
-P-расшир <использование Tools> В зависимости от расширения
исходного файла выполняет
компиляцию Си или С++. Устанавливает заданное по умолчанию расширение в "расшир".
-p 16-bit Compiler Calling Convention Pascal Используется в 16-разрядных
приложениях соглашения по
вызову Паскаля.
-p 32-bit Compiler Calling Convention Pascal Используется в 32-разрядных
приложениях соглашения по
вызову Паскаля.
-p- -pc 16-bit Compiler Calling Conmvention C Использует соглашения по вызову языка Си.
-p- -pc 32-bit Compiler Calling Conmvention C Использует соглашения по вызову языка Си.
-po Compiler Code Generation FastThis Для передачи параметра this
в регистре использует соглашение по вызову fastthis.
-pr 16-bit Compiler Calling Convention Register Для передачи параметров в
регистре используется соглашение по вызову fastcall.
-pr 32-bit Compiler Calling Convention Register Для передачи параметров в
регистре используется соглашение по вызову fastcall.
-ps 32-bit Compiler Calling Convention Standard call Использует стандартное соглашение по вызову stdcall
(32-разрядный режим).
-r Compiler Code Generation Automatic Использует регистровые переменные.
-r- Compiler Code Generation None Запрещает использование регистровых переменных.
-rd Compiler Code Generation Register keyword Допускает размещение в регистрах только описанные регистровые переменные.
-R Compiler Debugging Browser reference information in OBJs Включает в генерируемые обектные файлы информацию для
просмотра.
-RT C++ options Exceptions handling/RTTI Enable run-time type info Разрешает информацию о типах
этапа выполнения.
-S <оперативное меню администратора проекта> Создает выходной файл .ASM.
-Tстрока <использование Tools> Передает TASM, TASM32 или
другому ассемблеру указанный
строковый параметр.
-T- <использование Tools> Удаляет все предыдущие параметры ассемблера.
-tD <TargetExpert> Формирует файл .EXE DOS.
-tDc <TargetExpert> Формирует файл .COM DOS.
Параметры компиляции (продолжение)
-tDe <TargetExpert> Формирует файл .EXE DOS.
-tW 16- Compiler Entry/Exit Windows all functions exportable Формирует целевой файл GUI
.EXE.
-tWC <TargetExpert> Создает целевой консольный
файл .EXE со всеми функциями, заданными как экспортируемые.
-tWCD <TargetExpert> Создает целевой консольный
файл .DLL со всеми функциями, заданными как экспортируемые.
-tWCDE <TargetExpert> Создает целевой консольный файл .DLL с явными экспортируемыми функциями.
-tWD 16-bit Compiler Entry/Exit Windows DLL, all functions exported Создает целевой файл GUI
.DLL со всеми функциями,
описанными как экспортируемые.
-tWDE 16-bit Compiler Entry/Exit Windows DLL, explicit funs exported Создает целевой файл GUI
.DLL с явными функциями,
описанными как экспортируемые.
-tWE 16-bit Compiler Entry/Exit Windows explicit funs exported Создает целевой файл GUI
.EXE с явными функциями,
описанными как экспортируемые.
-tWM <TargetExpert и выбор Multithread> Создает мультинитевый модуль
(32-разрядный режим).
-tWS 16-bit Compiler Entry/Exit Windows smart callbacks, all funcs Определяет целевой файл, как
файл .EXE Windows, использующий эффективные обратные
вызовы (16-битовый режим).
-tWSE 16-bit Compiler Entry/Exit Windows smart callbacks, explicit Формирует целевой файл .EXE,
использующий обратные вызовы, с явными экспортируемыми
функциями (16-разрядный ре жим).
-Uимя <использовать в проекте Local Override> Отменяет все ранее заданные
определения указанного имени.
-u Compiler Compiler Output Generate underscores Генерирует подчеркивания.
-v, -v- Compiler Debugging Debug information in OBJs Включает в объектные файлы
отладочную информацию.
-vi, -vi- Compiler Debugging Out-of-line inline functions Управляет расширением подставляемых функций.
-V0 C++ Options Virtual Tables External Внешние виртуальные таблицы
C++.
-V1 C++ Options Virtual Tables Public Общедоступные виртуальные
таблицы C++.
-V C++ Options Virtual Tables Smart Использует эффективные виртуальные таблицы С++.
-Va C++ Options C++ Comp Pass class values via reference to temp Передает аргументы класса по
ссылке на временную переменную.
-Vb C++ Options C++ Compatibility Same size as 'this' pointer Создает указатель на виртуальный базовый класс того же
размера, что и указатель
'this' этого класса (16-разрядный режим).
-Vb- C++ Options C++ Compatibility Always near Создает указатель виртульного базового класса всегда
типа near (16-разрядный режим).
-Vc C++ Options C++ Compatibility Disable constructor displacement Не изменяет схему классов
для ослабления ограничений,
накладываемых на указатели
элементов (16-разрядный режим).
-Vt 16-bit Compiler Memory Model Far virtual tables Виртуальные таблицы С++ типа
far (16-разрядный режим).
-Vmd C++ Options Member Pointer Smallest for class Использует для указателей
элементов минимальное представление.
-Vmm C++ Options Member Pointer Support multiple inheritance Указатели элементов поддерживают множественное наследование.
-Vmp C++ Options Member Pointer Honor precision of member function Задает описанную точность для всех указателей функций-элементов.
-Vms C++ Options Member Pointer Support single inheritance Указатели элементов поддерживают одинарное наследование.
-Vmv C++ Options Member Pointer Support all cases Указатели элементов не имеют
ограничений.
-Vo нет Разрешает все параметры обратной совместимости.
-Vp C++ Options C++ Compatibility Push "this" first to Pascal Передает указатель "this"
"паскалевским" функциям-элементам как первый параметр в
стеке.
-Vs C++ Options C++ Comp Virtual table Pointer follows data members Размещает указатель виртуальной таблицы после нестатических элементов данных.
-Vv C++ Options C++ Compatibility 'deep' virtual bases Не добавляет к классам с
указателями на элементы виртуального базового класса
скрытые элементы и код.
-W 16-bit Compiler Entry/Exit Windows all functions exportable Целевой файл .EXE GUI создается со всеми экспортируемыми функциями.
-WD 16-bit Compiler Entry/Exit Windows DLL, all functions exportable Создает целевой файл .DLL
Windows со всеми экспортируемыми функциями.
-WDE 16-bit Compiler Entry/Exit Windows DLL, all functions exported Создает целевой файл .DLL
Windows со явными экспортируемыми функциями.
-WDE 16-bit Compiler Entry/Exit Windows explicit functions exported
Целевой файл .EXE Windows
создается с явными экспортируемыми функциями.
-WM <TargetExpert и выбор multithread> Создает мультинитевый целевой модуль (32-разрядный режим)
-WSE 16-bit Entry/Exit Win smart callbacks, explicit functions exported Создает целевой файл .EXE
для Windows, в котором экспортируемые функции используют эффективные обратные
вызовы (16-разрядный режим).
-w! Make Break Make on warnings При наличии предупреждений
компилятор возвращает ненулевой код и не создает файл
.OBJ.
-w Messages All Выводит предупрежления.
-w- Messages None Не выводит предупреждения.
-wxxx Messages Selected Разрешает предупреждающие
сообщения xxx.
-w- xxx Messages Selected Запрщшает предупреждающие
сообщения xxx.
-X Compiler Compiler Output Autodependency information (выбор) Не использовать вывод компилятора с автоматической зависимости.
-X- Compiler Compiler Output Autodependency information (отмена) Использовать вывод компилятора с автоматической зависимости.
-x C++ Options Exception handling Enable exceptions Разрешение обработки исключительных ситуаций.
-xd C++ Options Exception handling
Enable destructor
cleanup
Разрешение очистки деструктора.
-xp C++ Options Exception handling Enable exception location info Разрешение размещения информации исключительных ситуаций.
-Y <TargetExpert DOS Overlay> Разрешает генерацию оверлейного кода.
-Yo <редактирование атрибутов узла и
выбор Overlay this
module>
Создает оверлей из компили руемого файла.
-y Compiler Debugging Line numbers Включает нумерацию строк.
-Z Optimizations Size Supress redundant loads Разрешение загрузки регистра.
-zAимя 16-bit Compiler Segment Names Code
Code Class
Класс кода.
-zBимя 16-bit Compiler Segment Names Data
Uninitialized Data
Class
Класс BSS.
-zCимя 16-bit Compiler Segment Names Code
Code Segment
Сегмент кода.
-zDимя 16-bit Compiler Segment Names Data
Uninitialized Data
Segment
Сегмент BSS.
-zEимя 16-bit Compiler Segment Names Far
Data Far Data
Segment
Сегмент Far (16-разрядный
режим).
-zFимя 16-bit Compiler Segment Names Far
Data Far Data Class
Класс Far (16-разрядный режим).
-zGимя 16-bit Compiler Segment Names Data
Uninitialized Data
Group
Группа BSS.
-zHимя 16-bit Compiler Segment Names Far
Data Far Data Group
Группа Far (16-разрядный режим).
-zPимя 16-bit Compiler Segment Names Code
Code Group
Группа кода.
-zRимя 16-bit Compiler Segment Names Data Initialized Data
Segment
Сегмент данных.
-zSимя 16-bit Compiler Segment Names Data Initialized Data
Group
Группа данных.
-zTимя 16-bit Compiler Segment Names Data Initialized Data
Class
Класс данных.
-zVимя 16-bit Compiler Segment Names Far
Data Virtual Table Segment
Виртуальный сегмент far
(16-разрядный режим).
-zWимя 16-bit Compiler Segnment Far Data
Virtual Table Class
Виртуальный класс far (16-разрядный режим).
-zX нет Для X используется заданно
по умолчанию имя (X - это A-
или R, P, S, T, V, W).

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


Параметры BCC воспринимаются последовательно слева направо.

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

Если вы дублируете параметр, то последний параметр переопределяет предыдущий (за исключением -I и -L).

При указании в командной строке нескольких параметров -I и

-L результат будет кумулятивным (компилятор выполняет поиск по всем перечисленным каталогам слева направо).



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


Параметры основного окна Main Window управляют характеристи-

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



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


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



Параметры проекта


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

Выберите Options Project. Выводится диалоговое окно.

Отредактируйте параметры и выберите OK.

Установленные параметры применяются ко всему проекту. При

создании нового проекта ему назначаются параметры последнего открытого проекта. Чтобы выбрать другие параметры, используйте Local Override или Style Sheet.



Параметры редактора


Окна редактора (всего их может быть до 32) позволяют вам

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

и позицию курсора. С помощью команды Edit Undo (или Alt+пробел)

вы можете отменять изменения. Число допустимых команд Undo (уровень отмены) можно задать с помощью Options Enviroment Editor Options и установки Undo Limit.

Можно настроить конфигурацию редактора таким образом, чтобы

он выглядел и вел себя аналогично редакторам Brief и Epsilon. Редактор интегрированной среды использует файл конфигурации клавиатуры .CKB, который задает для редактора клавиатурные сокращения.



Параметры -W и -WC


Параметр -W создает прикладной объектный модуль Windows, в

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

начальный и завершающий код для каждой функции, обеспечивая ее

экспортируемость. Это не означает, что все функции действительно

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

функций вы должны использовать ключевое слово _export или добавить запись этой функции в секцию EXPORTS файла определения модуля. Эквивалентный параметр -WC используется для 32-разрядных приложений консольного режима.



Параметры -WD и -WCD


Эти параметры создают объектный модуль DLL, в котором все

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

32-битовых приложений консольного режима.



Параметры -WDE и -WCDE


Этот начальный и завершающий код также используется для

функций, которые будут находиться в DLL. Однако любые функции,

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

определении функции _export. Параметр -WCDE используется для

32-битовых приложений консольного режима.



Печать документа


Windows интерпретирует распечатку как последовательность команд, поэтому объект распечатки должен превращать документ в последовательность образов страниц. Объект распечатки должен иметь

возможность делать следующее:

устанавливать параметры печати;

вычислять общее число страниц;

отображать каждую страницу в контекст устройства;

указывать, что больше страниц нет.



Печать каждой страницы


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

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

функцию-элемент PrintPage объекта распечатки. При написании функций PrintPage нужно учитывать следующее:

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

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

Возможности устройства. Хотя большинство видеоустройств

поддерживают все операции GDI, некоторые принтеры этого не

делают. Для выполнения сложных задач вывода ваша программа

должна вызывать функцию API Windows GetDeviceCaps, которая

возвращает важную информацию о возможностях конкретного

устройства вывода.



Перечень сообщений


')' missing in macro invocation in command команда

Фатальная ошибка утилиты MAKE

(в вызове макрокоманды в команде команда пропущена ')')

В вызове макрокоманды требуется левая скобка.

) expected

Сообщение об ошибке этапа компиляции

(требуется ))

В конце списка параметров ожидается правая круглая скобка.

( expected

Сообщение об ошибке этапа компиляции

(требуется ()

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

, expected

Сообщение об ошибке этапа компиляции

(требуется ,)

В списке объявлений, инициализации или параметров ожидается запятая.

: expected alter private/protected/publlc

Сообщение об ошибке этапа компиляции

(требуется : после private/protected/public)

При использовании резервированных слов private/ protected/public для того, чтобы начать соответствующий раздел класса С++, за ними должно следовать двоеточие.

< expected

Сообщение об ошибке этапа компиляции

(требуется <)

За < не следует ключевое слово template. Каждое описание

шаблона должно включать в себя формальные параметры шаблона, заключенные в <>, за которыми непосредственно следует ключевое слово template.

@ seen, expecten a response-files name

Ошибка TLIB

(обнаружено @, предполагается имя командного файла)


Непосредственно после @ не задан командный файл утилиты.

{ expected


Сообщение об ошибке этапа компиляции

(требуется {)


В качестве начала блока или инициализации ожидается левая

фигурная скобка.

} expected


Сообщение об ошибке этапа компиляции

(требуется })


В конце блока или инициализации ожидается правая фигурная

скобка.

16-bit segments not supported in module модуль


Сообщение компоновщика об ошибке

(16-разрядные сегменты в данном модуле не поддерживаются)


16-разрядные сегменте не поддерживаются в 32-разрядных приложениях. Возможно вы компилируете свое 32-разрядное приложение

16-разрядным компилятором.

286/287 instructions not enabled


Cообщение об ошибке этапа компиляции

(Команды 286/287 не разрешены)


Чтобы разрешить использование команд 286/287, используйте

параметр командной строки компилятора -2 или параметр 80286 диалогового окна Options Compiler Code Generation (Параметры Компилятор Генерация кода). Учтите, что полученный при этом код не может использоваться на машинах с процессорами 8086 или 8088.

32-record encountered


Сообщение об ошибке утилиты TLINK

(обнаружена 32-разрядная запись)


Обнаружен объектный файл, содержащий 32-битовые записи

80386, а параметр /3 не используется.



Передача данных


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

данные явным образом.

Передача в окно происходит автоматически при построении

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

для загрузки данных из буфера передачи вызывается TransferData.

SetupWindow оконного объекта вызывает функции SetupWindow каждого

дочернего окна, так что дочерние окна также могут передавать свои

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

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

с идентификатором ID или IDOK, он автоматически передает данные

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

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

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

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

передаются из буфера передачи в управляющие элементы.

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

параметре которой задается tdSetData (передача из буфера) или

tdGetData (передача в буфер).

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

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

функции-элемента Transfer.

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



Передача значений в C++


Как на самом деле передаются значения в C++? Они передаются с

вызовом функции. Но это сможет сделать не любая функция, а только

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

Тип объекта Объект

v v

sber_bank my_bank;

double paycheck = 100.0; < Старый стиль передачи

double party_money; значения по переменной, а

не по ссылке

Объект Метод (выбранное сообщение)

v v

my_bank.deposit(paycheck); Значение

v

party_money = my_bank.withdraw(500.00);



Переименование элемента AppExpert


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

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

с проектом исходные файлы.

В окне проекта выберите цель AppsExpert, щелкните на ней

правой кнопкой "мыши", затем выберите Special Rescan. После завершения Rescan возвращает вас в окно проекта IDE.



Переключатель Integer Format


Кнопки с зависимой фиксацией Integer Format (Формат целых

чисел) позволяет вам определить один из трех форматов, управляющих выводом целых чисел:

Decimal (Десятичный) Целые числа выводятся, как

обычные десятичные значения.

Hex (Шестнадцатиричный) Целые числа выводятся в

шестнадцатиричном виде в формате, принятом в соответствующем языке.

Both (Оба) Целые числа выводятся и как десятичные, и как шестнадца тиричные значения (которые указываются в скобках после шестнадцатиричных значений).

Переключатель Screen Lines (Размер экрана) можно использовать для того, чтобы определить, использует ли Turbo Debugger

обычный 25-строчный режим экрана или 40- или 50-строчный режим,

доступный при работе с адаптерами EGA и VGA.

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

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

табуляции можно установить в значения от 1 до 32.

Поле Background Delay, которое выводится только в TD32.EXE,

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

использовании этого параметра в сочетании с командой Run Wait for

Child вы можете наблюдать действия программы в экранах Turbo Debugger при ее выполнении.

Поле User Screen Delay, которое выводится только в TD32,

позволяет задать время вывода экрана программы при нажатии Alt+F5

(команда Windows User Screen). Это полезно использовать при работе с TD32 в режиме полного экрана, когда вам нужно видеть окна

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

Turbo Debugger.

Команда Path for Source (Маршрут доступа к исходному файлу)

задает каталоги, в которых Turbo Debugger будет искать исходные

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

запятой. Хотя поле ввода Enter Source Directory Path может содержать максимум 256 символов, для задания более длинных маршрутов




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

введите символ @, затем задайте имя файла.

Команда Save Options (Сохранить параметры) открывает диалоговое окно, с помощью которого вы можете сохранить текущие параметры на диске в файле конфигурации. В этом файле сохраняются:

ваши макрокоманды (кнопка Options);

текущая схема окон и форматы областей окон (Layout);

все значения параметров, заданные в меню Options (кнопка

Options).

[*] Save configuration

[X] Options OK

[ ] Layout Cancel

[ ] Macros

Save to Help

tdconfig.tdw

Поле ввода Save To позволяет также задать имя файла конфигурации. По умолчанию TDW.EXE использует TDCONFIG.TDW, а TD32.EXE TDCONFIG.TD2.

Команда Restore Options позволяет восстановить параметры из

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

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

задавать файл параметров, созданный с помощью команды Options Save Options или утилиты установки отладчика.


Переменная _8087 (dos.h)


Флаг микропроцессора (для DOS, Win16, Win32). Устанавливается в ненулевое значение, если логика автообнаружение кода запуска

обнаруживает наличие сопроцессора. Эту логику можно переопределить установкой переменной операционной среды 87.



Переменная _argc (dos.h)


Содержит число аргументов командной строки (для DOS, Win16,

Win32 и OS/2) - значение argc, переданное main при запуске программы.



Переменная _argv (dos.h)


Массив указателей на аргументы командной строки (для DOS,

Win16, Win32 и OS/2). Элементы этого массива передаются программе

при ее запуске.



Переменная _ctype (ctype.h)


Информационных массив символьных атрибутов (для DOS, Win16,

Win32 и OS/2), индексируемых значением ASCII +1. Каждая запись это битовый набор, описывающий символ.



Переменная _daylight (time.h)


Указывает, требуется ли сохранение настраиваемого времени

суток (для DOS, Win16, Win32 или OS/2). Используется функциями

даты и времени. Принимает значения 1 (сохраненное время) и 0

(стандартное).



Переменная _directvideo (cohio.h)


Флаг, управляющий видеовыводом (для DOS, Win16, Win32). Определяет вывод непосредственно в видеопамять (1) или через вызовы

BIOS в ПЗУ (0). По умолчанию равна 1. Эту переменную следует использовать только в символьных приложениях.



Переменная _environ (dos.h)


Позволяет обращаться к системным переменным операционной

среды и представляет собой массив указателей на строки "переменная=значение" (для DOS, Win16, Win32 и OS/2). Значение в строке

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

Обращаться к _environ можно через getenv, а добавлять, изменять или удалять записи массива _environ - с помощью getenv.



Переменная _floatconvert (stdio.h)


Компонует форматы с плавающей точкой (для DOS, Win16, Win32

и OS/2). Вывод с плавающей точкой требует компоновки подпрограмм

преобразования. Для уменьшения размера такая компоновка автоматически не выполняется. Однако, она выполняется автоматически при

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



Переменная _fmode (fcntl.h)


Определяет заданный по умолчанию режим трансляции - текстовый или двоичный (для DOS, Win16, Win32 и OS/2). По умолчанию задается текстовый режим: при вводе возврат каретки/перевод строки

транслируется в перевод строки, а при выводе наоборот.



Переменная _new_handler


Перехватывает операции распределения (для DOS, Win16, Win32

и OS/2). Содержит указатель на функцию без аргументов, возвращающую void. При невозможности распределения памяти будет вызываться

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



с эмуляцией сопроцессора 80x87, которая


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

Существует ряд ситуаций, в которых вам может понадобиться

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

по умолчанию. Например, ваша собственная исполняющая система может иметь сопроцессор 80х87, но вам требуется проверить, будет ли

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

совместимой с PC, но данная конкретная система возвращает логике

автоматического определения наличия сопроцессора неверную информацию (либо при отсутствии сопроцессора 80х87 говорит, что он на

месте, либо наоборот).

Borland C++ имеет параметр для переопределения логики определения наличия сопроцессора при загрузке программы. Этот параметр - соответствующая переменная операционной среды системы 87.

Переменная операционной среды 87 устанавливается в ответ на подсказку DOS при помощи команды SET:

C>SET 87=N

или

C>SET 87=Y

Ни с какой стороны знака равенства не должно быть пробелов.

Установка переменной операционной среды 87 в N говорит загрузочному коду исполняющей системы о том, что вы не хотите использовать сопроцессор 80х87 даже в том случае, если он установлен в

системе.

Установка переменной операционной среды в значение Y означает, что сопроцессор на месте и вы желаете, чтобы программа его

использовала. Программист должен знать следующее: если установить

87=Y, а физически сопроцессор 80х87 в системе не установлен, то

система "зависнет".

Если переменная операционной среды 87 была определена (с любым значением), и вы желаете сделать ее неопределенной, введите в

ответ на подсказку DOS:

C>SET=

Непосредственно после знака равенства нажмите клавишу Enter,

и переменная 87 станет неопределенной.


Переменная _psp (dos.h)


Содержит адрес сегмента PSP для текущей программы (для DOS,

Win16, Win32 и OS/2). PSP - это дескриптор процесса DOS, который

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



Переменная _threadid (stddef.h)


Указатель на идентификатор нити (для DOS, Win32 и OS/2).

Это значение длинного целого типа, идентифицирующее текущую выполняемую нить.



Переменная _timezone (time.h)


Содержит разницу в секундах между местным временем и временем по Гринвичу (для DOS, Win16, Win32 и OS/2). Используется

функциями даты и времени.



Переменная _tzname (time.h)


Массив указателей на имена временных поясов (для DOS, Win16,

Win32 и OS/2).



Переменная _version (dos.h)


Содержит номер версии операционной системы (для DOS, Win16,

Win32 и OS/2). Основной номер версии находится в старшем байте

(или слове для 32-разрядного приложения).



Переменная _wscroll (conio.h)


Разрешает или запрещает прокрутку в консольных функциях ввода-вывода (для DOS, Win16, Win32 и OS/2). По умолчанию прокрутка

разрешена - переменная имеет значение 1. При установке в 0 прокрутка запрещается. Данную переменную следует использовать только

в текстовых приложениях.



Переменные alias


Переменные alias являются псевдонимами для других переменных.

Работая, как указатели, они (при обращении к ним) получают автоматически значение объекта, на который они ссылаются. Объявляются они с

помощью операции '&':

int i = 42;

int &k = i; // k принимает значение i

printf("%d\n", k); // k разыменовывается автоматически, печатает 42

k = 55; // Присваивает значение и i, и k = 55

Здесь уточняется как это переводится на Cи:

Cи Tурбо и Borland C++

int i = 42; int i = 42;
int *k = &i; int &k = i;
printf("%d\n", *k); printf("%d\n", k);
*k = 55; k = 55;



Переменные errno, _doserrno, _sys_errlist, _sys_nerr (dos.h, errno.h)


Для печати сообщений об ошибке разрешает perror (для DOS,

Win16, Win32 и OS/2). Функция perror использует эти переменные

для вывода сообщений об ошибках.

Переменная Назначение

errno Указывает тип ошибки при математическом

или системном вызове. В других ситуациях

не содержит кода ошибки.

_doserrno Содержит фактический код ошибки операционной системы, когда вызов операционной системы дает ошибку.
_sys_errlist Массив строк сообщений. В качестве индекса

массива для поиска строки по номеру ошибки

можно использовать errno.

_sys_nerr Число строковых сообщений в _sys_nerr.

Мнемонические обозначения в _sys_errlist показаны в следующей таблице:

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

E2BIG Слишком длинный список аргументов.
EACCES В разрешении отказано.
EBADF Неверный номер файла.
ECHILD Нет дочернего процесса (Ч).
ECONTR Попытка удаления текущего каталога CurDir.
EDEADLOCK Нарушение блокировки (Ч).
EDOM Ошибка домена (*) или математического аргумента (Ч).
EEXIST Файл уже существует.
EFAULT Неизвестная ошибка.
EINTR Прерванный функциональный вызов (Ч).
EINVACC Недопустимый код доступа.
EINVAL Недопустимый аргумент.
EINVDAT Недопустимые данные.
EINDRV Недопустимая спецификация диска.
EINVENV Недопустимая операционная среда.
EINVFMP Недопустимый формат.
EINVFNC Недопустимый номер функции.
EINVMEM Недопустимый адрес блока памяти.
EIO Ошибка ввода-вывода (Ч).
EMFILE Открыто слишком много файлов.
EMATOOLONG Слишком длинное имя файла (Ч).
ENFILE Слишком много открытых файлов.
ENMFILE Файлов больше нет.
ENODEV Нет такого устройства.
ENOENT Нет такого файла или каталога.
ENOEXEC Ошибка формата выполняемого файла.
ENOMEM Не хватает памяти.
ENOPATH Маршрут не найден.
ENOSPC На устройстве не осталось места (Ч).
ENOTSAM Не то же устройство.
ENXIO Нет такого устройства или адреса (Ч).
EPERM Операция не разрешена (Ч).
EPIPE Нарушение конвейера (Ч).
ERANGE Результат вне диапазона (*) или слишком велик (Ч).
EORFS Файловая система доступна только по чтению (Ч).
ESPIPE Неразрешенная операция установки позиции (Ч).
EXDEV Перекрестная связь между устройствами.
EZER0 Ошибка 0.
<


(Ч) - только для 32-разрядных приложений.

(*) - только для 16-разрядных приложений.

Ниже перечислены мнемоники фактических кодов ошибок DOS, в

которые может устанавливаться _doserrno (это значение может не

отображаться через errno):

Мнемоника Код ошибки DOS
E2BIG Неверная операционная среда.
EACCES Доступ запрещен.
EACCES Неверный доступ.
EACCES Это текущий каталог.
EBADF Неверный описатель.
EFAULT Зарезервирован.
EINVAL Неверные данные.
EINVAL Неверная функция.
EMFILE Слишком много открытых файлов.
ENOENT Такого файла или каталога нет.
ENOEXEC Неверный формат.
ENOMEM Нет памяти.
ENOMEM Плохой блок.
EXDEV Неверный диск.
EXDEV Не то же устройство.

Переменные _osmajor, _osminor_, _osversion (dos.h)


Содержит основной и дополнительный номера версии операционной системы (для DOS, Win16, Win32 и OS/2).



Переменные-ссылки, используемые в качестве аргументов


Одним из нововведений в С++ является новый вид переменных -

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

'&'. Ссылка схожа с переменной во всем, однако, на самом деле она

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

В Си, если вы хотите непосредственно работать с передаваемой в

функцию переменной, вам нужно передать указатель на эту переменную.

При этом нужно соблюдать соответствующий синтаксис и помнить о том,

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

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

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

typedef struct { struct rect { // Определение структуры

int wd, ht; int wd, ht; // Ширина и высота

} rect; }; // прямоугольника

Передача ссылки

v

int area(rect *r) int area(rect& r) // Вычисление

{ { // площади прямоугольника

return r->wd*r->ht; return r.wd * r.ht;

} } ^

- Использование раздели-

теля вместо '->'

rect r; rect r;

int k = area(&r); int k = area(r);

В данном примере, для вычисления площади прямоугольника, после

определения структуры rect описана функция элемент area с параметром-ссылкой r. После инициализации переменной r типа rect, выполняется вызов функции элемента area с аргументом r, который будет

использоваться не явно, а в качестве ссылки. Таким образом, незаметно

для нас, аргумент передан в функцию элемент, через его адрес. Отметим, что rect& r, rect &r и rect & r эквивалентны.

Отличием C++ от языка Си является смена разделителя с '->' на '.'.



Переменные стека


С помощью окна Stack вы можете проверить любые переменные

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

этого откройте окно стека и подсветите проверяемую функцию. Затем

нажмите F10 и выберите Locals. Область Statis окна Variables показывает значения аргументов.



Переменные __throwExceptionName, __throwFileName, __throwLineNumber (except.h)


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

(для DOS, Win16, Win32 и OS/2). Эти глобальные переменные позволяют получить имя и место возникновения особой ситуации (в виде

текстовой строки).



Перемещение класса


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

сделайте следующее:

Переместите (вырезанием и вставкой) исходный код класса в

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

Выберите в проекте целевой файл AppsExpert, щелкните правой кнопкой "мыши" для просмотра SpeedMenu, затем выберите

Special Rescan. После завершения Rescan возвращает вас в

окно проекта IDE.



Перемещение узлов и целей


Такое перемещение можно выполнить несколькими способами:

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

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

Выберите узел и нажмите Alt и стрелку. При этом выбранный

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



Переносимость системных вызовов DOS


Для вызова функций файлового ввода-вывода DOS Windows 3.0

предусматривает функцию API DOS3Call. Эта и другие функции INT

21H заменены в Win32 соответствующими 32-разрядными вызовами.

Функция
21H Операция
DOS Эквивалент API
Win32

OEH Выбор диска. SetCurrentDirectory
19H Получение текущего диска. GetCurrentDirectory
2AH Получение даты. GetDateAndTime
2BH Установка даты. SetDateAndTime
2CH Получение времени. GetDateAndTime
3DH Установка времени. SetDateAndTime
36H Получение свободного GetDiskFreeSpace

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

39H Создание каталога. CreateFile
3AH Удаление каталога. RemoveDirectory
3BH Установка текущего каталога. SetCurrentDirectory
3CH Создание описателя. CreateFile
3DH Открытие описателя. CreateFile
3EH Закрытие описателя. CloseHandle
3FH Чтение описателя. ReadFile
40H Запись описателя. WriteFile
41H Удаление файла. DeleteFile
42H Получение атрибутов файла. SetFilePointer
43H Получение атрибутов файла. GetAttributesFile
43H Установка атрибутов файла. SetAttributesFile
47H Получение текущего каталога. GetCurrentDirectory
4EH Поиск первого файла. FindFirstFile
4FH Поиск следующего файла. FindNextFile
56H Изменение записи каталога. MoveFile
57H Получение даты/времени файла. GetDateAndTimeFile
57H Установка даты/времени файла. SetDateAndTimeFile
59H Получение расширенной ошибки. GetLastError
5AH Создание уникального файла. GetTempFileName
5BH Создание нового файла. CreateFile
5CH Блокировка файла. LockFile
5CH Разблокировка файла. UnlockFile
67H Установка описателя счетчика. SetHandleCount



Переопределение функций-элементов класса проверки допустимости


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

также модифицировать стандартные механизмы проверки допустимости

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

вы решили это сделать, то вам потребуются функции Valid, IsValid,

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



Переопределение области действия


Область действия идентификатора - это та область программы,

в которой на него можно ссылаться. Заданные в выражении идентификаторы Turbo Debugger ищет в следующем порядке:

идентификаторы в стеке текущей функции;

идентификаторы в модуле, содержащем текущую функцию;

глобальные идентификаторы (вся программа);

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

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

область действия, это может дать непредсказуемые результаты, поэтому для возврата к текущей точке используйте команду Origin окна Module.

Синтаксис переопределения области действия зависит от выбранного в окне Options Language языка. В Си, С++ и ассемблере для

этого используется символ #, в Pascal - точка. Таким образом, для

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

(в квадратные скобки заключены необязательные элементы):

[#модуль[#имя_файла]]#номер_строки[#номер_переменной]

или

[#модуль[#имя_файла]][#имя_функции]#имя_переменной



Переопределение операций


Поскольку в С++ операции, рассматриваются как функции, то очевидно, что и их можно переопределять так, что они будут работать не

только с числами, а даже с графическими объектами, строками и вообще

с чем угодно. В С++ число операций ограничено стандартным набором:

[] () . -> ++ --

& * + - ~ !

sizeof / % << >> <

> <= >= == != ^

| && || ?: = *=

/= %= += -= <<= >>=

&= ^= |= , # ##

Чтобы определить операцию, необходимо определить функцию, именем

которой является специальное ключевое слово oрerator, за которым сле-

дует символ операции.

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

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

разрушающем привычный формат (например: 20.04 + 05.57 = 02.01).

Переопределяемые операции

v v

time operator+(time a, time b) <

{ ^

time c; операция +

return c = a.val + b.val;

}

time work_time, busy_time, birth_time;

> вызывает переопределенную операцию

work_time = busy_time + goof_off_time;

Тип операнда определяет какую из переопределенных операций необ-

ходимо использовать.

При переопределении операции действуют следующие ограничения:

С++ не различает префиксные и постфиксные версии операций ++ и

--.

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

вать в языке. Например, вы не можете определить операцию #.

нельзя переопределить следующие операции:

. .* :: ?:

переопределенные операции сохраняют свое первоначальное старшинство.

если @ обозначает любую унарную операцию, то выражения x@ и @x

можно интерпретировать либо как x.операция@(), либо как опера-

ция@(x). Если описаны обе формы, то компилятор попытается раз-

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

переопределение бинарной операции @ в x@y может толковаться

либо x.операция@(y), либо операция@(x,y), и если определены

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

Пример бинарной операции уже был: это версия операции +, для

сложения времени, где a.val + b.val интерпретируется, как:

a.val.(операция + (b.val)).

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



Перестроение файла базы данных .APX


Чтобы перестроить потерянный или запорченный файл .APX, сделайте следующее:

Откройте файл проекта, содержащий цель AppsExpert и зависимые узлы (.IDE).

Выберите цель AppsExpert, щелкните на ней правой кнопкой

"мыши" и выберите в оперативном меню Special Rescan. После

завершения Rescan возвращает вас в окно проекта IDE.

Утилита WinSight

Начало работы

Запуск и приостановка обновления экрана

Выбор области просмотра

Область списка классов

Использование области списка классов

Наблюдение за классами

Область дерева окон

Поиск окна

Наблюдение за окнами

Выбор трассируемых сообщений

Использование области трассировки сообщений

Другие параметры трассировки сообщений

Сообщения от "мыши"

Сообщения Windows

Сообщения ввода

Системные сообщения

Сообщения инициализации

Сообщения буфера вырезанного изображения

Сообщения DDE

Неклиентные сообщения

Сообщения печати

Управляющие сообщения

Сообщения пера

Сообщения мультимедиа

Другие сообщения

Сообщения, не документированные Microsoft



Почему следует использовать библиотеки объектных модулей


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

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

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

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

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

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

все исходные модули, то ваша программа становится очень большой и

громоздкой.

Библиотеки объектных модулей разрешают проблему управления

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



Поддержка этапа выполнения


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

классы, обеспечивающие поддержку этапа выполнения.



Поддержка объектно-ориентированного программирования


ООП в корне меняет положение, снабжая программные объекты,

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

Большинство новых возможностей Borland С++ - это поддержка ООП,

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

Компилятор Borland C++ имеют и другие - не объектно-ориентированные расширения, улучшающие программирование по сравнению с последней версией компилятора фирмы Borland языка Си - Турбо Си версии 2.0.

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

Для информации ниже приводятся последние возможности, введенные

в четвертой версии компилятора.