Цветовое выделение синтаксиса позволяет вам определить цвета
и атрибуты шрифта. По умолчанию цветовое выделение синтаксиса
разрешено. Чтобы отключить его, выберите Options Enviroment Syntax Highlighting и отмените Use Syntax Highlighting. Выделение
синтаксиса действует для файлов .CPP, .C, .H и .HPP. Эти расширения перечислены в Syntax Extension. Вы можете расширить или сократить этот список.
Чтобы использовать предопределенную схему цветов, выберите
Options Enviroment Syntax Highlighting и одну из четырех цветовых
схем. Можно также задать выделение синтаксиса вручную:
Выберите Options Enviroment Syntax Highlighting Customize.
Справа в диалоговом окне Options Enviroment выводится пример исходного кода.
Выберите из списка элементов элемент, который вы хотите
модифицировать, или щелкните "мышью" на элементе (при этом
будет выбрано имя в списке элементов).
Выберите цвет для элемента. Цвет элемента в примере будет
отражать изменения. Для выбора фонового цвета элемента используйте правую кнопку "мыши", а основного - левую.
Если требуется, выберите атрибут.
Debug into switch ignored for .COM files
Предупреждение утилиты TLINK
(параметр отладочной информации для файлов .COM игнорируется)
Borland C++ не включает отладочную информацию в файлы .COM.
См. описание параметра /v.
Debug information in module модуль will be ignored
Предупреждение утилиты TLINK
(информация для отладки в модуле модуль будет игнорироваться)
Объектные файлы, скомпилированные с включением отладочной
информации, теперь содержат запись о версии. Основная версия в
данной записи выше той, которую в настоящее время поддерживает
компоновщик TLINK, поэтому компоновщик не может сгенерировать
отладочную информацию для данного модуля.
Debug information overflow; try fewer modules withDebug info
Сообщение об ошибке утилиты TLINK
(переполнение отладочной информации; попробуйте включать отладочную информацию в меньшее число модулей)
Слишком много участвующих в компоновке модулей содержат отладочную информацию. Перекомпилируйте программу с меньшим объемом
отладочной информации.
DeclarationDoes not specify a tag or an identifier
Сообщение об ошибке этапа компиляции
(описание не определяет идентификатор или признак)
Это описание ничего не описывает. Это может быть структура
или объединение без признака, либо переменная в описании. С++
требует, чтобы что-то описывалось.
Declaration is not allowed here
Сообщение об ошибке этапа компиляции
(объявление здесь недопустимо)
Объявления не могут использоваться в управляющих операторах
для операторов while, for,Do. if или switch.
Declaration missing ;
Сообщение об ошибке этапа компиляции
(в объявлении отсутствует ;)
В исходном файле содержится объявление поля структуры или
объединения, в котором отсутствует точка с запятой (;).
Declaration syntax error
Сообщение об ошибке этапа компиляции
(синтаксическая ошибка в объявлении)
Исходный файл содержит объявление, в котором отсутствует некоторый символ имя или наоборот имеются лишние.
Declaration terminated incorrectiy
Сообщение об ошибке этапа компиляции
В 32-битовом коде Windows вам требуется изменить способ распаковки данных сообщения из lParam и wParam. В Win32 wParam вырастает в размере с 16 до 32 бит, в то время как lParam сохраняет
размер 32 бита. Так как lParam в 16-разрядной Windows часто содержит описатель и другое значение, а в Win32 описатель увеличивается до 32 бит, необходима новая схема упаковки wParam и lParam.
В качестве примера сообщения, на которое влияют изменения в
размере параметра, можно привести WM_COMMAND. В Windows 3.x
wParam содержит 16-битовый идентификатор, а lParam - 16-битовый
описатель окна и 16-битовую команду.
В Win32 lParam содержит только 32-битовый описатель окна.
16-битовая команда перемещается из lParam в младшие 16 бит
wParam, а старшие 16 бит wParam содержат идентификатор. Эта новая
схема означает, что вам нужно изменить способ извлечения информации из этих параметров, для чего используются обработчики сообщений.
Обработчик сообщений предоставляет переносимый способ извлечения сообщений из wParam и lParam. В зависимости от вашей среды
(16-битовой Windows или Win32) обработчики сообщений используют
разные методы выделения из сообщений данных. Использование макрокоманд обработки сообщений обеспечит функционирования кода выделения данных из сообщения на любой из двух платформ.
Кнопка с зависимой фиксацией Action в диалоговом окне Conditions and Actions позволяет задать действия, выполняемые по точке
останова.
| Break | Break приводит к тому, что при срабатывании точки останова
программа останавливается. Экран отладчика будет выведен заново, и вы можете вводить команды для просмотра структур данных программы. |
| Execute | Execute приводит к выполнению выражения (выражение запрашивается в поле ввода Action Expression). Выражение должно иметь
некоторые побочные эффекты, например, присваивание значения переменной. Эта возможность позволяет вам включить выражение, которое будет выполняться перед кодом вашей программы в строке с текущим номером ("вставка кода"). Такое средство полезно использовать, когда вы хотите изменить поведение подпрограммы, чтобы проверить "диагноз" или скорректировать ошибку. Это позволяет при проверке минимальных изменений в программе не выполнять цикл компиляции и компоновки. |
| Log | Log приводит к тому, что значение выражения будет записано в
окне Log. Вам выводится подсказка. В ответ на нее вы должны ввести выражение, значение которого требуется зарегистрировать. Будьте внимательны, чтобы выражение не имело никаких неожиданных побочных эффектов. |
| Enable group | Enable group позволяет вновь активизировать запрещенную ранее группу точек останова. Укажите в поле ввода Action Expression
номер группы. |
| Disable group | Disable group позволяет запретить группу точек останова. При
запрещении группы точек останова они не стираются, а просто маскируются на время сеанса отладки. Укажите в поле ввода Action Expression номер группы. |
Декорированные окна-рамки инкапсулируются в TDecoratedFrame
(класс, производный от TFrameWindow и TLayoutWindow). Декорированные окна-рамки обеспечивают все функциональные возможности
окон-рамок и окон разметки, но кроме них поддерживают дополнительные управляющие элементы (декорирующие элементы) и автоматически настраивают дочерние окна соответственно размещению дополнительных элементов.
Ниже показана полная структуру спускающихся меню отладчика
TD.
= File Edit View Run Breakpoints Data Options Window Help
Run
Run F9
Go to cursor F4
Trace Into F7
Step Over F8
= (System) Execute to... Alt+F9
Until Return Alt+F8
Repaint Desktop Animate...
Restore Standard Back Trace Alt+F4
Instruction Trace Alt+F7
About...
Arguments...
Program reset Ctrl+F2
Next pending status
Wait for child Yes
File
Open...
Attach
Change Dir...
Get Info... Breakpoints
OS Shell
Toggle F2
At... Alt+F2
Changed memory global...
Expression true global...
Quit Alt-X Handware Breakpoint...
Delete all
View
Data
Breakpoints
Stack Inspect...
Log Evaluate/modify... Ctrl+F4
Watches Add watch... Ctrl+F7
Variables Function return
Module... F3
File...
CPU
Dump
Registers Module...
Numeric Processor Dump
Execution History File...
Hierarchy
Threads
Windows messages
Clipboard
Another >
Options
Window
Language... Source
Macros > Zoom F5
Display options... Next F6
Path for source... Next pane Tab
Set Restart Options... Size/move Ctrl+F5
Save options... Iconsize/restore
Restore options... Close Alt+F3
Undo close Alt+F6
User screen Atl+F5
1 First open window
Create... Alt = (2-9 open windows)
Stop recording Alt - Window pick...
Remove
Delete all
Help
Edit Index Shift+F1
Previous topic Alt+F1
Copy Shift+F3 Help on help
Paste Shift+F4
Copy to Log
Dump pane to log
Назад | Содержание | Вперед
Деструкторы, как следует из их названия, уничтожают объекты
класса, созданные перед этим конструктором, очищая значения и освобождая память. Деструкторы наследуют имена своих классов, с добавлением лидирующего знака тильда '~':
class sber_bank {
private:
double big_bucks;
public:
sber_bank(double bucks); < Конструктор
~sber_bank(void); < Деструктор
void deposit(double bucks);
double withdraw(double bucks);
};
В объявленном выше классе деструктор определяется так:
Селектор
Используемый класс Имя деструктора
v v v
sber_bank :: ~sber_bank(void)
{
printf("Машина останавливается \n");
}
Деструктор также можно объявлять встроенным:
class sber_bank {
private:
double big_bucks;
public:
// Встроенный конструктор
sber_bank(double bucks) { big_bucks = bucks; }
// Встроенный деструктор
~sber_bank(void) {printf("Машина останавливается ...\n");}
void deposit(double bucks);
double withdraw(double bucks);
};
Для отладки программного кода С++ предусмотрен ряд макрокоманд, которые находятся в check.h. Их можно использовать в Windows и DOS. Существует два типа макрокоманд - заданные по умолчанию (CHECK, PRECONDITION, TRACE и WARN) и расширенные (CHECKX, PRECONDITIONX, TRACEX и WARNX).
Заданные по умолчанию макрокоманды предусматривают простую
проверку значений и вывод сообщений. Расширенные макрокоманды
позволяют создавать макрогруппы и избирательно разрешать или запрещать их. Расширенные макрокоманды позволяют вам избирательно разрешать или запрещать макрокоманды на основе порогового значения.
Управлять расширением диагностических макрокоманд можно с
помощью трех предопределенных идентификаторов препроцессора:
__DEBUG__, __TRACE и __WARN. Если при компиляции определяется
один из этих идентификаторов (с помощью параметра -D), то расширяются соответствующие макрокоманды, и генерируется диагностический код.
Диагностические макрокоманды разрешаются согласно следующему правилу:
__DEBUG=1 __DEBUG=2 __TRACE _WARN
PRECONDITION Ч Ч
PRECONDITIONX Ч Ч
CHECK Ч
CHECKX Ч
TRACE Ч
TRACEX Ч
WARN Ч
WARNXЧ
Чтобы создать диагностическую версию выполняемой программы,
разместите в ее важнейших точках диагностические макрокоманды и
скомпилируйте а разрешением соответствующего идентификатора. Диагностическая версия библиотек классов строится аналогично.
Эти общие диалоговые блоки используются в различных типах
приложений для открытия файлов. TOpenSaveDialog::TData имеет несколько элементов которые перед построением объекта диалогового
блока нужно инициализировать. Это можно сделать присваиванием
значений или с помощью конструктора TOpenSaveDialog::TData.
| FileName | Имя выбранного файла. На входе задает исполь-
зуемое по умолчанию имя файла, на выходе - имя выбранного файла. |
| Filter | Фильтры имени файла и фильтр-шаблоны имеет
форму: фильтр фильтр шаблон ... где "фильтр" - это текстовая строка, описывающая фильтр, а шаблон фильтра - трафарет имени файла DOS. |
| CustomFile | Позволяет задать специальные фильтры. |
| FilterIndex | Определяет, какой из фильтров (Filter) следует
выводить по умолчанию. |
| InitialDir | Каталог, который должен выводиться при открытии файлового диалогового окна. |
| DelExt | Заданное по умолчанию расширение, добавляемое
к имени файла, если пользователь его не указывает. |
Существует два диалоговых блока печати. Диалоговое окно печати задания позволяет вам выбрать информацию для печати, качество печати, число копий и т.д. Диалоговое окно установки параметров печати позволяет выбрать инсталлированные в системе принтеры,
ориентацию страницы, размер бумаги и т.д.
Элементы данных TPrintDialog::TData позволяет вам управлять
внешним видом и поведением общих диалоговых окон печати.
| FromPage | Первая страница вывода, если задан флаг
PG_PAGENUMS. На входе определяет заданную по умолчанию первую страницу. На выходе задает первую страницу, выбранную пользователю. |
| ToPage | Последняя страница вывода, если установлен
флаг PG_PAGENUMS. На входе определяет заданную по умолчанию последнюю страницу. На выходе задает выбранный пользователем номер последней страницы. |
| MinPage | Наименьшее число страниц, которые может выбрать пользователь. |
| MaxPage | Наибольшее число страниц, которые может выбрать пользователь. |
| Copies | Число печатаемых копий. На входе задает
число копий по умолчанию, на выходе - число копий, заданное пользователем. |
Назад | Содержание | Вперед
Общие диалоговые окна поиска и замены позволяет вам искать и
возможно заменять текст в данных приложения. Эти диалоговые окна
обладают достаточной гибкостью и могут использоваться для документов и баз данных. Проще всего использовать эти диалоговые блоки с помощью классов редактируемых управляющих элементов TEditSearch и TEditFile. Они реализуют редактируемые управляющие элементы поиска и замены.
Так как диалоговые блоки поиска и замены являются безрежимными, указатель на них обычно сохраняется в элементах данных объекта родительского окна. Это облегчает связь с ними. Строит и
создавать блоки поиск и замены следует в ответ на команду (например, команду меню Search Finf и Search Replace). При этом выводится диалоговый блок, где пользователь может вводить информацию
поиска.
TFindReplaceDialog::TData имеет стандартные элементы данных
Flags, плюс элементы данных, содержащие строки поиска и замены.
Так как блоки поиска и замены являются безрежимными, они взаимодействуют с объектом родительского окна, используя зарегистрированное сообщение FINDMSGSTRING. Вы должны написать функцию реакции на это сообщение. Эта функция воспринимает два параметра WPARAM и LPARAM и возвращает LRESULT. Параметр LPARAM содержит указатель, который вы должны передавать функции-элементу UpdateData.
После вызова UpdateData нужно проверить FR_DIALOGTERM. Этот
флаг устанавливается, когда пользователь закрывает безрежимный
диалоговый блок. При этом ваша функция реакции на событие должна
обнулять указатель на объект диалогового блока, после чего вы можете строить и создавать этот объект снова.
Пока вы можете обновлять флаг FR_DIALOGTERM, вы может обрабатывать сообщение FINDMSGSTRING, выполняя фактический поиск. Это
может быть простой поиск в редактирующем управляющем элементе или
сложный поиск в таблице Paradox или dBASE.
Общие диалоговые блоки имеют командную кнопку Find Next
(найти следующий), которую пользователи могут активизировать при
выводе диалогового блока. Большинство приложений также имеют команду Find Next в меню Search, так что пользователь может найти
следующее вхождение за один шаг, не открывая диалогового блока.
Те же функциональные возможности предлагают TFindDialog и TReplaceDialog.
Эти общие диалоговые блоки используются в различных типах
приложений для сохранения файлов, используемых в этих приложениях. TOpenSaveDialog::TData используется диалоговыми окнами открытия и сохранения файлов.
Диалоговые блоки ввода - это простые диалоговые блоки, выводящие пользователю подсказку для ввода одной строки текста. Вы
можете выполнять диалоговые блоки как режимные или безрежимным,
но обычно они являются режимными. С объектами диалоговых блоков
связан ресурс диалогового блока, который находится в файле сценария ресурса inputdia.rc. Файл ресурса вашего приложения должен
включать в себя этот файл.
При построении объекта диалогового блока задается указатель
на объект родительского окна, заголовок, подсказку, текстовый буфер и его размер. В этом буфере содержится заданный по умолчанию
текст ввода. Когда пользователь выбирает OK или нажимает Enter,
строка введенного текста автоматически передается в массив символов.
Общие диалоговые блоки выбора цвета позволяют вам выбирать и
создавать используемые в приложениях цвета. TChooseColorDialog::TData имеет несколько элементов типа TColor и TColor*, которые перед построением объекта диалогового блока нужно инициализировать. Color задает выбранный цвет. При выполнении диалогового
блока это будет цвет, используемый по умолчанию, а при закрытии
диалогового окна - выбранный пользователем цвет. CustColors - это
указатель на 16 специальных цветов. На входе он задает используемые по умолчанию цвета, а на выходе - выбранные пользователем
цвета.
Общие диалоговые блоки выбора шрифтов позволяют вам выбрать
используемый в приложении шрифт, включая гарнитуру, стиль, размер
и т.д. TChooseFontsDialog::TData имеет несколько элементов которые перед построением объекта диалогового блока нужно инициализировать.
| DC | Описатель контекста устройства принтера, шрифты которого вы хотите выбрать при задании флага CF_PRINTERFONTS в Flags. |
| LogFont | Описатель LOGFONT, который задает внешний вид
шрифта. При выполнении диалогового блока и задании флага CF_INITTOLOGFONTSTRUCT диалоговое окно выводится с заданным шрифтом. |
| PointSize | Размер выбранного шрифта (в 1/10 пункта). На
входе задает размер выбранного по умолчанию шрифта, а на выходе возвращает выбранный пользователем размер. |
| Color | Цвет выбранного шрифта, если установлен флаг
CF_EFFECT. На входе устанавливает цвет выбранного шрифта, а на выходе - цвет, выбранный пользователем. |
| Style | Позволяет задать стиль диалога. |
| FontType | Набор флагов, описывающих стили выбранного
шрифта. Устанавливается только на выходе. |
| SizeMin SizeMax | Задает минимум и максимум размера (в пунктах), который может выбирать пользователь при установке флага CF_LIMITSIZE. |
Когда приложение использует функцию из статически компонуемой библиотеки (например, библиотеки исполняющей системы Си), копия этой функции связывается с вашим приложением на этапе компоновки (компоновщиком TLINK). Два одновременно работающих приложения, использующих одну и ту же функцию, будут иметь собственную
копию данной функции. Эффективней было бы совместно использовать
единственную ее копию. Такую возможность дают динамически компонуемые библиотеки. При динамической компоновке внешние ссылки
разрешаются на этапе выполнения.
Когда программа использует функцию из DLL, эта функция не
компонуется с файлом .EXE. При динамической компоновке используется другой метод. Во-первых, на этапе компоновке TLINK связывает
с вашим файлом .EXE записи импорта (содержащие информацию о DLL и
адресе процедуры). Это временно разрешает в вашей программе внешние ссылки на функции DLL. Данные записи импорта обеспечиваются
файлами определения модуля или библиотеками импорта. На этапе выполнения информация записи импорта используется для поиска и привязки к вашей программе функции DLL.
Благодаря динамической компоновке ваши приложения имеют
меньший размер, так как с ними не компонуется код функций. А поскольку код DLL и ресурсы совместно используются несколькими приложениями, это экономит системную память.
В данном разделе мы рассмотрим объекты, создаваемые на этапе вы-
полнения. Память для них выделяется из области свободной памяти. Метод создания динамических объектов очень важен для многих прикладных
задач, где объем хранимых в памяти данных неизвестен заранее перед
запуском программы. Примером может служить программа произвольной базы данных, которая для быстрого доступа хранит в памяти записи различного размера.
Хотя в С++ можно использовать функции динамического распределения памяти языка Си, такие, как malloc, однако, С++ содержит некоторые мощные расширения, которые облегчают и делают более надежным динамическое распределение и освобождение объектов.
Речь идет о функциях, которые можно использовать для распределения динамической памяти, - new и delete. Работа с этими функциями
строится в стиле операций:
операция new
v
double *d = new double;
delete d;
^
операция delete
Важность операции new заключается в возможности следить за размерами выделяемой памяти, в соответствии с используемыми типами. Без
вспомогательной информации, из вышеприведенного примера ясно, что выделено восемь байт для указателя типа double.
Сравните функции new и delete с функциями Си malloc() и free():
В Си указывается
размер C++ (размер не указывается)
v
double *d = malloc(8); double *d = new double;
free(d); delete d;
char *q = malloc(sizeof(int)*10); char *q = new int[10];
free(q); delete[10] q;
Если память выделяется для массива, а не для типа данных со
стандартной длиной, то используется следующий синтаксис:
new объект[размер]
Например, чтобы динамически выделить память для массива из 100
целых чисел с именем counts, используйте вызов:
counts = new int [100];
Использование new и delete не только надежней, но и удобней. Они
автоматически могут вызываться конструкторами и деструкторами.
Однако, если динамический объект создан с помощью оператора new,
то программист несет ответственность за его освобождение, так как С++
"не знает", нужен ли еще этот объект. Для освобождения памяти можно
использовать оператор delete. При выполнении оператора delete вызывается любой определенный вами деструктор.
Еще раз уточним, что delete имеет следующий синтаксис:
delete указатель;
где "указатель" - это указатель, который использовался в операторе
new для выделения памяти.
Директива выдачи сообщения об ошибке (!error) указывает утилите MAKE, что нужно прервать выполнение и отобразить диагностическое сообщение о неисправимой ошибке, содержащее текст после
директивы !error. Данная директива имеет формат:
!error произвольный_текст
Данная директива предназначена для включения в директивы условного выполнения, чтобы заданное пользователем условие определения ошибки могло бы прервать выполнение утилиты MAKE. Например,
вы можете вставить перед первым явным правилом следующий код:
!if !$d(MODEL)
# если MODEL не определена
!error MODEL не определена
!endif
Если при подходе к данной точке директива MODEL еще не была определена, то утилита MAKE прекращает выполнение с выдачей следующего сообщения об ошибке:
Fatal makefile 4: Error directive: MODEL не определена
Директива отмены макроопределения (!undef) указывает на необходимость отмены любого определения для заданного макрокоманда.
Если в настоящий момент данная макрокоманда не определен, то данная директива действовать не будет. Директива имеет следующий
синтаксис:
!undef имя_макрокоманды
Назад | Содержание | Вперед
Данная директива, помещенная в формирующий файл, указывает
утилите MAKE, где нужно искать файл с заданным расширением имени
файла. Например, если в формирующем файле имеются следующие строки:
.PATH.c = C:\CSOURCE
.c.obj:
BCC -c $*
tmр.exe: tmр.obj
BCC tmр.obj
то утилита MAKE будет искать файл TMP.C, который является неявно
заданным исходным файлом для создания файла TMP.OBJ, в каталоге
C:\CSOURCE, а не в текущем каталоге.
Директива .PATH также является макрокомандой, которая содержит значение имени маршрута. Ниже приводится пример использования
этой директивы. Исходные файлы содержатся в одном каталоге, объектные файлы - в другом, а все выполняемые файлы - в текущем каталоге.
.PATH.c = C:\CSOURCE
.PATH.obj = C:\OBJS
.c.obj:
BCC -c -o$(.PATH.obj)\$& $<
obj.exe: tmр.obj
BCC -e$&.exe $<
tmр.exe: tmр.obj
.precious:целевой_файл[...]
где "целевой_файл" - это один или более целевых файлов. Директива
.precious указывает утилите MAKE, что целевой файл удалять не
нужно, даже при неудачном выполнении команд построения целевого
файла. В некоторых случаях целевой файл будет допустимым. Например, если к библиотеке нельзя присоединить объектный модуль, то
библиотеку удалять не следует. Или если при построении прикладной
программы Winsdows выполнение администратора ресурсов завершается
неудачно, то выполняемый файл .EXE удалять не следует.
В следующем примере MYPROG.OBJ можно создать из файлов
MYPROG.ASM, MYPROG.CPP и MYPROG.C:
myprog.exe: myprog.obj:
tlink mprog.obj
.asm.obj:
tasm /mx $<
.cpp.obj:
bcc -p $<
.c.obj:
bcc -p- $<
Если доступно более одного из этих исходных файлов, директива .suffixes определяет, какой из них будет использоваться. Директива .suffixes имеет следующий синтаксис:
.suffixes: .исх_расшир...
где ".исх_расшир" - это список расширений, для которых имеются
неявные правила, в том порядке, в каком должны использоваться неявные правила.
Например, если мы добавим .suffixes: .asm .c .cpp в начало
предыдущего формирующего файла, утилита MAKE сначала будет искать
файл MYPROG.ASM, MYPROG..C и наконец MYPROG.CPP.
Директива включения файлов (!include) задает файл, который
должен быть включен в формирующий файл для интерпретации в том
месте, где располагается эта директива. Данная директива имеет
следующую форму:
!include имя_файла
Возможен любой уровень вложенности этих директив. Если директива включения файла пытается включить какой-либо файл, который уже был включен на некотором внешнем уровне вложения (таким образом, что может начаться бесконечный цикл вложения), то внутренняя директива включения игнорируется как ошибочная.
Как можно использовать эту директиву? Предположим, что вы
создали файл MODEL.MAC, который содержит следующие строки:
!if !$d(MODEL)
MODEL = m
!endif
Вы можете использовать представленное условное (используемое
в зависимости от выполнения условия) макроопределение в любом
формирующем файле, задав следующую директиву:
!include "MODEL.MAC"
Когда утилита MAKE обнаруживает директиву !include, она открывает заданный файл и считывает его содержимое, как если бы
строки файла включения являлись бы строками самого формирующего
файла.
В операторах встроенного ассемблирования Borland C++ допустимы следующие директивы:
db dd dw extrn
Назад | Содержание | Вперед
Утилита MAKE фирмы Borland позволяет выполнять операции, которые не допускаются в других версиях MAKE: задавать директивы,
подобные тем, которые имеются в языках Си, ассемблере и Паскале.
Эти директивы могут использоваться для реализации значительного
числа полезных и мощных операций. Некоторые директивы начинаются
в файле описания с восклицательного знака (!), который должен являться первым символом строки. Другие начинаются с точки. Ниже
приводится полный перечень директив утилиты MAKE:
Каждая из представленных ниже директив имеет соответствующий
ей параметр командной строки, но при этом обладает приоритетом по
сравнению с этим параметром. Например, если утилита MAKE вызывается следующей командной строкой:
make -a
но в формирующем файле содержится директива .noautodeрend, то автоматическая проверка зависимостей будет отменена.
| .autodepend | -a |
| .ignore | -i |
| .noautodepend | -a- |
| .noignore | -i- |
| .nosilent | -s- |
| .noswap | -S- |
| .silent | -s |
| .swap | -S |
Директивы .AUTODEPEND и .NOAUTODEPEND включают (задают) и
выключают (отменяют) автоматическую проверку зависимостей. Они
соответствуют параметру -a командной строки.
Директивы .IGNORE и .NOIGNORE указывают утилите MAKE, что
нужно игнорировать возвращаемое программой значение, примерно так
же, как это делает префикс - перед командой вызова программы (он
описан ранее). Эти директивы соответствуют параметру -l командной
строки.
Директивы .SILENT и .NOSILENT указывают утилите MAKE, следует ли отображать команды перед их выполнением. Они соответствуют
параметру -s командной строки.
Директивы .SWAP и .NOSWAP указывают утилите MAKE, нужно выгружать себя из памяти или нет. Они соответствуют параметру -S командной строки.
Директивы условного выполнения (!if, !elif, !else и !endif)
предоставляют вам определенную степень гибкости при конструировании формирующих файлов. Правила и макрокоманды можно сделать условными, поэтому, используя в командной строке макроопределения (с помощью параметра -D), можно задавать или отменять интерпретацию определенных разделов формирующих файла.
Формат этих директив аналогичен тому, который используется в
Си, ассемблере и Паскале:
!if выражение
[строки]
.
.
.
!endif
!if выражение
[строки]
.
.
.
!else
[строки]
.
.
.
!endif
!if выражение
[строки]
.
.
.
!elif выражение
[строки]
.
.
.
!endif
!ifdef макрокоманда
[строки]
.
.
.
!endif выражение
[строки]
!ifndef макрокоманда
[строки]
.
.
.
!endif выражение
[строки]
где [строки] могут представлять собой один из следующих типов
операторов:
макроопределение;
явное правило;
неявное правило;
директива включения файла include;
группа оператора if;
директива выдачи сообщения об ошибке error;
директива отмены макроопределения undef.
Директивы условного выполнения образуют группу, которая состоит как минимум из открывающей группу директивы !if и завершающей группу директивы !endif.
в группе может присутствовать только одна директива !else.
директивы !elif могут располагаться между директивами !if и else.
правила, макрокоманды и другие директивы могут располагаться между различными директивами условного выполнения; число их не ограничено. Следует отметить, что полные правила с их командами не могут разделяться директивами условного выполнения.
допускается любая степень вложения групп директив условно го выполнения.
Любые правила, команды и директивы должны завершаться внутри
одного исходного файла.
Всем директивам !if внутри одного исходного файла должны соответствовать директивы !endif. Таким образом, следующее включение файла является неверным вне зависимости от того, какое содержание имеет файл, включающий данный, поскольку в нем не
содержится парная директива !endif:
!if $(FILE_COUNT) > 5
какие-либо правила
!else
другие правила
<конец файла>
Еще один способ определения макрокоманды предоставляет директива !ifdef. Директива !ifdef MACRO эквивалентна !if
$d(MACRO). Это верно также для директивы !ifndef: директива
!ifdef MACRO эквивалентна !if $d(MACRO).
| .autodeрend | Включает проверку автоматических зависимостей. |
| !elif | Условное выполнение. |
| !else | Условное выполнение. |
| !endif | Условное выполнение. |
| !error | Указывает, что утилита MAKE должна остановиться и
выдать сообщение об ошибке. |
| !if | Условное выполнение |
| .ignore | Указывает, что утилита MAKE должна игнорировать
возвращаемое командой значение |
| !include | Задает файл, который должен быть включен в формирующий файл. |
| .noautodepend | Выключает автоматическую проверку зависимостей. |
| .noignore | Выключает действие директивы .ignore. |
| .nosilent | Указывает утилите MAKE, что нужно отображать команды перед их выполнением. |
| .noswaр | Указывает утилите MAKE, что не нужно осуществлять
выгрузку самой себя из памяти и подкачку в память. |
| .рath.ext | Задает утилите MAKE маршрут для поиска файлов
с расширением ."EXT". |
| .precious | Указывает утилите MAKE, что целевой файл удалять
не нужно, даже при неудачном выполнении команд построения целевого файла. |
| .silent | Указывает утилите MAKE, что не нужно отображать
команды перед их выполнением. |
| .swaр | Указывает утилите MAKE, что нужно осуществлять
выгрузку самой себя из памяти и подкачку в память. |
| .suffixes | Указывает MAKE, что при неоднозначности целевого
файла нужно использовать неявное правило. |
| !undef | Задает отмену описания заданной макрокоманды. |
Сам TView не предусматривает вывода данных. В нем отсутствует указатель на окно, нет графических функций и функций вывода
текста, а также функций для работы с клавиатурой. Эти функциональные возможности вы должны обеспечить в производных классах,
для чего можно использовать один из следующих методов:
Добавлением в производных классах отображаемых элементов
указателя на интерфейсный объект.
Объединением в производных классах функциональности интерфейсного объекта с задаваемыми вами действиями.
Каждый из этих методов имеет свои преимущества и недостатки,
которые обсуждаются ниже.
Чтобы добавить в производном от TView классе указатель на
интерфейсный объект, добавьте элемент к новому классу и создайте
к конструкторе класса отображаемого элемента экземпляр объекта.
Доступ к данным интерфейсного объекта и его функциям-элементам
можно получить через указатель.
Такой метод позволяет вам легко подключать и отключать различные интерфейсные объекты и использовать различные их типы.
Например, создав указатель TWindow*, можно использовать большинство видов интерфейсных объектов.
Недостатком является то, что обрабатываемое событие проходит
сначала через интерфейсный объект или приложение. Это вынуждает
вас либо использовать для добавления функций обработки событий
производный интерфейсный объект, либо обрабатывать событие через
объект приложения. В любом случае это уменьшает гибкость при обработке событий.
Смешивание TView или производного от TView объекта с производным объектом дает вам возможность вывести данные из документа
с обработкой потока передаваемых в документ и из документа данных. Это несложная, но требующая аккуратности задача.
Чтобы создать новый производный класс, определите этот класс
на основе базового класса отображаемого документа (TView или производного от TView класса) и выбранного интерфейсного объекта.
Новый конструктор должен вызывать конструкторы обоих базовых
классов. Как минимум, этот новый класс должен определять все виртуальные функции базовых классов. Там следует также определить
специализированные функции для работы с экраном и функции обработки событий, взаимодействующие с интерфейсным элементом и объектом документа.
Этот подход имеет то преимущество, что полученный в результате отображаемый элемент будет в высокой степени интегрированным. Обработка ошибок выполняется централизованно, что уменьшает
необходимость делать это на уровне приложения. Управление интерфейсными элементами осуществляется не через указатель, а также
интегрирована в новый класс отображаемого элемента. Однако данный
метод не дает такой гибкости, как использование указателя. Вы не
можете также обмениваться различными типами объектов с помощью
базового указателя на различные классы интерфейсных объектов.
Для модификации атрибутов декорированных окон-рамок можно
использовать те же базовые методы, что и для модификации окон.
Функция-элемент Insert в TDecaratedFrame дает здесь дополнительную гибкость и позволяет добавлять декорирующие элементы: строки
состояния (TControlBar), строки состояния (TStatusBar), кнопки
реквизитов (TButtonGadget) и другие управляющие элементы на базе
TWindow.
TView содержит некоторые виртуальные функции, которые должен
в себя включать каждый класс нового отображаемого элемента. Некоторые заменяемые функции не выполняют никаких действий, и в производных классах вы должны их переопределить и при необходимости
задать какое-то полезное поведение. Следует переопределять только
виртуальные функции TView:
| GetViewName | Возвращает статическое имя отображаемого
элемента. В производном классе ее требуется определить. |
| GetWindow | Возвращает TWindow* - ссылку на интерфейс-
ный объект отображаемого элемента или 0. |
| SetDocTitle | Задает заголовок окна отображаемого элемента. Его следует задать для вызова функции SetDocTitle отображаемого элемента. |
TView содержит элемент данных ViewMenu TMenuDescr*. Вы можете присвоить ему любой существующий объект TMenuDescr (описатель
меню). Меню обычно задается в конструкторе отображаемого элемента.
Чтобы добавить к проекту цель, сделайте следующее:
Выберите в основном меню Project New.
Наберите имя новой цели и выберите ее тип:
| Standard | Выполняемый файл, DLL или другой файл. Выбирается по умолчанию. |
| AppExpert | Приложение ObjectWindows. |
| Source Pool | Набор файлов, на которые можно ссылаться в
другой цели. |
Выберите OK. Если типом цели является Standard, выводится
диалоговое окно TargetExpert, в котором можно выполнить
дальнейшее определение цели. В случае типа Source Pool
цель добавляется к проекту и вы можете сразу добавить уз-
лы. Об AddExpert рассказывается в другом разделе.
Чтобы удалить одну или более целей:
Выделите цель и просмотрите SpeedMenu (щелкните на цели
правой кнопкой "мыши" или нажмите Alt+F10).
Выберите режим Delete.
Администратор проекта запрашивает, хотите ли вы удалить
целевой файл. Щелкните "мышью" на OK. Отменить это удаление нельзя.
Экземпляры переменных позволяют легко обрабатывать множество
управляющих элементов. При создании экземпляра переменных ClassExpert добавляет в ваш код буфер передачи. Во время выполнения в
этом буфере собирается информация, и вы можете использовать ее
вместо проверки кода с независимой фиксацией. Чтобы связать экземпляр переменной с управляющим элементом (добавить его), сделайте следующее:
Выберите управляющий элемент в области событий.
Щелкните правой кнопкой "мыши" на управляющем элементе и
выберите Add Instance variable.
В диалоговом окне Add Instance variable наберите имя переменной. Щелкните "мышью" на OK. ClassExpert добавляет в
исходный код приложения файл заголовка (который содержит
описание структуры с записью экземпляра переменной). Переменная выделяется в конструкторе класса в файле .CPP (это
связывает класс ObjectWindows с объектом ресурса).
Метка управляющего элемента в области событий показывает
класс и имя экземпляра созданной переменной.
Чтобы удалить экземпляр переменной:
Выберите управляющий элемент с экземпляром переменной, который вы хотите удалить.
Щелкните на элементе правой кнопкой "мыши" и выберите Delete Instance variable.
ClassExpert удаляет из вашего кода запись в структуре,
указатель переменной в описание класса и распределение переменной класса, связанное с ресурсом управляющего элемента.
Оставшаяся пустая структура и вызов буфера передачи на программный код не влияют, и удалять их не нужно.
Чтобы добавить для события обработчик событий, сделайте следующее:
Выберите класс для обработчика событий. В области событий
выводятся события.
Выберите обрабатываемое событие (вы можете расширить список событий, а затем для просмотра SpeedMenu щелкнуть правой кнопкой "мыши").
Выберите в SpeedMenu Add handler. Если вы выберите добавление обработчика для окна Message, ClassExpert добавляет
запись в таблицу реакции, имя которой определяется по
умолчанию, после чего связанная с обработчиком функция выводится в окне редактирования. Некоторые обработчики запрашивают у вас имя функции перед добавлением в таблицу.
Чтобы показать, что событие обрабатывается, ClassExpert
отмечает его в области событий.
Удаляется обработчик событий следующим образом:
Выберите класс для обработчика событий. События выводятся
в области событий.
Выберите отмеченное событие, связанное с обработчиком, который вы хотите удалить (вам может потребоваться расширить
список событий). Затем для вывода SpeedMenu щелкните на
событии правой кнопкой "мыши".
Выберите Delete handler. ClassExpert удаляет только запись
в таблице реакции, а не программный код в исходном файле.
Код обработчика выводится в области редактирования, так
что вы можете удалить его. Если вы удалите функцию, удалите его определение из файла заголовка.
Чтобы добавить узел к проекту:
Выберите тот узел под которым вы хотите вывести новый
узел.
Нажмите клавишу Ins или щелкните на выделенном узле правой
кнопкой "мыши", затем выберите в SpeedMenu команду Add.
Выберите файл или файлы, которые нужно связать с новым узлом, или наберите имя добавляемого узла (если файл в текущем каталоге отсутствует, IDE создает его).
Выберите OK. Новый узел выводится под выбранным узлом.
Чтобы добавить несколько узлов, запустите администратор файлов Windows и выделите файлы, которые нужно добавить к узлам вашего проекта (убедитесь, что вы можете просматривать в IDE окно
проекта). Затем буксируйте файлы из администратора файлов. Администратор проекта добавляет их под выбранным узлом.
Для удаления узла из проекта выделите его и нажмите Del либо
выберите в SpeedMenu команду Delete node. Можно удалить сразу
несколько узлов.
ClassExpert позволяет вам добавить основанные на ObjectWindows классы и поддерживает один уровень наследования (вручную
можно увеличить число уровней. Чтобы добавить класс, сделайте следующее:
Щелкните в области классов правой кнопкой "мыши". Выводится меню Speedbar.
Выберите Create new class или щелкните "мышью" на соответствующей кнопке оперативного меню SpeedBar. Выведется
диалоговое окно Add New Class.
Выберите базовый класс ObjectWindows, из которого вы хотите создать производный класс. Нажмите Tab.
Наберите имя, которое вы хотите дать новому классу. Нажмите Tab.
Наберите имя исходного файла, исходный код которого вы хотите вывести. Файл будет сохранен под именем, заданным в
Source. Нажмите Tab.
Наберите имя определяющего класс файла заголовка. По умолчанию его имя совпадает с именем исходного файла, а расширение - это .H. Нажмите Tab.
Если базовым классом является TDialog, нужно задать или
выбрать идентификатор шаблона диалога. Блок списка Dialog
ID содержит идентификаторы всех диалоговых ресурсов в вашем приложении AppExpert. Если вы зададите несуществующий
идентификатор, AppExpert создает пустое диалоговое окно с
данными идентификатором, затем загружается Resource Workshop, так что вы можете определить диалоговое окно.
Если базовым классом является TFrameWindow или производный
от него класс, в блоке списка Client class вы можете выбрать существующий класс, представляющий клиентную область
нового окна-рамки.
Если базовым классом является TWindow или производный от
него класс, вы можете щелкнуть "мышью" на командной кнопке
Set Window Properties. Выводится диалоговое окно, в котором вы можете задать характеристики окна.
Чтобы добавить новый класс, щелкните "мышью" на OK.
Концепция традиционного документа и принципы Doc/View во
многом различны. Традиционная концепция документов обычно аналогично файлу системы обработки текстов. Такой файл состоит из
текста и иногда включает в себя графику и встроенные команды, помогающие системе обработки текста форматировать документ. Doc/View имеет свои характерные особенности:
Он отличается типом содержимого документов. Документ
Doc/View может содержать данные практически любого типа,
такие как текст, графику, звуки, файлы мультимедиа и даже
другие документы.
Второе отличие состоит в представлении данных. В то время
как формат традиционного документа обычно проектируется с
учетом его будущего представления, документ Doc/View полностью независим от того, как он выводится.
Последнее отличие в том, что документ из конкретной программы обработки текста в общем случае не зависит от формата, необходимого программе. Обычные документы обычно становятся переносимыми между различными системами обработки
текста после утомительного процесса преобразования. Документы Doc/View позволяют легко переносить данные между различными приложениями, даже если их базовые функции
весьма различны.
Базовые функции объекта документа обеспечивает класс TDocument.
стиле, то мы могли бы иметь более чем один подход к декомпрессии, как
здесь. За счет того, что мы извлекли внутренние переменные и поместили их в структуру, и без остановки из имеющихся более чем одной копии
структуры:
char buff1[]={'a',0xff,3,'b','c'}, buff2[]={'z','y',0xff,4,'x'};
main()
{
int c1, c2;
decompressor dc1, dc2; // У нас есть ДВЕ структуры декомпрессора
decompressor_init(&dc1, buff1, sizeof(buff1));
decompressor_init(&dc2, buff2, sizeof(buff2));
do {
if ((c1 = decompressor_next(&dc1)) != -1) putchar(c1);
if ((c2 = decompressor_next(&dc2)) != -1) putchar(c2);
} while (c1 != -1 || c2 != -1);
}
Хотя Turbo Debugger обеспечивает прозрачное пошаговое выполнение функций DLL, вам может потребоваться доступ к DLL до того,
как программа ее вызовет (например, в ней нужно установить точки
останова или задать отслеживаемые выражения). Для доступа к выполняемому модулю, отличному от текущего загруженного, откройте с
помощью команды View Modules (F3) диалоговое окно Load Module Source or DLL. Это диалоговое окно перечисляет все исходные модули,
содержащиеся в текущем загруженном выполняемом файле. Блок списка
DLL & Programs показывает все файлы .DLL и .EXE, загруженные Windows. (При работе с TDW в нем также выводятся все загруженные
файлы .DRV и .FON.)
Символом точки (.) отмечены DLL, которые могут загружаться в
Turbo Debugger (а также DLL с отладочной информацией и исходным
кодом). Звездочка (*) показывает, что модуль загружен отладчиком.
Так как ваши программы могут загружать DLL с помощью вызова LoadLibrary, в блоке списка могут показываться не все DLL.
Если вам нужен другой модуль исходного кода, подсветите нужный модуль в списке Source Module и используйте кнопку Load (или
дважды щелкните на имени модуля "мышью"). Turbo Debugger открывает окно Module и выводит исходный код данного модуля.
Для доступа к выполняемому файлу, отличному от текущего,
откройте диалоговое окно Load Module Source or DLL Symbols (F3),
подсветите в блоке списка нужный файл и выберите командную кнопку
Symbol Load. Turbo Debugger открывает окно Module с исходным кодом первого модуля выполняемого файла.
Чтобы добавить DLL к списку, откройте указанное диалоговое
окно, активизируйте поле ввода DLL Name и введите имя соответствующей DLL. Чтобы добавить DLL к списку, нажмите кнопку Add DLL.
При выполнении по шагам функции DLL отладчик автоматически
загружает таблицу идентификаторов и исходный код этой DLL. Чтобы
предотвратить это, откройте диалоговое окно Load Module Source or
DLL Symbols (F3), подсветите в списке нужную DLL, выберите кнопку
No и щелкните "мышью" на OK. Turbo Debugger будет выполнять вызовы DLL как одну команду.
TDocument и TView предусматривают ряд функций для доступа к
информации о характеристиках объекта Doc/View. Все эти функции
описаны как виртуальные, поэтому функции в последних производных
классах вызываются первыми и могут переопределять характеристики,
определенные в базовых классах. Каждый класс должен реализовывать
доступ к характеристикам.
Обычно к характеристике обращаются по индексу. Для поиска
соответствующего индекса используется функция FindProperty, которая по имени характеристики возвращает ее индекс. Обратное действие (поиск имени по индексу) выполняет функция PropertyName. Атрибуты характеристики устанавливает функция PropertyFlags, в параметре которой указывает индекс характеристики. Определить значение флага можно с помощью операции &.
Для получения и модификации значений характеристик используются функции GetProperty и SetProperty.
Непосредственный доступ к управляющему элементу VBX вы можете получить двумя способами. Первый способ состоит в получении и
установке имен характеристик управляющего элемента, которые позволяют управлять его внешним видом и поведением. Другой способ
заключается в вызове методов управляющего элемента, которые аналогичны функциям-элементам класса, а обращаться к ним можно через
функции в классе TVbxControl.
Компилятор, работающий в режиме командной строки, использует
DPMI (Dos Protected Mode Interface - интерфейс защищенного режима DOS) для выполнения в защищенном режиме на машинах с процессорами 286^ 386, i486 или Pentium c не менее 640К оперативной памяти и не менее 1 Мб расширенной. Хотя Borland С++ работает в защищенном режиме, он генерирует приложения для работы в реальном
режиме. Преимущество использования этого режима заключается в
том, что компилятор имеет гораздо больше памяти для работы, так
что компиляция выполняется быстрее и без обычных проблем с нехваткой памяти.
EXEMAP, TMAPSYM и BUILDSYM представляют собой три утилиты,
которые улучшают вид информации, которую WinSpector обеспечивает
для исключительной ситуации.
Две других полезных возможности предоставляет диалоговое окно параметров трассировки сообщений Message Trace Options, одна
из которых позволяет задать формат области трассировки сообщений,
а другая - зарегистрировать трассируемые сообщения в файле.
Обычно область Message Trace интерпретирует параметры каждого сообщения и выводит их в удобном для чтения формате
(выбирается Interpret Values). Для просмотра параметров
сообщений в шестнадцатиричном виде выберите Hex Values.
Информация о трассируемых сообщениях выводится обычно в
области трассировки сообщений Message Trace. Однако вы можете передать сообщения в файл, на принтер или дополнительный монитор. Для этого в диалоговом окне Message Trace
Options нужно выбрать Log File и выполнить одно из следующих действий:
Наберите имя файла трассировки. Если файл уже существует, информация будет добавляться к файлу.
Наберите имя устройства для вывода информации о регистрации (например, PRN).
Для вывода на дополнительный монитор наберите AUX (в
CONFIG.SYS нужно задать WINOS.SYS или OX.SYS).
Чтобы остановить регистрацию сообщений, отмените Log File.
Объекты распечатки имеют и несколько других функций-элементов, которые вы можете при необходимости переопределить. BeginPrinting и EndPrinting вызываются перед и после печати каждого документа. Печать страниц выполняется последовательно - для каждой
страницы вызывается функция PrintPage. Однако перед первым вызовом PrintPage объект распечатки вызывает BeginDocument, передавая
номера первой ли последней печатаемой страницы. Если вашему документу требуется подготовка к печати других страниц (кроме первой), переопределите BeginDocument. После печати последней страницы вызывается EndDocument. При печати нескольких копий пара GebinDocument/EndDocument может вызываться между BeginPrinting и
EndPrinting.
| WM_COALESCE_FIRST | WM_MDIGETACTIVE |
| WM_COALESCE_LAST | WM_MDIICONARRRANGE |
| WM_COMMNOTIFY | WM_MDIMAXIMIZE |
| WM_COMPAREITEM | WM_MDINEXT |
| WM_DRAWITEM | WM_MDIRESTORE |
| WM_DROPFILEW | WM_MDISETMENU |
| WM_KEYFIRST | WM_MDITILE |
| WM_MDIACTIVATE | WM_MEASUREITEM |
| WM_MDICASCADE | WM_NEXTDLGCTL |
| WM_MDICREATE | WM_SYSTEMERROR |
| WM_MDIDESTROY |
Обычно доступ к приватным элементам класса ограничивается методами этого класса. Но иногда возникает необходимость предоставить
доступ к приватным данным класса внешним функциям. Определить такие
внешние функции (которые могут даже находиться вне классов), которым
будет предоставлена возможность доступа к приватным элементам класса,
позволяет описание friend (дружественный). Иногда можно видеть, что
переопределенная операция также описывается, как дружественная, но,
обычно, дружественные функции используются редко. Их присутствие в
программе обычно означает то, что иерархия классов нуждается в видоизменении.
Рассмотрим пример. Возьмем наш класс sber_bank, с приватным элементом big_bucks и добавим в него "дружественную" функцию вычисления
налога - irs:
class sber_bank {
private: // Начало раздела private
double big_bucks; // элемент private
public: // Начало раздела public
void deposit(double bucks); // Элемент public
double withdraw(double bucks); // Элемент public
friend void irs(void); // Дружественная функция irs
};
Дружественную функцию irs определим следующим образом:
void irs(void)
{
big_bucks -= big_bucks * 0.10; // Взять 10% от итога
}
Отметим, что хотя мы объявили irs() внутри класса, но она не является функцией элементом! Это достигается благодаря ключевому слову
friend. Но даже хотя этот не функция элемент, irs() может выполнить
указанную операцию с нашими данными, имеющими тип private.
Если бы функция big_bucks была элементом другого класса (например, класса free_shop), то в описании friend нужно использовать операцию разрешения области действия:
friend void free_shop::irs(void);
Дружественным для описанного класса можно также сделать целый
класс, для чего в описании используется ключевое слово class:
friend class check_bucks;
После этого любая функция элемент класса check_bucks может получить доступ к приватным элементам класса sber_bank. Заметим, что в
С++, как и в жизни, дружественность не транзитивна: если А является
другом для Б, а Б является другом для И, то отсюда не следует, что А
является другом для И.
Дружественные описания следует использовать только в том случае,
когда это действительно необходимо, например, когда без этого пришлось бы использовать чересчур сложную иерархию классов. По своей природе дружественные описания уменьшают инкапсуляцию и модульность. В
частности, если нужно определить целый класс, как дружественный для другого класса, то вместо этого лучше рассмотреть возможность построения обоюдно порождаемого класса, который можно использовать для
доступа к нужным элементам.
| real | Используется для конвертирования двоично-десятичного числа обратно в long double. |
| abs | Возвращает абсолютное значение комплексного числа. |
| acos | Вычисляет арккосинус. |
| arg | По числу в комплексной плоскости возвращает
угол в радианах. |
| asin | Вычисляет арксинус. |
| atan | Вычисляет арктангенс. |
| conj | Возвращает для комплексного числа комплексносопряженное. |
| cos | Вычисляет значение косинуса. |
| cosh | Вычисляет значение гиперкосинуса. |
| exp | Вычисляет экспоненциальное значение e в степени y. |
| imag | Возвращает мнимую часть комплексного числа. |
| log | Вычисляет натуральный логарифм аргумента. |
| log10 | Вычисляет десятичный логарифм аргумента. |
| norm | Вычисляет квадрат абсолютного значения аргумента. |
| polar | Возвращает комплексное число с заданной величиной (абсолютным значением) и углом. |
| pow | Возводит аргумент в степень e. |
| real | Используется для преобразования комплексного
числа в long double. |
| sin | Вычисляет синус. |
| sinh | Вычисляет гиперсинус. |
| sqrt | Вычисляет положительный квадратный корень. |
| tan | Вычисляет тригонометрический тангенс. |
| tanh | Вычисляет гиберболический тангенс. |
Empty LEDATA record in module модуль
Предупреждение утилиты TLINK
(пустая запись LEDATA в модуле)
Такое предупреждение возможно, если транслятор генерирует
запись без данных. Сообщите об этом разработчику транслятора. Такая запись может давать отрицательные эффекты.
Enum syntaxError
Сообщение об ошибке этапа компиляции
(синтаксическая ошибка вEnum)
ОбъявлениеEnum не содержит правильно оформленного списка
идентификаторов.
Error changing file buffer size
Сообщение об ошибке утилиты TLIB
(ошибка изменения размера буфера файла)
Утилита TLIB пытается настроить размер буфера файла, используемого при операции чтения или записи в файл, но памяти не хватает. Чтобы исправить ситуацию, может потребоваться освободить
некоторый объем системной памяти.
Error directive: сообщение
Фатальная ошибка этапа компиляции
(директиваError: сообщение)
Данное сообщение появляется при обработке директивы #error
из исходного файла. Текст этой директивы выводится в сообщении.
Error directive: сообщение
Фатальная ошибка утилиты MAKE
(директиваError: сообщение)
Данное сообщение появляется при обработке утилитой MAKE директивы #error из исходного файла. Текст этой директивы выводится
в сообщении.
Error opening имя_файла
Сообщение об ошибке утилиты TLIB
(ошибка открытия указанного файла)
Утилита TLIB по каким-то причинам не может открыть указанный
файл.
Error opening имя_файла for output
Сообщение об ошибке утилиты TLIB
(ошибка открытия файла для вывода)
TLIB по каким-то причинам не может открыть указанный файл
для вывода. Обычно это вызывается недостатком места на диске для
файла библиотеки или листинга. Кроме того эта ошибка может возникать в ситуации, когда целевой файл существует, но помечен как
доступный только по чтению.
Error renaming имя_файла to имя_файла
Сообщение об ошибке утилиты TLIB
(ошибка переименования файла)
TLIB строит библиотеку, используя временный файл, а затем
переименовывает временный файл в целевую библиотеку. Ошибка
обычно вызывается нехваткой места на диске.