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

         

Шаблон TMIDequeAsDoubleListIterator (deques.h)


Для управляемой косвенно двунаправленной очереди на основе

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

TMDoubleListIteratorImp.



Шаблон TMIDequeAsVector (deques.h)


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



Шаблон TMIDequeAsVectorIterator (deques.h)


Для управляемой косвенной двунаправленной очереди на основе

вектора реализует итератор объектов. Элементы см. в TMDequeAsVectorIterator.



Шаблон TMIDictionaryAsHashTable (dict.h)


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

Подразумевается, что T - это один из четырех ассоциативных типов.



Шаблон TMIDictionaryAsHashTableIterator (dict.h)


Реализует итератор, который выполняет перебор по объектам



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



Шаблон TMIDoubleListImp (dlistimp.h)


Реализует управляемый двусвязанный список указателей на объекты типа T. Предполагается, что T имеет операцию копирования и заданный по умолчанию конструктор. Обрабатывает любые типы объектов.



Шаблон TMIDoubleListIteratorImp (dlistimp.h)


Реализует итератор двусвязанного списка. Этот итератор работает с любыми непосредственными двунаправленными списками. Функции-элементы см. в TMDoubleListIteratorImp.



Шаблон TMIHashTableImp (hashimp.h)


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



Шаблон TMIHashTableIteratorImp (hashimp.h)


Реализует итератор для перебора контейнеров TMIHashTableImp.



Шаблон TMIIAssociation (assoc.h)


Реализует управляемую ассоциацию, связывая косвенный ключ K

с косвенным значением L. Предполагается, что K имеет функцию-элемент HashValue, или что существует глобальная функция со следующим прототипом:

unsigned HashValue( K & );

K должно также иметь допустимую операцию ==. Класс A представляет администратор хранения, заданный пользователем.



Шаблон TMIListImp (listimp.h)


Реализует управляемый список указателей на объекты типа T.

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

может обрабатывать любой тип объектов.



Шаблон TMiListIteratorImp (listimp.h)


Реализует итератор списка, работающий с любым косвенным управляемым списком. Функции-элементы см. в TMListIteratorImp.



Шаблон TMIQueueAsDoubleList (queues.h)


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



Шаблон TMIQueueAsDoubleListIterator (queues.h)


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

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



Шаблон TMIQueueAsVector (queues.h)


Реализует управляемую очередь из указателей на объекты типа

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



Шаблон TMIQueueAsVectorIterator (queues.h)


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



Шаблон TMISArrayAsVector (arrays.h)


Реализует управляемый косвенный отсортированный массив объектов типа T, используя в качестве основы реализации вектор.

Функции-элементы см. в TMIArrayAsVector.



Шаблон TMISDoubleListImp (dlistimp.h)


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

указателей на объекты типа T. Обрабатывает любые типы объектов.

Наследует функции-элементы TMIDoubleListImp.



Шаблон TMISDoubleListIteratorImp (dlistimp.h)


Реализует итератор двусвязанного списка. Этот итератор работает с любыми косвенными отсортированными двунаправленными списками. Функции-элементы см. в TMIDoubleListIteratorImp.



Шаблон TMISetAsVector (sets.h)


Реализует управляемую очередь указателей на объекты типа T,

используя в качестве основы реализации вектор. Для управления памятью используется TStandsardAllocator. См. также функции-элементы в TMIBagAsVector.



Шаблон TMISetAsVectorIterator (sets.h)


Реализует итератор для перебора объектов TMISetAsVector.

Функции-элементы см. в TMIArrayAsVectorIterator.



Шаблон TMISListImp (listimp.h)


Реализует управляемый отсортированный список указателей на

объекты типа T. Так как указатели всегда имеют операцию копирования, этот класс может обрабатывать любой тип объектов. Функции-элементы см. в TMIListImp.



Шаблон TMISListIteratorImp (listimp.h)


Реализует итератор списка, работающий с любым управляемым

косвенным списком. Функции-элементы см. в TMListIteratorImp.



Шаблон TMISListIteratorImp (listimp.h)


Реализует итератор списка, работающий с любым косвенным

списком. Функции-элементы см. в TMIListIteratorImp.



Шаблон TMIStackAsList (stacks.h)


Реализует управляемый стек указателей на объекты типа T, используя в качестве основы реализации список. Функции-элементы см.

в TMIStackAsVector.



Шаблон TMIStackAsListIterator (stacks.h)


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

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



Шаблон TMIStackAsVector (stacks.h)


Реализует управляемый стек указателей на объекты типа T, используя в качестве основы реализации вектор.



Шаблон TMIStackAsVectorIterator (stacks.h)


Реализует итератор для управляемых косвенных стеков, построенных на основе вектора. Функции-элементы см. в TMVectorIteratorImp.



Шаблон TMISVectorImp (vectimp.h)


Реализует управляемый отсортированный вектор указателей на

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



Шаблон TMISVectorIteratorImp (vectimp.h)


Реализует итератор вектора, работающий с косвенным управляемым и отсортированным вектором объектов типа T. Функции-элементы

см. в TMIVectorIteratorImp.



Шаблон TMIVectorImp (vectimp.h)


Реализует управляемый вектор указателей на объекты типа T.

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

поэтому данный класс может работать с любым типом объектов.



Шаблон TMIVectorIteratorImp (vectimp.h)


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



Шаблон TMListElement (listimp.h)


Определяет узлы TMListImp, TMIListImp и родственных классов.



Шаблон TMListImp (listimp.h)


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



Шаблон TMListImp (listimp.h)


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



Шаблон TMListIteratorImp (listimp.h)


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

управляемым списком.



Шаблон TMQueueAsDoubleList (queues.h)


Реализует управляемую очередь объектов типа T, используя в

качестве основы реализации двусвязанный список. Функции-элементы

см. в TMDequeueAsDoubleList.



Шаблон TMQueueAsDoubleListIterator (queues.h)


Реализует итератор для очередей, построенных на основе списка. Функции-элементы см. в TMDequeueAsVectorIterator.



Шаблон TMQueueAsVector (queues.h)


Реализует управляемую очередь объектов типа T, используя в

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

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



Шаблон TMQueueAsVectorIterator (queues.h)


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

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



Шаблон TMSArrayAsVector (arrays.h)


Реализует отсортированный массив объектов типа T, используя

в качестве основы реализации вектор. За исключением AddAt все

функции-элементы наследуются из TMArrayAsVector.



Шаблон TMSArrayAsVectorItetator (arrays.h)


Реализует объект итератора для перебора объектов TMSArrayAsVector. Элементы и операции см. в TMArrayAsVectorIterator.



Шаблон TMSDoubleListImp (dlistimp.h)


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

Предполагается, что T имеет операцию ==, операцию < и заданный по

умолчанию конструктор. Функции-элементы см. в TMDoubleListIteratorImp.



Шаблон TMSDoubleListIteratorImp (dlistimp.h)

Реализует итератор двусвязанного списка. Этот итератор работает с непосредственными двунаправленными списками. Функции-элементы см. в TMDoubleListIteratorImp.



Шаблон TMSetAsVector (sets.h)


Реализует управляемую очередь объектов типа T, используя в

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

множество не может содержать дублируемых элементов. Кроме перечисленных ниже функций-элементов, TMSetAsVector наследует функции-элементы из TMBagAsVector. См. также функции-элементы в TMBagAsVector.



Шаблон TMSetAsVectorIterator (sets.h)


Реализует итератор для перебора объектов TMSetAsVector.

Функции-элементы см. в TMArrayAsVectorIterator.



Шаблон TMSListImp (listimp.h)


Реализует управляемый отсортированный список объектов типа

T. Предполагается, что T имеет операцию копирования, операцию < и

заданный по умолчанию конструктор.



Шаблон TMSListIteratorImp (listimp.h)


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

управляемым отсортированным списком. Функции-элементы см. в

TMListIteratorImp.



Шаблон TMStackAsList (stacks.h)


Реализует управляемый стек объектов типа T, используя в качестве основы реализации список. Функции-элементы см. в TMStackAsVector.



Шаблон TMStackAsListIterator (stacks.h)


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

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



Шаблон TMStackAsVectorIterator (stacks.h)


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

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



Шаблон TMSVectorImp (vectimp.h)


Реализует управляемый отсортированный вектор объектов типа

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



Шаблон TMSVectorIteratorImp (vectimp.h)


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

отсортированным и управляемым вектором объектов типа T. Функции-элементы см. в TMVectorIteratorImp.



Шаблон TMVectorImp (vectimp.h)


Реализует обслуживаемый вектор объектов типа T. TMVectorImp

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

умолчанию конструктор.



Шаблон TMVectorIteratorImp (vectimp.h)


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

управляемым вектором объектов типа T.



Шаблон TQueueAsDoubleList (queues.h)


Реализует очередь объектов типа T, используя в качестве основы реализации двусвязанный список. Функции-элементы см. в TMQueueAsDoubleList.



Шаблон TQueueAsDoubleListIterator (queues.h)


Реализует итератор для очередей, построенных на основе списка. Функции-элементы см. в TMDequeueAsDoubleListIterator.



Шаблон TQueueAsVectorIterator (queues.h)


Реализует итератор для очередей, построенных на основе списка. Функции-элементы см. в TMDequeueAsVectorIterator.



Шаблон TSArrayAsVector (arrays.h)


Реализует отсортированный массив объектов типа T, используя

в качестве основы реализации вектор. За исключением AddAt все

функции-элементы наследуются из TMArrayAsVector.



Шаблон TSArrayAsVectorItetator (arrays.h)


Реализует объект итератора для перебора объектов TSArrayAsVector. Элементы и операции см. в TMArrayAsVectorIterator.



Шаблон TSDoubleListImp (dlistimp.h)


Реализует отсортированный двусвязанный список объектов типа

T. Предполагается, что T имеет операцию ==, операцию < и заданный

по умолчанию конструктор. Функции-элементы см. в TMSDoubleListIteratorImp.



Шаблон TSDoubleListIteratorImp (dlistimp.h)


Реализует итератор двусвязанного списка. Этот итератор работает с любыми непосредственными двунаправленными списками. Функции-элементы см. в TMDoubleListIteratorImp.



Шаблон TSetAsVector (sets.h)


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

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

TStandsardAllocator. См. также функции-элементы в TMBagAsVector.



Шаблон TSetAsVectorIterator (sets.h)


Реализует итератор для перебора объектов TSetAsVector. Функции-элементы см. в TMArrayAsVectorIterator.



Шаблон TSListImp (listimp.h)


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

что T имеет операцию копирования, операцию < и заданный по умолчанию конструктор. Функции-элементы см. в TMListImp.



Шаблон TSListIteratorImp (listimp.h)


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

сортированным списком. Функции-элементы см. в TMListIteratorImp.



Шаблон TStackAsList (stacks.h)


Реализует управляемый стек объектов типа T, используя в качестве основы реализации список. Функции-элементы см. в TMStackAsVector.



Шаблон TStackAsListIterator (stacks.h)


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

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



Шаблон TStackAsVector (stacks.h)


Реализует управляемый стек объектов типа T, используя в качестве основы реализации вектор.



Шаблон TStackAsVector (stacks.h)


Реализует стек объектов типа T, используя в качестве основы

реализации вектор, а для управления памятью - TStandardAllocator.



Шаблон TStackAsVectorIterator (stacks.h)


Реализует итератор для стеков, построенных на основе вектора. Функции-элементы см. в TMVectorIteratorImp.



Шаблон TSVectorImp (vectimp.h)


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



Шаблон TSVectorIteratorImp (vectimp.h)


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

отсортированным вектором объектов типа T. Функции-элементы см. в

TMVectorIteratorImp.



Шаблон TVectorImp (vectimp.h)


Реализует управляемый вектор объектов типа T. TVectorImp

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

умолчанию конструктор. Функции-элементы см. в TMVectorImp.



Шаблон TVectorIteratorImp (vectimp.h)


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

управляемым вектором объектов типа T. Функции-элементы см. в

TMVectorIteratorImp.



Шаблоны документов


Шаблоны документа объединяют вместе классы документа и классы отображаемого элемента, создавая новый класс. Администратор

документа поддерживает список шаблонов документа, который используется при создании нового экземпляра Doc/View. Ниже поясняется,

как создавать и использовать шаблоны документов.



Си с классами


C++ - это Си с классами. Borland C++ - это версия фирмы Borland

языка С++, разработанного Брайоном Страуструпом из фирмы AT&T, как

расширение языка Си.

В целом язык С++ является надмножеством языка Си. Это означает,

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

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

вызовет ошибку повторения имен. Однако, в С++ допустимо это или нет,

зависит от других обстоятельств.

Главная возможность C++ - это классы, которые позволяют "упрятывать" функции и данные в отдельные конструкции. Отдельные конструкции называются объектами, а программирование с использованием объектов называют объектно-ориентированным программированием (ООП).

Почему бы не рассмотреть каков Турбо и Borland С++ немедленно?


Вот наша первая программа:

#include <stdio.h>

main()

{

int i, j;

i = 25; j = 17;

printf("Итого: %d\n", i+j);

return 0;

}

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

написанные на языке Си, можно компилировать в Турбо и Borland C++.

Зато Borland C++ имеет многочисленные расширения.

Указание комментариев

v

#include <iostream.h> // Новая библиотека потоков

// ввода-вывода

class sber_bank { // Новый способ создавать структуры

int memory_bank; // с данными и функциями.

public:

void add(int a, int b) { // Встроенная функция

memory_bank = a + b; // Сохранение данных в объекте

cout << "Итог: "; // Новый способ ввода-вывода

cout << memory_bank;

}; ^

}; Операция вывода потока

main()

{

sber_bank deep_thought; // Создание объекта и

deep_thought.add(25, 17); // обращение к нему

}

В общем случае семантика С++ намного более сложная по сравнению

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



Символические цели


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

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

указывать не нужно.

Например, в следующем формирующем файле символические цели

Files строятся из FILE1.EXE и FILE2.EXE.

Files: file1.exe file2.exe #Эта цель не имеет команд

file1.exe: file1.obj

bcc file1.obj

file2.exe: file2.obj

bcc file2.obj

Для символических целей действуют следующие правила:

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

Символической цели нужно давать уникальное имя (оно не может быть именем файла в текущем каталоге).

Именует символические цели согласно с правилами операционной системы.



Синтаксис явных правил


Явное правило - это правило, которое явным образом задает

полные имена файлов. Явные правила имеют следующий вид:

целевой_файл[целевой_файл]...:[{маршрут}][исходный_файл...]

[команда]

.

.

.

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

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

любую команду, допустимую в DOS (включая вызовы .BAT файлов и выполнение .EXE и .COM файлов).

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

допустимые в DOS, а также содержать трафаретные символы.

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

"Целевой_файл" должен начинаться с самого начала строки (в

столбце 1);

Исходному файлу (файлам) "исходный_файл" должны предшествовать по меньшей мере один символ пробела или табуляции,

расположенные после двоеточия;

Каждая "команда" должна начинаться со структурного отступа

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

исходных файлов или заданная команда не могут уместиться

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

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

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

только из строки целевой_файл[целевой_файл...], за которой следует символ двоеточия.

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

исходного файла "исходный_файл". Когда утилита MAKE обнаруживает




явное правило, она сначала проверяет, не являются ли сами исходные файлы "исходный_файл" результирующим файлом "целевой_файл" в
каком-либо другом правиле формирующего файла. Если это так, то
сначала утилита MAKE анализирует это второе правило.
После того, как на основе других правил были созданы или обновлены все исходные файлы "исходный_файл", утилита MAKE проверяет наличие результирующего файла "целевой_файл". Если "целевой_файл" не существует, то все команды выполняются в том порядке, в котором они заданы. Если "целевой_файл" существует, то дата
и время его последней модификации сравниваются с датой и временем
каждого исходного файла "исходный_файл". Если какой-либо исходный
файл был модифицирован после того, как был модифицирован файл
"целевой_файл", то выполняется заданный перечень команд.
Имя файла может указываться в левой части явного правила
файла описания утилиты MAKE лишь один раз.
Каждая командная строка в явном правиле начинается с символа
пробела. Утилита MAKE рассматривает все строки, которые следуют
за явным правилом и продолжаются до очередной строки, начинающейся со столбца 1 (которой не предшествуют символы пробела) или до
конца файла, как часть списка команд для этого правила. Пустые
строки игнорируются.
Явное правило, за которым не следуют командные строки, интерпретируется несколько иначе, чем явное правило с командными
строками.
Если в состав явного правила входят команды, то результирующий файл зависит только от тех файлов, которые перечислены в явном правиле.
Если в явном правиле не заданы никакие команды, результирующий файл зависит от двух наборов файлов: тех файлов,
которые заданы в явном правиле, и от всех файлов, которые
подходят под определение неявного правила для результирующего файла (файлов). Это позволяет задавать зависимости,
которые будут обрабатываться неявным правилом. Например:
.c.obj
BCC -c $<
рrog.obj:
Файл рrog.obj зависит от файла рrog.c; если не совпадают даты этих файлов, то будет выполняться командная строка:
BCC -c рrog.c

Синтаксис команд


Как явные, так и неявные правила (описываемые ниже) могут

содержать списки команд. Команды в списке команд подчиняются следующим синтаксическим правилам:

[префикс...]тело_команды

Каждая команда в списке команд состоит из (необязательного)

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



Синтаксис неявных правил


Утилита MAKE позволяет на ряду с явными правилами задавать

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

Ниже приводится пример, который иллюстрирует отношение между

двумя правилами. Рассмотрим явное правило из предыдущего примера.

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

принципу: объектный файл(с расширением имени .OBJ) зависит от

файла с тем же основным именем и расширением .C и создается путем

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

файл для утилиты MAKE, который будет содержать несколько(или

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

же формату.

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

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

.c.obj:

BCC -c $<

Это правило означает следующее: "Любой файл с расширением .C

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

Создание файла .OBJ происходит с помощью второй строки этого правила, где $< означает имя файла с расширением, присущим исходному

файлу (.C). (Символ $< представляет макрокоманду особого вида.

Объяснение макрокоманд приводится далее. Макрокоманда $< при каждом выполнении команды будет заменена полным именем соответствующего исходного файла .C).

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

исходного файла .С.

Ниже приводится синтаксис неявного правила:

[{исходный_каталог}].исх_расшир.[{целевой_каталог}]цел_расшир:

[команда]

...

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

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

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




"Исх_расшир" ( расширение имени файла, которое должно начинаться точкой в столбце 1) представляет собой расширение имени
исходного файла; то есть, оно относится к любому файлу, который
имеет следующий формат:
имя_файла.исх_расшир
Аналогично, "цел_расшир" относится к файлу, который удовлетворяет спецификации:
имя_файла.цел_расшир
Здесь "имя_файла" является одинаковым для обоих файлов. Другими словами, данное неявное правило заменяет все явные правила,
которые соответствуют следующему формату:
имя_файла.исх_расшир:имя_файла.цел_расшир
[команда]
...
для любого имени файла.
Если утилита MAKE не может обнаружить явное правило для заданного результирующего файла, или если имя результирующего файла
появляется в явном правиле, у которого отсутствуют команды, то
она использует неявные правила.
Расширение имени интересующего утилиту MAKE файла используется для определения того неявного правила, которое должно использоваться. Это неявное правило применяется в том случае, если
обнаружен файл с тем же самым основным именем, что и у результирующего файла, но с заданным расширением исходного файла.
Предположим, например, что у вас имеется формирующий файл
утилиты MAKE (с именем MAKEFILE), который имеет следующее содержимое:
c.obj:
BCC -c $<
Если у вас имеется написанная на Си программа с именем
RATIO.C, которую вы хотите скомпилировать в файл RATIO.OBJ, то вы
можете воспользоваться командой:
make ratio.obj
Утилита MAKE будет рассматривать файл RATIO.OBJ в качестве
результирующего файла. Поскольку явное правило для создания файла
RATIO.OBJ не существует, утилита MAKE применяет неявное правило и
генерирует следующую команду:
BCC -c ratio.c
которая, естественно, выполняет компиляцию для создания файла
RATIO.OBJ.
Утилита MAKE использует неявные правила и в том случае, когда ей задаются явные правила, не сопровождающиеся никакими командами. Предположим, что в начале файла описания вы задали следующее неявное правило:
.c.obj:


BCC -c $<
Если это правило задано, вы можете удалить команду из приведенного ниже явного правила:
myрrog.obj: myрrog.c include\stdio.h
BCC -c myрrog.c
Процесс обработки будет прежним.
Если вы используете систему Borland C++ и разрешаете утилите
MAKE выполнять автоматическую проверку зависимостей, вы можете
удалить все явно заданные зависимости, в которых объектные файлы
указываются в качестве результирующих. Если задана автоматическая
проверка зависимостей, и используются неявные правила, то представленный в начале раздела по явным правилам пример с тремя правилами превращается в следующий:
c.obj:
BCC -c $<
рrog.exe: myрrog.obj рrog2.obj
tlink lib\c0s myрrog рrog2, рrog, ,lib\cs
Вы можете создать несколько неявных правил с одним и тем же
расширением имени результирующего файла. Если для заданного расширения имени результирующего файла имеется более одного неявного
правила, то правила проверяются в том порядке, в котором они появляются в файле описания, до тех пор, пока не найдется правило,
подходящее для расширения имени исходного файла, или до тех пор,
пока утилита MAKE не осуществит проверку всех применимых правил.
Утилита MAKE использует первое неявное правило, в котором
указан файл с расширением имени исходного файла. Даже если выполнение команды, заданной в этом правиле, заканчивается безуспешно,
никакие неявные правила больше не проверяются.
Все строки, следующие за неявным правилом вплоть до очередной строки, которая не начинается с символа пробела, или до конца
файла, считаются частью списка команд для этого правила.
Цель в явном правиле получает свою командную строку из явного правила. Следующий пример показывает неявное правили и явное
правило без командной строки:
.c.obj
bcc -c $< #использует макрокоманду $<
myprog.obj: #явное правило, использующее команду
# bcc -c myprog.c

Синтаксис встроенного ассемблера и его использование


Чтобы включить в код Си/С++ инструкции ассемблера, используйте ключевое слово asm и следующий формат:

asm код_операции операнды;

где "код_операции" - допустимая инструкция процессора 80х86,

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

операции (константы, переменные и метки). Концом оператора asm

является символ ; или новая строка. После точки с запятой на той

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

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

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

asm {

pop ax; pop ds

iret

}

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

TASM). При комментировании таких операторов применяйте стандартные комментарии Си. Ассемблерная часть оператора копируется непосредственно в вывод и включаются в операторы языка ассемблера,

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

Оператор asm может использоваться в функции или как внешнее

описание вне функции. Оператор asm, размещенные внутри функции,

помещаются в сегмент кода, а операторы asm вне функции - в сегмент данных.



Системные сообщения


WM_COMPACTING WM_QUEUESYNC
WM_DEVMODECHANGE WM_SPOOLERSTATUS
WM_ENTERIDLE WM_SYSCOLORCHANGE
WM_FONTCHANGE WM_SYSCOMMAND
WM_NULL WM_TIMECHANGE
WM_PALETTECHANGED WM_WININICHANGE
WM_PALETTEISCHANGING WM_POWER



Скрытие данных в потомках


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

же ключевого слова public, при порождении потомка класса, делает все

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

Замечание. Если вы хотите использовать в потомке класса элементы базового класса, то они должны быть объявлены как защищенные

или общие. Доступ к приватным элементам базового класса

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

как friend.

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

доступа в базовом классе и потомке):

Тип доступа в Тип доступа Доступность элеме-

базовом классе в потомке нта базового класса

приватный приватный недоступен

защищенный приватный приватный

общий приватный приватный

приватный общий недоступен

защищенный общий защищенный

общий общий общий

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

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



Содержимое окон печати


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

(оконные объекты состоят из одной страницы и знают, как отображаться в контексте устройства). Чтобы создать объект распечатки

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

на нужное окно.

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

команду меню. Пример вы найдете в программе PRINTING.CPP.



Соглашения принятые в справочнике по функциям Borland С++


В справочнике по функциям Borland С++ приняты следующие соглашения:

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

правой - ее назначение;

следующая строка содержит синтаксис функции, из которого

также видно в каком заголовочном файле (.h) содержится

прототип данной функции.

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

Имя_функции Назначение. Краткое изложение действий, выпол-

няемых функцией.

DOS UNIX Win16

OS/2 Win32

ANSI C++ ANSI C Синтаксис #include <имя_заголовка.h>

В этой части перечисляются файлы заголовков,

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

использует данная функция).

имя_функции(параметр[,...]);

Подобная запись описывает синтаксис функции.

Расшифровка значков-пpедупpеждений под

именем функции:

DOS Функция позволяет pаботать в DOS
Win16 Функция позволяет pаботать в 16-pазpядном Windous
Win32 Функция позволяет pаботать в 32-pазpядном Windous
OS/2 Функция позволяет pаботать в OS/2
ANSI C Функция позволяет pаботать в aNsI C
ANSI C++ Функция позволяет pаботать в aNsI C++
UNIX Функция позволяет pаботать в UNIX



Сообщения буфера вырезанного изображения


WM_ASKCBFORMATNAME WM_PASTE
WM_CHANGECBCHAIN WM_PAINTCLIPBOARD
WM_CLEAR WM_RENDERALLFORMATS
WM_CUT WM_RENDERFORMAT
WM_COPY WM_SIZECLIPBOARD
WM_DESTROYCLIPBOARD WM_UNDO
WM_DRAWCLIPBOARD WM_VSCROLLCLIPBOARD
WM_HSCROLLCLIPBOARD



Сообщения DDE


WM_DDE_ACK WM_DDE_POKE
WM_DDE_ADVICE WM_DDE_REQUEST
WM_DDE_DATA WM_DDE_TERMINATE
WM_DDE_EXECUTE WM_DDE_UNADVISE
WM_DDE_INITIATE



No such file or directory


Сообщение Сообщение













Error 0
Ошибка 0
Invalid data

Неверные данные
Invalid function number
Неверный номер функции
No such device

Такого устройства нет
No such file or directory
Такого файла или каталоге нет
Attempt to remove current

directory

Попытка удалить текущий каталог
Path not found
Путь не найден
Not same device

Другое устройство
Too many open files
Слишком много открытых файлов
No more files

Файлов больше нет
Permission denied
Разрешение не дано
Invalid argument

Неверный аргумент
Bad file number
Неверный номер файла
Arg list too big

Список аргументов слишком велик
Memory arena trashed
Испорчена память
Exec format error

Ошибка формата запуска
Not enough memory
Недостаточно памяти
Cross-device link

Кросс-компоновка устройств
Invalid memory block address
Неверный адрес блока памяти
Math argument

Математический аргумент
Invalid environment
Неверная операционная среда
Result too large

Результат слишком велик
Invalid format
Неверный формат
File already exists

Файл уже существует
Invalid access code

Неверный код доступа


No space left in device


Сообщение Смысл






















Bad address Неверный адрес
Block device required Требуется блочное устройство
Broken pipe Нарушение конвейера
Executable file in use Выполняемый файл используется
File too large Файл слишком велик
Illegal seek Недопустимая установка
Inapropriate I/O control operation Неподходящая операция управле

ния вводом-выводом
Input/output error Ошибка ввода-вывода
Interrupted function call Прерванный вызов функции
Is a directory Является каталогом
Name too long Слишком длинное имя
No child processes Нет дочерних процессов
No space left in device На устройстве не осталось места
No such device or address Нет такого адреса или устройства
No such process Нет такого процесса
Not a directory Не является каталогом
Operation not permitted Операция не разрешена
Possible deadlock Возможен клинч
Read-only file system Файловая система доступна только по чтению
Resource busy Ресурс занят
Resource temporary Ресурс временно недоступен

unavailable
Too manu links Слишком много связей
См. описание perror в "Справочнике по библиотеке".

Поведение calloc, malloc или realloc, если запрошен

нулевой размер



calloc и malloc проигнорируют такой запрос и возвратят 0.

realloc освободит блок.

Поведение функции abort в отношении открытых и временных

файлов



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

Статус, возвращаемый функцией exit при ненулевом

значении аргумента, EXIT_SUCCESS или EXIT_FAILURE



Особые действия не предусмотрены. Статус возвращается в том

виде, в котором он передан. Статус представлен как signed char.

Набор имен операционной среды и способ изменения значений переменных операционной среды при помощи getenv



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

программы служит putenv, но для постоянного изменения их нужно

использовать команду SET.

Содержимое и режим обработки строки функцией system



Строка интерпретируется как команда операционной системы.

Используется COMSPEC или запускается COMMAND.COM (для 16-разрядных программ) или CMD.EXE (для 32-разрядных программ), и аргумент

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

.EXE.

Содержимое строк сообщений об ошибке, возвращаемых

функцией strerror



См. выше.

Использование локального таймера и хранение времени в

форме "AM/PM"



Определяются локальные время и данные PC.

Отсчет времени системными часами



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

Форматы даты и времени



Borland C++ реализует форматы ANSI.

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


Сообщения инициализации


WM_INITDIALOG WM_INITMENUPOPUP
WM_INITMENU



Сообщения компилятора Help об ошибках


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

Error P1025: line...7 of filename.HPJ : Section heading sectionname unrecognized.

Warning P1039: line...38 of filename.HPJ : [BUILDTAGS] section missed.

Ошибки, обнаруживаемые при обработке информационных файлов (.RTF), имеют коды, начинающиеся с префикса R, а соответствующие сообщения выглядят следующим образом:

Error R2025 : File environment error. Warning R2501 : Using old-key phrase table.

Если это возможно, компилятор сообщает номер статьи и/или имя информационного файла, где обнаружена ошибка. Номер статьи, сообщаемый компилятором, представляет собой ее порядковый номер в файле .RTF (первая, вторая и т.д.). Эти номера могут совпадать с номером страницы, показываемым текстовым процессором, в зависимости от того, какую длину гипотетической страницы (в строках) вы установили. Напомним, что статьи в информационных файлах отделяются знаком "конец страницы", хотя в справочной системе понятие "страница" не используется.

Сообщения, начинающиеся со слова Error (Ошибка) соответствуют серьезным (фатальным) ошибкам. Сообщения о таких ошибках выводятся на экран всегда и при их возникновении построение справочного файла не производится. Сообщения, начинающиеся с Warning (Предупреждение), связаны с менее серьезными ошибками. При наличии ошибок только второго типа, процесс компиляции проходит до конца и создается соответствующий справочный файл, который может быть использован в рамках системы интерактивной документации Windows. Однако при этом справочник Help может функционировать не совсем так, как задумывалось разработчиком. Количество предупредительных сообщений, выводимых компилятором на экран, может регулироваться пользователем.

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

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



Сообщения мультимедиа


MM_ADLIB MM_MOM_CLOSE
MM_JOY1BUTTONDOWN MM_MOM_DONE
MM_JOY1BUTTONUP MM_MOM_OPEN
MM_JOY1MOVE MM_MPU401_MIDIN
MM_JOY1ZMOVE MM_MPU401_MIDIOUT
MM_JOY2BUTTONDOWN MM_PC_JOYSTICK
MM_JOY2BUTTONUP MM_SNDBLST_MIDIN
MM_JOY2MOVE MM_SNDBLST_MIDIOUT
MM_JOY2ZMOVE MM_SNDBLST_SYNTH
MM_MCINOTIFY MM_SNDBLST_WAVEN
MM_MICROSOFT MM_SNDBLST_WAVEOUT
MM_MIDI_MAPPER MM_WAVE_MAPPER
MM_MIM_CLOSE MM_WIM_CLOSE
MM_MIM_DATA MM_WIM_DATE
MM_MIM_ERROR MM_WIM_OPEN
MM_MIM_LONGDATA MM_WOM_CLOSE
MM_MIM_LONGERROR MM_WOM_DONE
MM_MIM_OPEN MM_WOM_OPEN



Сообщения, не документированные Microsoft


WM_ALTTABACTIVE WM_ISACTIVEICON
WM_BEGINDRAG WM_LBTRACKPOINT
WM_CONVERTREQUEST WM_NEXTMENU
WM_CONVERTRESULT WM_QUERYDROPOBJECT
WM_DRAGLOOP WM_QUERYPARKICON
WM_DRAGMOVE WM_SETHOTKEY
WM_DRAGSELECT WM_SETVISIBLE
WM_DROPOBJECT WM_SIZEWAIT
WM_ENTERMENULOOP WM_SYNCPAINT
WM_ENTERSIZEMOVE WM_SYNCSTACK
WM_EXITMENULOOP WM_SYSTIMER
WM_EXITSIZEMOVE WM_TESTING
WM_FILESYSCHANGE WM_YOMICHAR
WM_GETHOTKEY

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



Сообщения об ошибках


Ниже приводятся сообщения об ошибках, генерируемые Borland С++. В Borland C++ имеются следующие категории ошибок: ошибки этапа выполнения, ошибки этапа компиляции, ошибки компилятора справочников Help, ошибки TLIB и ошибки TLINK. Эти ошибки поясняются в данном приложении. Сообщения об ошибках, выводимые системой интерфейса с пользователем, поясняются в файлах документации на дистрибутивных дисках.

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

Сообщения об ошибках перечислены в алфавитном порядке, по старшинству символов ASCII; обычно первыми идут сообщения, начинающиеся символами (равенство, запятая, фигурная скобка и т.д.).

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

Например, если у вас имеется функция С++ goforit, то фактически вы можете получить сообщение об ошибке:

goforit must be declared with no arguments

Для того, чтобы найти описание данного сообщения в этой главе, искать следует сообщение:

функция must be declared with no arguments

в начале списка сообщений об ошибках. Сообщение упорядочивается по алфавиту по слову "must".

Если же некоторая переменная включается в текст сообщения позже (например, "Address of overloaded function функция doesn't match типу"), то такое сообщение можно найти по алфавиту, в данном случае на букву A.



Сообщения об ошибках


Сообщения об ошибках могут генерироваться компилятором, ком- поновщиком, утилитой MAKE или библиотекарем. Кроме того, такие ошибки может генерировать программа на этапе выполнения.

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

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

Утилита MAKE генерирует ошибки при неверном синтаксисе или семантических ошибках формирующего файла. Чтобы исправить их, нужно отредактировать формирующий файл.

Сообщения об ошибках на этапе выполнения обычно вызываются логическими ошибками в программе. Нужно исправить причину и перекомпилировать программу.



Сообщения от "мыши"


WM_HSCROLL WM_MOUSEACTIVATE
WM_LBUTTONDCLICK WM_MOUSEMOVE
WM_LBUTTONDOWN WM_RBUTTONDBLCLK
WM_LBUTTONUP WM_RBUTTONDOWN
WM_MBUTTONDCLICK WM_RBUTTONUP
WM_MBUTTONDOWN WM_SETCURSOR
WM_MBUTTONUP WM_VSCROLL
WM_BUTTONUP WM_MOUSEFIRST
WM_MOUSELAST



Сообщения печати


DM_COLOR DM_PAPERLENGTH
DM_COPIES DM_PAPERSIZE
DM_COPY DM_PAPERWIDTH
DM_DEFAULTSOURCE DM_PRINTQUALITY
DM_DUPLEX DM_PROMPT
DM_IN_BUFFER DM_SCALE
DM_INPROMPT DM_SPECVERSION
DM_MODIFY DM_TTOPION
DM_ORIENTATION DM_UPDATE
DM_OUT_BUFFER DM_YRESOLUTION
DM_OUTDEFAULT



Сообщения пера


WIN_USER WM_RCRESULT
WM_GLOBALRCCHANGE WM_SKB
WM_HEDITCTL WM_PENWINFIRST
WM_HOOKRCRESULT