Разрядное программирование в Windows
В данном разделе кратко описывается программирование в среде
Windows и Win32, и описывается, как можно перенести в эти среды
программы. Такой перенос позволит компилировать ваши программы в
16- и 32-разрядной версии Windows.
32-разрядные инструментальные средства Borland C++ обеспечивают создание 32-разрядных файлов .OBJ и .EXE в формате переносимых выполняемых файлов PE. Это формат выполняемого файла для
программ Win32 и Windows NT.
- A -
Abnormal program termination
Сообщение об ошибке этапа выполнения
(аварийное завершение программы)
Данное сообщение может выводиться, если для выполнения программы не может быть выделено достаточного количества памяти. Вызов Abort также приводит к появлению данного сообщения.
Access can only be changed to public or protected
Сообщение об ошибке этапа компиляции
(тип доступа может быть изменен только на public или
protected)
Производный класс С++ может модифицировать права доступа
члена базового класса, но только на public или protected. Элемент
базового класса нельзя сделать private.
Added file имя_файла does not begin correctly, ignored
Предупреждение утилиты TLIB
(некорректно начинается добавляемый файл имя_файла, поэтому
он игнорируется)
Библиотекарь определил, что форма добавляемого к объектному
файлу модуля некорректна, поэтому он не пытается добавить его к
библиотеке. Библиотека тем не менее создается.
Address of overloaded function функция doesn't match тип
Сообщение об ошибке этапа компиляции
(адрес переопределяемой функции не соответствует типу)
Переменной или параметру присваивается адрес переопределяемой функции (или выполняется инициализация переменной с использованием данного адреса), а тип переменной или параметра не совпадает с типом переопределяемой функции с заданным именем.
модуль isAlready in LIB, not changed
Предупреждение утилиты TLIB
(модуль уже находится в библиотеке и не изменятся)
Для библиотеки была попытка выполнить действие +. но объект
с таким именем уже есть в библиотеке. Если требуется обновление
модуля, то действием должно быть +-. Библиотека не модифицируется.
Ambiquity between функция_1And функция_2
Сообщение об ошибке этапа компиляции
(неоднозначность между функцией_1 и функцией_2)
С переданными параметрами могут использоваться обе названные
переопределенные функции. Такая неоднозначность недопустима.
Ambiguous member name имя
Сообщение об ошибке этапа компиляции
(неоднозначное имя элемента)
Элемент структуры имя, используемый во встроенном ассемблере, должен быть уникален. Если определяется более одной структуры, то все определения должны соответствовать типу и смещению в
структурах. В данном случае элемент с указанным именем является
неоднозначным. Используйте синтаксис: (struc xxx).yyy.
Ambiguous Override of Virtual Base Member функция1: функция2
Сообщение об ошибке этапа компиляции
(неоднозначное переопределение виртуальной базовой функции)
Виртуальная функция виртуального базового класса переопределяется двумя или более различными функциями в различных ветвях
иерархии наследования.
Ambiguous operators need parentheses
Предупреждение этапа компиляции
(неоднозначные операции требуют круглых скобок)
Данное предупреждение выдается, две операции сдвига, отношения или поразрядные логические операции используются вместе без
круглых скобок. Кроме того это предупреждение появится, если операция вычитания используется без скобок вместе с операцией сдвига. Программисты часто путают приоритеты этих операций, поскольку
присвоенные им приоритеты не очевидны.
Ambiguous override of virtual base member базовая_функция:
производная_функция
Сообщение об ошибке этапа компиляции
(неоднозначное переопределение виртуальной базовой функции-элемента в производной функции)
Виртуальная функция, определенная в виртуальном базовом
классе, переопределяется в двух различных классах с одинаковой
иерархией наследования.
Application load & execute error 0001
Application load & execute error FFE0
Фатальная ошибка командной строки
(ошибка загрузки и выполнения прикладной программы)
Не хватает расширенной памяти для загрузки средств командной
строки защищенного режима.
Application load & execute error FFE0
Фатальная ошибка командной строки
Не хватает расширенной памяти для загрузки средств командной
строки защищенного режима.
ArrayAllocated using new may not haveAn initializer
Сообщение об ошибке этапа компиляции
(в выделении массива с помощью new может отсутствовать инициализатор)
При инициализации вектора (массива) классов вы должны использовать конструктор без аргументов. Это называется конструктором, используемым по умолчанию, что означает, что вы можете при
инициализации такого вектора не указывать аргументы.
Array bounds missing ]
Сообщение об ошибке этапа компиляции
(в задании границ массива отсутствует ])
В исходном файле в объявлении границ массива отсутствует
закрывающая квадратная скобка.
Array must haveAt least one element
Сообщение об ошибке этапа компиляции
(массив должен иметь хотя бы один элемент)
Язык Си стандартаANSI и С++ требуют, чтобы массив определялся хотя бы с одним элементом (объекты нулевого размера недопустимы). Существует старый программистский прием, состоящий в
том, чтобы объявить элемент структуры типа массива нулевого размера, а уже затем при помощи функции malloc распределить фактически требуемую память. Этот прием по-прежнему можно использовать, но теперь вы обязаны объявлять массив, как имеющий (как минимум) один элемент. Разумеется, объявления (в противоположность
определениям) массивов неизвестного размера допустимы.
Например:
char ray[] /* определение массива неизвестного размера
недопустимо */
char ray[0] /* определение массива нулевого размера
недопустимо */
extern char ray(); /* объявление с незаданным размером -
допустимо */
Array of references is notAllowed
Сообщение об ошибке этапа компиляции
(массив ссылок недопустим)
Массив ссылок недопустим, поскольку указатели на ссылки недопустимы, а имена массивов встраиваются в указатели.
Array size for 'delete' ignored
Предупреждение этапа компиляции
(размер массива для 'delete' игнорируется)
В последней спецификации С++ больше нет необходимости при
удалении массива задавать его массив. Чтобы можно было компилировать старый код, компилятор игнорирует такую конструкцию и выводит предупреждение.
Array size too lange
Сообщение об ошибке этапа компиляции
(размер массива слишком велик)
Объявленный массив превышает 64К.
Array variable идентификатор is near
Предупреждение этапа компиляции
(переменная-массив идентификатор является ближней)
При использовании параметров командной строки -Ff или -Fm
или команды интегрированной среды Options CompilerAdvanced Code
Generation... Far Data Treshhold глобальные переменные, превышающие пороговый размер, автоматически делаются компилятором дальними (far). Однако, если переменная является инициализированным
массивом с незаданным размером, то его общий размер в момент принятия решения о том, сделать ли его ближним или дальним, неизвестен, и компилятор делает его ближним. Если число заданных для
массива инициализаторов вызывает превышение общим размером переменной порогового значения размера данных, то компилятор выдает
это предупреждение. Если тот факт, что компилятор сделал переменную ближней, вызывает проблемы (например, компоновщик сообщает о
переполнении группы из-за слишком большого числа глобальных данных), вы должны явно сделать переменную дальней, поместив ключевое слово far непосредственно слева от имени переменной в ее объявлении.
Assembler statement too long
Сообщение об ошибке этапа компиляции
(слишком длинный ассемблерный оператор)
Операторы встроенного ассемблера не могут превышать по длине
480 байт.
Assigning тип to перечислимый_тип
Предупреждение этапа компиляции
(присваивание типа перечислимому типу)
Присваивание целочисленного значения типу enum. Это является
ошибкой в C++, но выдаваемое сообщение имеет уровень предупреждения, и программа может заработать.
Assignment to this is notAllowed, use X::operator new instead
Сообщение об ошибке этапа компиляции
(такое присваивание не допускается, используйте вместо него
X::operator new)
В старых версиях С++ единственный способ управления распределением класса объектов заключался в присваивании параметру this
внутри конструктора. Теперь это отменено, поскольку существует
более эффективный, надежный и более общий способ, состоящий в определении функции-элемента operator new.
Attempt to export non-public symbol идентификатор
Предупреждение утилиты TLINK
( попытка экспорта идентификатора, не являющегося общедоступным)
Имя идентификатора было указано в разделе EXPORTS файла определения модуля, но идентификатор с данным именем не найден в
компонуемых модулях, как общедоступный. Это может быть вызвано
опечаткой в имени или тем, что не определена процедура с таким
именем.
Attempt to grant or reduceAccess to идентификатор
Сообщение об ошибке этапа компиляции
(попытка предоставить или ограничить доступ к идентификатору)
Производный класс С++ может модифицировать полномочия доступа к элементу базового класса, но только восстанавливая их в полномочия базового класса. В нем не могут добавляться или ограничиваться эти полномочия.
Attempting to returnA reference toA local object
Сообщение об ошибке этапа компиляции
(попытка вернуть ссылку на локальный объект)
В функции, возвращающей ссылочный тип, вы попытались вернуть
ссылку на временный объект (возможно, в качестве результата вызова конструктора или функции). Поскольку при возврате из вызова
временный объект исчезнет, то ссылка на него недопустима.
Attempting to returnA reference to local name идентификатор
Сообщение об ошибке этапа компиляции
(попытка вернуть ссылку на локальное имя идентификатор)
Данная функция С++ возвращает значение типа ссылки, и вы пытаетесь вернуть ссылку на локальную (динамическую) переменную.
Это недопустимо, поскольку такая переменная при выходе из функции
уничтожается. Вы можете вернуть ссылку на любую статическую или
глобальную переменную, либо изменить функцию таким образом, чтобы
возвращалась не ссылка, а само значение.
Администратор динамически распределяемой области памяти
Windows поддерживает динамическое распределение памяти с помощью двух различных динамически распределяемых областей - глобальной и локальной.
Глобальная динамически распределяемая область - это пул памяти, доступной для всех приложений. Хотя могут распределяться
глобальные блоки памяти любого размера, глобальная динамически
распределяемая область предназначена только для больших блоков
памяти (256 байт или более). Каждый блок глобальной памяти дополнительно использует не менее 20 байт. В соответствии со стандартом Windows и улучшенными режимами процессора 386 существует системное ограничение в 8192 блока глобальной памяти, только некоторые из которых будут доступны для любого конкретного приложения.
Локальная динамически распределяемая область - это пул памяти, доступной только для вашего приложения. Она существует только
в верхней части сегмента данных приложения. Общий размер блоков
локальной памяти, которые могут распределяться в локальной динамической области - это 64 минус размер стека приложения и его
статических данных. По этой причине локальная динамически распределяемая область лучше подходит для небольших блоков памяти (256
байт и менее). По умолчанию локальная динамически распределяемая
область имеет размер 4К, но в файле .DEF приложения его можно изменить.
Borland C++ включает в себя администратор памяти, реализующий функции new, delete, malloc и free. Этот администратор динамически распределяемой памяти использует для всех приложений глобальную динамически распределяемую область. Поскольку такая область имеет системное ограничение, администратор динамически
распределяемой памяти включает в себя механизм вторичного распределения, улучшающий производительность и позволяющий выделять существенно большее число блоков.
Алгоритм вторичного распределения работает следующим образом: при выделении большого блока администратор динамически распределяемой памяти с помощью подпрограммы Windows GlobalAlloc выделяет блок глобальной памяти. При выделении небольшого блока администратор памяти выделяет более крупный блок глобальной памяти,
а затем при необходимости разбивает этот блок на блоки меньшего
размера. При выделении небольших блоков перед тем, как администратор выделит новый блок глобальной памяти (который также будет
вторично распределяться), повторно используется все доступное
пространство вторичного распределения.
Пороговое значение между большим и малым блоком динамически
распределяемой памяти определяет переменная HeapLimit. Она устанавливается равной 64 байтам. Переменная HeapBlock определяет
размер, используемый администратором динамически распределяемой
памяти при вторичном распределении. Ей присваивается значение
4096 байт.
Назад | Содержание | Вперед
Администратор проектов
Borland С++ 4.0 имеет новый администратор проектов с расширенными функциональными возможностями. Поскольку большинство
программ состоит из нескольких файлов, желательно иметь возможность автоматически определять те файлы, которые необходимо перекомпилировать и скомпоновать. Эти и многие другие обязанности выполняет встроенный администратор проектов системы Borland C++.
Администратор управляет проектами, которые формируются из
нескольких компонентов. Когда вы осуществляете перекомпиляцию
проекта, администратор проектов автоматически обновляет информацию, которая хранится в файле проекта. Администратор проектов организует и обновляет сложные приложения, отслеживая взаимную зависимость компонентов в файле проекта с расширением .IDE.
Такой механизм позволяет повысить эффективность построения
проектов, так как транслируются только те файлы, которые были изменены со времени последнего формирования проекта. Трансляция означает использование одного типа файла для создания другого.
Проект можно рассматривать как список зависящих друг от друга файлов - файлов исходного кода, файлов .OBJ, .EXE или .DLL.
Эти файлы создаются компилятором, компоновщиком или другими инструментальными средствами. В администраторе файлов зависимость
между файлами показывается графически в виде дерева проекта с
тремя типами пиктограмм. Узел проекта представляет весь проект.
Ниже выводятся все составляющие проекта файлы. Целевой узел
представляет создаваемый проектом файл (.EXE или .DLL). Обычный
узел представляет используемый в проекте файл. Узлы этапа выполнения указывают общие файлы, используемые на этапе выполнения.
Администратор режима выполнения и инструментальные средства
Приложения защищенного режима DOS используют администраторы
защищенного режима RTM.EXE и 32RTM.EXE. При загрузке эти инструментальные средства сначала загружают администратор, выполняют
свою задачу, а затем выгружают его. При частом вызове в командной
строке таких инструментальных средств вы можете ускорить процесс,
если загрузите администратор защищенного режима в командной строке командой 32RTM (выгружается он той же командой с параметром
-u).
По умолчанию администратор защищенного режима использует всю
доступную память, а затем распределяет ее своим клиентам. С помощью команды SET RTM=[параметр nnnn] вы можете управлять объемом
этой памяти. Параметр может быть следующим:
EXTLEAVE | Всегда оставляет доступным указанный объем
расширенной памяти (по умолчанию 640К). |
EXTMAX | Не выделяет более nnnn килобайт расширенной
памяти (по умолчанию 4 гигабайта). |
EXTMIN | Если после применения EXTMAX и EXTLEAVE доступно менее nnnn килобайт, завершается с Out
of memory (по умолчанию 0). |
REALLEAVE | Всегда оставляет доступным не менее nnnn параграфов реальной памяти (по умолчанию 4096
параграфов). |
REALMAX | Не выделяет более nnnn параграфов реальной
памяти (по умолчанию 1 мегабайт). |
REALMIN | Если после применения EXTMAX и EXTLEAVE доступно менее nnnn килобайт, завершается с Out of memory (по умолчанию 0). |
Алгоритм декомпрессии для выполнения группового кодирования
Предположим, что у вас есть некоторый текст, закодированный
групповой функцией элементом как будет показано далее. Байт со значением кода 0xff указывает, что следующие за ним два байта содержат
повторяющиеся символы. Любые другие байты передаются так как есть.
Например,
a \xff \03 b c -> Decomp > a b b b c
Ваша задача, заключается в переделке алгоритма декомпрессии с
языка Си в объектно-ориентированную версию. Не беспокойтесь, мы будем
сопровождать вас на каждом шаге пути.
Анализ и модификация данных
Данные вашей программы - это глобальные и локальные переменные, а также определенные константы. Для проверки и модификации
данных в Turbo Debugger имеется ряд окон.
Аппаратные точки останова
Эти точки останова доступны в TDW и TD32 при отладке программ Windows NT. Они используют специальные отладочные регистры
процессоров Intel 80386 и старше. Эти точки останова являются
глобальными. Для работы с этими точками останова вам потребуется
драйвер TDDEBUG.386. Скопируйте его с дистрибутивных диске и
включите в файл CONFIG.SYS. (Инструкции содержатся в файле
TD_HDWBP.TXT.) При правильной установке этого драйвера в поле
Breakpoints диалогового окна File Get Info выводится Hardware (в
противном случае - Software).
Чтобы установить аппаратную точку останова, выберите в меню
Breakpoints команду Hardware Breakpoint. Эта команда автоматически устанавливает кнопку Global окна Breakpoint Options, кнопку
Hardware в окне Conditions and Actions и открывает диалоговое окно Hardware Breakpoint Options. Это окно содержит все параметры
аппаратных точек останова и полностью описано в файле
TD_HDWBP.TXT.
Можно также создать аппаратную точку останова, модифицировав
существующую точку останова:
Установите кнопку с независимой фиксацией Global в диало говом окне Options.
Откройте диалоговое окно Conditions and Actions и выберите
кнопку с зависимой фиксацией Hardware.
Чтобы открыть диалоговое окно Hardware Breakpoint Options,
щелкните "мышью" на кнопке Hardware окна Conditions and
Actions.
Задайте параметры аппаратной точки останова и щелкните
"мышью" на OK.
Если нужно, задайте в окне Conditions and Actions нужные
действия.
Application Admin Options
Version Number | Задает номер версии проекта, который
выводится в диалоговом окне Help About. Эта информация сохраняется в файле .RC проекта. |
Copyright | Определяет информацию об авторских
правах, которая выводится в диалоговом окне About. |
Description | Описывает приложение и выводит текст
в окне Help About приложения. По умолчанию это имя проекта. |
Author | Фамилия программиста, генерирующего
исходный код. Используется в комментариях сгенерированного кода. |
Company | Название фирмы, где работает программист. Используется в комментариях сгенерированного кода. |
Application Advanced Options
Start Up | Задает начальное состояние основного окна приложения:
Normal - задает используемый по умолчанию размер (определяется значением WS_NORMAL). Minimized - запуск в виде пиктограммы в оперативной области Windows. Maximized - заполняет при запуске всю оперативную область Windows. |
Control Style | Определяет, какой тип управляющих
элементов использует приложение: Windows - стандартные управляющие элементы Windows. BWCC - использует специализированные управляющие элементы Borland. 3D - трехмерные управляющие элементы Windows. |
Application Basic Options
Target Name | Определяет имя создаваемого проекта как базовое для используемых по умолчанию имен и других элементов проекта. |
Base Directory | Задает маршрут базового каталога, в котором находятся все подкаталоги проекта. Все маршруты в проекте определяются относительно этого каталога. Имя данного каталога передается администратору проекта в качестве новой цели AppExpert. Заданным по умолчанию значением для базового каталога является каталог родительского узла проекта, определенный в администраторе проекта. |
Help File Support | Генерирует исходные файлы справочника
Help (.RTF) и файл проекта Help (.HPJ). Файл проекта Help добавляется к проекту администратора проекта и автоматически формируется с целевым приложением. Исходный файл Help содержит шаблонный текст для элементов меню приложения. |
Help File Name | Именует связанные с приложением справочные файлы. |
Application Code Gen Control
Target Name | Выводит на экран имя проекта, определенное в Basic Options Target. |
Base Directory | Выводит базовый каталог проекта, определенный в Basic Options Base Directory. |
Source Directory | Задает каталог, в который записываются исходные файлы приложения. Этот маршрут показывается относительно каталога, заданного в Base Directory. При задании абсолютного маршрута он преобразуется в относительный. |
Header Directory | Задает каталог, в котором хранятся
файлы заголовков. Он задается относительно базового каталога (Base Directory). |
Main Source File | Именует основной исходный файл приложения. |
Main Header File | Именует основной файл заголовка приложения. |
Application Class | Именует производный класс, создаваемый AppExpert из TApplication. Заданное по умолчанию имя класса основывается на имя проекта. |
About Dialog Class | Именует производный класс, создаваемый AppExpert из TDialog. Заданное по умолчанию имя класса основывается на
имени проекта. |
Comments | Документирует генерируемый код частично или полностью. |
Application options
Multiple Document | Стиль приложения будет соответствовать
Interface модели MDI. |
Single Document | Стиль приложения будет соответствовать
Interface модели SDI. |
Document/Viev | Определяет поддержку приложением модели
Document/View для управления объектами приложения. Document - это данные, а View - это пользовательский интерфейс к этим данным. |
SpeedBar | Помещает в верхнюю часть окна приложения оперативную полосу. |
Status Line | Помещает в нижнюю часть основного окна
приложения строку состояния и генерирует код для вывода в этой строке справочных сообщений при подсветке пунктов меню. |
Drag/Drop | Поддерживает стандартные действия Windows по буксировке "мышью". |
Printing | Поддерживает операции, связанные с печатью, и создает меню File Print Setup,
Print Preview и Print. |
Аргументы функции элемента, принимаемые "по умолчанию"
При вызове функции элемента в С++, разрешается не указывать ее
последние аргументы в списке и, таким образом, избавить программиста
от необходимости указывать их каждый раз при обращении. Определить
такие аргументы лучше списком в начале программы. Например:
#define RED 0x04
#define BLUE 0x01
Тем не менее не теряется и гибкость, поскольку, при необходимости изменить используемые по умолчанию значения, просто задаются
необходимые. В следующем примере последнему аргументу функции присваивается конкретное значение. Использование знака '=' означает, что
это значение может быть использовано по умолчанию. Достаточно будет
его пропустить, при обращении к функции.
Назначает по умолчанию
красный цвет
v
void set_pixel(int x, int y, int c = RED)
{
...
}
set_pixel(100,100,BLUE); // Переопределяет цвет
// установленный по умолчанию
set_pixel(200,300); // По умолчанию использует цвет RED
// (красный)
Примечание: необходимо помнить, что этот "механизм" может конфликтовать с механизмом переопределения функций (см.
"Связывание функций").
Аргументы типа ссылки
Описатель ссылки может также использоваться для объявления в
функции параметров типа ссылки:
void func1 (int i);
void func2 (int &ir); // ir имеет тип "ссылка на int"
...
int sum=3;
func1(sum); // sum передается по значению
func2(sum); // sum передается по ссылке
Переданный по ссылке аргумент sum может изменяться прямо в
func2. Напротив, func1 получает только копию аргумента sum (переданного по значению), поэтому сама переменная sum функцией func1
изменяться не может.
При передаче фактического аргумента x по значению соответствующий формальный аргумент в функции принимает копию x. Любые
изменения этой копии в теле функции не отражаются на самом значении x. Разумеется, функция может возвратить значение, которое затем может использоваться для изменения x, но самостоятельно изменить напрямую параметр, переданный ей по значению, функция не может.
Традиционный метод Си для изменения x заключается в использовании в качестве фактического аргумента &x, то есть адреса x, а
не самого значения x. Хотя &x передается по значению, функция получает доступ к x благодаря тому, что ей доступна полученная копия &x. Даже если функции не требуется изменять значения x, тем
не менее полезно (хотя это чревато возможностью нежелательных побочных эффектов) передавать &x, особенно если x представляет собой большую по размерам структуру данных. Передача x непосредственно по значению ведет к бесполезным затратам памяти на копирование такой структуры данных.
Сравним три различных реализации функции treble:
Реализация 1:
int treble_1(n)
{
return 3*n;
}
...
int x, i = 4;
x = treble_1(i); // теперь x = 12, i = 4
...
Реализация 2:
void treble_2(int* np)
{
*np = (*np)*3;
}
...
treble_2(int &i); // теперь i = 12
Реализация 3:
void treble_3(int& n) // n имеет тип ссылки
{
n = 3*n;
}
...
treble_3(i); // теперь i = 36
Объявление формального аргумента type& t (или, что эквивалентно, type &t) устанавливает t как имеющую тип "ссылки на тип type". Поэтому при вызове treble_3 с действительным аргументом i, i используется для инициализации формального аргумента ссылки n.
Следовательно, n играет роль псевдонима i, и n = 3*n также присваивает i значение 3*i.
Если инициализатор представляет собой константу или объект
нессылочного типа, то Borland C++ создаст временный объект, для
которого ссылка действует как псевдоним:
int& ir = 16; /* создается временный объект int, с именем
псевдонима ir, который получает значение
16 */
float f;
int& ir2 = f; /* создается временный объект int, с именем
псевдонима ir2, f перед присваиванием
преобразуется */
ir2 = 2.0 /* теперь ir2 = 2, но f остается без измене-
ний */
Если формальные и фактические аргументы имеют различные (но
совместимые по присваиванию) типы, то автоматическое создание
временных объектов позволяет выполнять преобразования ссылочных
типов. При передаче по значению, разумеется, проблем с преобразованием типов меньше, поскольку перед присваиванием формальному
аргументу копия фактического аргумента может быть физически изменена.
Ассоциативность и приоритеты операций Borland C++
() [] -> :: . ! ~ - ++ -- & * (приведение типа) | Слева-направо |
sizeof new delete | Справа-налево |
.* ->* | Слева-направо |
* / % | Слева-направо |
+ - | Слева-направо |
<< >> | Слева-направо |
< <= > >= | Слева-направо |
== != | Слева-направо |
& | Слева-направо |
^ | Слева-направо |
| | Слева-направо |
&& | Слева-направо |
|| | Слева-направо |
?:(условное выражение) | Справа-налево |
= *= /= := += -= &= ^= |= <<= >>= | Справа-налево |
, | Слева-направо |
Автоматическая передача файла
После загрузки программы TDW автоматически определяет, нужно
ли пересылать программу на удаленную систему. В отношении загрузки программы в удаленную систему отладчик отличается гибкостью.
Сначала он проверяет наличие программы на удаленной системе. Если
программы там нет, он передает ее. Если программа на удаленной
системе имеется, он анализирует дату и время копии программы на
локальной системе и удаленной системе. Если копия на локальной
системе более поздняя (новая), чем на удаленной, он предполагает,
что вы перекомпилировали и перекомпоновали программу и передает
ее по линии связи. Учтите однако, что TDW передает только файлы
.EXE.
Назад | Содержание | Вперед
Автоматическая проверка зависимостей
Система Borland C++ ориентирована также на использование
утилиты MAKE в целях автоматической проверки зависимостей для
включаемых файлов. Компиляторы BCC и BCC32 создают объектные файлы, которые содержат используемую утилитой MAKE информацию о всех
файлах включения, необходимых для создания объектного файла. Параметр командной строки -a утилиты MAKE проверяет эту информацию,
чтобы удостовериться в "современности" всех используемых файлов.
Когда утилита MAKE осуществляет автоматическую проверку зависимостей, она считывает имена файлов включения, а также время и
дату создания объектных файлов. Если какой-либо включаемый файл
был модифицирован, утилита MAKE осуществляет перекомпиляцию для
обновления объектного файла.
Автоматическое дополнение имени
Когда в поле ввода выводится подсказка для ввода имени идентификатора, вы можете набрать часть имени, а затем нажать Ctrl+N.
Turbo Debugger заполнит остальную часть имени автоматически. При
этом набранная часть должна уникальным образом идентифицировать
имя. Если с набранных символов не начинается ни одно из имен, то
ничего не происходит. При наличии нескольких идентификаторов, соответствующих набранным вам символам, выводится список имен, из
которого вы можете выбрать нужное.
Автоматическое создание
При разрешении автоматического создания дочерний объект создается одновременно с родительским. Чтобы исключить дочернее окно
из механизма автоматического создания и вывода, вызовите в конструкторе дочернего объекта функцию-элемент DisableAutoCreate.
Обратное действие выполняет EnableAutoCreate. По умолчанию автоматическое создание разрешено для всех классов кроме диалоговых
блоков.
Азы С++
Настоящий "мгновенный" курс C++ в сжатой и всеобъемлющей форме
представляет программирование на С++, прежде всего, для программистов, владеющих основами традиционного Си, и дает возможность совершить быстрый переход к С++.
При отсутствии опыта работы с Cи и С++, возможно, по-началу, могут показаться трудными новые концепции, обсуждаемые здесь, но разбор
(и эксперименты) с примерами помогут прояснить картину. Прежде, чем
начать работу, окружите себя уже имеющимися у Вас учебными пособиями
и руководствами по С++. Возможно одно из них пригодится для более детального изучения С++.
Несмотря на то, что каждая тема с помощью примеров и подробных
разъяснений раскрывает основные идеи языка, для желающих стать настоящими хакерами рекомендуется дополнительно проработать книги Страуструпа.
- B -
Bad call of intristic function
Сообщение об ошибке этапа компиляции
(неверный вызов неявной функции)
Вы использовали данную неявную функцию без определения прототипа, или указали для данной функции не тот прототип, который
ожидается компилятором.
Bad character in parameters -> символ
Сообщение об ошибке утилиты TLINK
(неверный символ в параметрах)
В командной строке или в командном файле обнаружен один из
следующих символов:
" * < = > ? [ ] |
либо любой управляющий символ, отличный от горизонтальной табуляции, перевода строки, возврата каретки или Ctrl-Z.
Bad define directive syntax
Сообщение об ошибке этапа компиляции
(неверный синтаксис директивы определения)
Макроопределения начинается или заканчивается операцией ##,
или содержит операцию #, за которой следует имя макроаргумента.
Bad field list in debug information in module модуль
Сообщение об ошибке утилиты TLINK
(неверный список полей в отладочной информации модуля)
Обычно эта ошибка вызывается неверной отладочной информацией
в файле OBJ. Сообщите о нейBorland.
Bad file name имя_файла
Сообщение об ошибке этапа компиляции
(неверное имя файла)
Компоновщику передано недопустимое имя файла.
Bad file name format in include directive
Сообщение об ошибке этапа компиляции
(неправильный формат имени файла в директиве включения)
Имена включаемых файлов должны заключаться в кавычки
("имя_файла.h") или в угловые скобки (<имя_файла.h>). Перед именем файла отсутствовала открывающая кавычка или угловая скобка.
Если использовалась макрокоманда, то результирующий текст расширения неверен, т.е., он не взят в кавычки.
Bad file name format in include statement
Сообщение об ошибке утилиты MAKE
(в операторе включения задан неправильный формат имени файла)
Имена включаемых файлов должны заключаться в кавычки или угловые скобки. Были пропущена открывающая кавычка или угловая
скобка.
Bad file name format in inline directive
Сообщение об ошибке этапа компиляции
(неправильный формат имени файла в директиве inline)
Имена включаемых файлов должны заключаться в кавычки
("имя_файла.h") или в угловые скобки (<имя_файла.h>). Перед именем файла отсутствовала открывающая кавычка или угловая скобка.
Если использовалась макрокоманда, то результирующий текст расширения неверен, т.е., он не взят в кавычки.
Bad GCD type in GRPDEF, extended dictionary aborted
Bad GRPDEF type encountered, extended dictionary aborted
Предупреждение утилиты TLIB
(неверный тип GCS в DRPDEF, расширенный словарь отброшен)
Библиотекарь при создании расширенного словаря обнаружил недопустимую запись в определении группы (GRPDEF) в объектном модуле. Единственным типом записи GRPDEF, который поддерживает библиотекарь и компоновщик, является индексный тип сегмента. Если
обнаружен другой тип GRPDEF, то библиотекарь не сможет создать
расширенный словарь. Возможно, объектный модуль, создаваемый продуктами, отличными отBorland, содержат записи GRPDEF других типов. К этому предупреждению может также приводить запорченный объектный модуль.
Bad header in input LIB
Cообщение об ошибке утилиты TLIB
(неверный заголовок во входной библиотеке)
При добавлении объектных модулей к существующей библиотеке
библиотекарь определил, что неверен заголовок библиотеки. Перестройте библиотеку.
Bad ifdef directive syntax
Сообщение об ошибке этапа компиляции
(неверный синтаксис директивы ifdef)
Директива #ifdef должна содержать в теле директивы единственный идентификатор (и ничего более).
Bad LF_POINTER in module модуль
Сообщение об ошибке утилиты TLINK
(неверный LF_POINTER в модуле)
Обычно эта ошибка вызывается неверной отладочной информацией
в файле OBJ. Сообщите о нейBorland.
Bad macro output translator
Сообщение об ошибке утилиты MAKE
(неверная трансляция выходной макрокоманды)
Неверен синтаксис подстановки внутри макрокоманд. Например:
$(MODEL:=s) или $(MODEL:) или $(MODEL:s)
Bad object file record
Bad object file файл near offset смещение
Сообщение об ошибке утилиты TLINK
(неверная запись объектного файла в библиотечном файле в модуле с указанным ближним смещением)
Обнаружен неверно сформированный объектный файл. Обычно это
вызывается указанием имени исходного файла или объектного файла,
который сформирован не полностью. Это может произойти, если при
компиляции машина была перезагружена, или при выводе объектного
файла нажаты клавиши Ctrl+Break.
Bad OMF record type тип encountered in module модуль
Сообщение об ошибке утилиты TLIB
(в модуле обнаружен неверный тип записи OMF)
Библиотекарь при чтении объектного файла обнаружил неверную
запись OMF (формат объектного модуля). Библиотекарь уже считал и
проверил записи-заголовки модуля модуль, поэтому обычно это указы-
вает, что объектный модуль запорчен, и его следует восстановить.
Bad syntax for pure function definition
Сообщение об ошибке этапа компиляции
(неверный синтаксис определения "чистой" функции)
"Чистые" (без побочных эффектов) виртуальные функции задаются добавлением в определение символов "=0". Вы написали что-либо
похожее, но не совпадающее с требуемым в точности.
Bad undef directive syntax
Сообщение об ошибке этапа компиляции
(неверный синтаксис директивы undef)
Директива #undef должна содержать в качестве тела директивы
единственный идентификатор (и ничего более).
Bad undef statement syntax
Сообщение об ошибке утилиты MAKE
(ошибка в синтаксисе оператора "разопределения")
Оператор !undef должен содержать один идентификатор и ничего
больше, как тело оператора.
Bad version number in parameterBlock
Сообщение об ошибке утилиты TLINK
(неверный номер версии в блоке параметров)
Эта ошибка указывает не внутреннее несоответствие в интегрированной среде. Если она возникает, выйдите из интегрированной
среды и перезапустите ее. При работе с автономной версией данная
ошибка не возникает.
Base class класс contains dinamically dispatchable functions
Сообщение об ошибке этапа компиляции
( базовый класс содержит динамически диспетчеризируемые функции)
В настоящий момент динамически диспетчеризуемые виртуальные
таблицы не поддерживают множественного наследования. Данная ошибка возникает из-за того, что класс, содержащий динамически диспетчеризуемую виртуальную функцию, пытается наследовать динамически диспетчеризуемые виртуальные функции из нескольких
порождающих классов.
Base class класс is inaccessibleBecause also in класс
Предупреждение этапа компиляции
(базовый класс недоступен в указанном классе)
Недопустимо использовать класс, одновременно как базовый и
косвенный базовый класс, поскольку его элементы автоматически
становятся неоднозначными. Попробуйте сделать базовый класс в
обоих случаях виртуальным.
Base class класс is included more than once
Сообщение об ошибке этапа компиляции
(базовый класс "класс" включен более одного раза)
Класс С++ может быть производным от любого числа базовых
классов, но непосредственно от одного и того же класса он может
быть производным только один раз.
Base class класс is initialized more than once
Сообщение об ошибке этапа компиляции
(базовый класс "класс" инициализируется более одного раза)
В конструкторе класса С++ список инициализации, следующий за
заголовком конструктора, включает указанный базовый класс более
одного раза.
Base initialization without a class name is now obsolete
Сообщение об ошибке этапа компиляции
(инициализация базового класса без имени класса является устаревшей)
Ранние версии С++ для инициализации базового класса позволяли помещать за заголовком конструктора просто список параметров
конструктора базового класса. Теперь рекомендуется включать имя
базового класса.
Это делает программу понятней и является обязательным в случае множественных базовых классов.
Старая запись:
derived::derived(int i) : (i, 10) { ... }
Новая запись:
derived::derived(int i) :Base(i, 10) { ... }
Bit field cannotBe static
Сообщение об ошибке этапа компиляции
( Битовое поле не может быть статическим)
Только обычные данные-элементы классов С++ могут быть объявлены как static, но не битовые поля.
Bit field too large
Сообщение об ошибке этапа компиляции
(битовое поле слишком велико)
Это ошибка может возникать, когда вы указываете битовое поле
длиной более 16 бит.
Bit field mustBe signed or unsigned int
Сообщение об ошибке этапа компиляции
(битовые поля должны иметь тип signed или unsigned int)
Битовое поле должно быть объявлено с целочисленным типом
signed или unsigned. В языке Си стандарта ANSI битовые поля могут
быть только signed или unsigned int (но, например, не сhar или
long).
Bit field mustBe signed or unsigned int
Предупреждение этапа компиляции
(битовые поля должны иметь тип signed или unsigned int)
В Си стандарта ANSI битовые поля не могут иметь тип char или
unsigned char. Однако, если компиляция не выполняется в строгом
режиме ANSI, компилятор будет допускать такую конструкцию, но отмечать ее данным предупреждением.
Bit fields must contain at least oneBit
Сообщение об ошибке этапа компиляции
(битовые поля должны содержать как минимум один бит)
Вы не можете объявить именованное битовое поле длиной 0 (или
менее 0) бит. Можно объявить битовое поле нулевой длины без имени, по соглашению используемое для принудительной установки выравнивания битового поля по границе байта (или по границе слова,
если выбран параметр выравнивания -a).
Bit field must have integral type
Сообщение об ошибке этапа компиляции
(битовые поля должны иметь целый тип)
В С++ битовые поля, включая перечисления, должны иметь целый
тип; это включает в себя перечисления.
Body already defined for this function функция
Сообщение об ошибке этапа компиляции
(тело функции функция уже определено)
Тело функции с этим же именем и типом уже встречалось выше.
Тело функции может входить в программу только один раз.
Both return and return with a value
Предупреждение этапа компиляции
(одновременно присутствуют операторы return и return с заданным значением)
Текущая функция содержит операторы return с заданным значением возврата и без значения возврата одновременно. В Си это допустимо, но практически всегда является ошибкой. Вероятно, оператор return просто был опущен в конце функции.
Базовые параметры
Базовые параметры определяют, куда будет записываться сгене-
рированный код, и управляет поддержкой справочных файлов.
Базовые параметры
Базовые параметры управляют общим видом основного окна при-
ложения.
Базовые параметры дочерних окон и отображаемых элементов MDI
Базовые параметры определяют используемые по умолчанию параметры дочернего окна MDI.
Базовый класс TValidator
Абстрактный класс TValidator - это базовый класс, из которого получаются все объекты проверки допустимости. Все его функции-элементы всегда возвращают значения True, а Error не выполняет никаких действий. Чтобы определять, какие значения являются
допустимыми, производные классы должны переопределять функции IsValid, IsValidInput и Error.
Библиотека INCLUDE
Библиотека INCLUDE\CLASSLIB содержит файлы заголовков, необходимые для компиляции программы, которая использует классы контейнеров. Для каждого ADT или FDS в этом каталоге имеется соответствующий файл заголовка. Убедитесь, что вы включили INCLUDE в
маршрут доступа и явно ссылаетесь на файл заголовка.
Библиотека iostream
Библиотека iostream (определенная в файле iostream.h) содержит два параллельных семейства классов: классы, которые являются
производными (порожденными) из streambuf, и классы, производные
из ios. Оба эти классы являются классами нижнего уровня, и каждый
из них выполняет различный набор задач. Один из этих двух классов
является базовым классом для всех классов потоков.
Библиотека классов постоянных потоков
Опишем, что нового появилось в объектной поддержке потоков
Borland, а затем поясним, как сделать объекты потоковыми.
Объекты, которые вы создаете при запуске приложения (окна,
диалоговые окна, наборы и т.д.) являются временными. Они строятся, используются и уничтожаются в ходе выполнения приложения.
Объекты могут появляться и уничтожаться при входе и выходе из их
области действия или при завершении программы. Сделав свои объекты, потоковыми, вы можете сохранить эти объекты в памяти или в
файловых потоках. Поэтому они являются постоянными.
Для постоянных потоков существует множество применений. При
сохранении в совместно используемой памяти они могут обеспечивать
коммуникации между процессами. Их можно передавать через модемы в
другие системы. Кроме того, объекты можно сохранить на диске с
помощью файловых потоков. Их можно считывать обратно и восстанавливать в том же приложении, в других экземплярах того же приложения или в других приложениях. Эффективное, содержательное и надежное использование потоков доступно для всех объектов.
Построить собственные потоковые классы достаточно просто и
не потребует особых издержек. Чтобы сделать класс потоковым, вам
нужно добавить специфические элементы данных, функции-элементы и
операции. Свой производный класс вы должны построить (прямо или
косвенно) ил TStreamableBase. Любой производный класс также является потоковым.
Чтобы упростить создание потоковых объектов, библиотека постоянных потоков содержит макрокоманды, добавляющие все подпрограммы, необходимые для того, чтобы сделать ваши классы потоковыми. Наиболее важными из них являются DECLARE_STREAMABLE и
IMPLEMENT_STREAMABLE. Эти макрокоманды добавляют программный код,
необходимый для того, чтобы сделать ваши объекты потоковыми.
Для облегчения их использования и расширения функциональных
возможностей объектов потоки в Borland C++ 4.0 существенно изменены. Эти изменения совместимы с существующим кодом ObjectWindows
и кодом Turbo Vision.
Новый потоковый код легче использовать, поскольку он предусматривает макрокоманды, освобождающие программиста от запоминания
большинства деталей, необходимых для создания потоковых классов.
Другие новые средства включают в себя поддержку множественного
наследования, отслеживание версий классов и лучшую изоляцию системы. Кроме того, потоковый код реорганизован так, чтобы облегчить написание библиотек, позволяющих не компоновать потоковый
код, если он не используется.
Потоки перенесены из библиотеки ObjectWindows в библиотеку
классов. Это облегчает применение потоков в приложениях, не использующих ObjectWindows.
Потоковые средства имеют несколько дополнений. Целью этих
изменений является обеспечение обратной совместимости, поэтому,
если вы компилируете работающее приложение с новым потоковым кодом, приложение сможет считывать потоки, записанные в старом коде. Однако запись потоков в старом формате не предусматривается.
В следующих разделах описываются изменения и новые возможности потоковых средств.
Библиотека контейнерного класса
В данном разделе описываются структуры данных BIDS (Borland
International Data Structures), которые называются также библиотекой контейнерного класса. Контейнеры - это объекты, реализующие
общие структуры данных, предлагающие функции-элементы для доступа
к каждому элементу данных и добавления таких элементов. При этом
внутренние детали скрыты от пользователей. Контейнеры могут содержать целые и вещественные числа, строки, структуры, классы,
типы, определенные пользователями, и любые объекты C++.
Контейнеры Borland реализуются с помощью шаблонов. Вы можете
передавать в шаблон любой тип объекта, который хотите включить в
контейнер. Это облегчает, например, инициализацию массивов.
Библиотеку класса контейнера можно разделить на две категории: фундаментальные структуры данных FDS (Fundamental Data
Structures) и абстрактные типы данных ADT (Abstract Data Types)
Библиотеки DLL
Использование в приложениях библиотек динамической компоновки DLL позволяет уменьшить объем файла .EXE, экономит системную
память и обеспечивает большую гибкость при изменении и расширении
приложений. DLL - это библиотека выполняемых модулей, содержащая
функции или ресурсы, используемые приложениями или другими DLL.
DLL не имеет основной функцией, которая обычно служит точкой входа в основную программу. DLL содержит несколько точек входа, по
одной на каждую экспортируемую функцию. При загрузке DLL операционной системой она (одна ее копия) может совместно использоваться
несколькими приложениями. Для полного понимания DLL полезно понимать, чем отличаются статическая и динамическая компоновка.
Библиотеки DOS
Ниже представлен краткий обзор библиотечных программ Borland
С++, доступных только для 16-разрядных приложений DOS. Библиотечные подпрограммы состоят из функций и макрокоманд, которые можно
вызывать в программах Си и С++ для выполнения различных задач,
включая ввод-вывод различного уровня, работу со строками и файлами, распределение памяти, управление процессом, преобразование
данных, математические вычисления и др.
В данном разделе вы найдете имена библиотек из файлов в подкаталоге LIB с описанием их использования, а также представленные
по категориям библиотечные подпрограммы (в соответствии с типом
выполняемых ими задач).
Библиотеки импорта
При использовании DLL вы должны дать компоновщику определения функций, которые хотите импортировать из DLL. Эта информация
временно удовлетворяет внешние ссылки на функции, вызываемые компилируемым кодом, и сообщает загрузчику Windows, где найти функции на этапе выполнения. Сообщить компоновщику о функциях импорта
можно двумя способами:
Вы можете добавить секцию IMPORT в файл определения модуля
и перечистить все функции DLL, которые будет использовать
данный модуль.
Включить библиотеку импорта для DLL можно при компоновке
модуля.
Библиотека импорта содержит определения импорта для всех или
некоторых экспортируемых функций для одной или более DLL. Утилита
IMPLIB создает для DLL библиотеки импорта. IMPLIB создает библиотеки импорта непосредственно из DLL или из файлов определения модуля DLL (либо из их комбинации).
Библиотеки исполняющей системы
В приложениях DOS используются статические библиотеки исполняющей системы (OBJ и LIB). Эти приложения описаны в данном разделе. Дополнительные библиотеки вы найдете в справочнике по библиотекам.
Существует несколько версий библиотеки исполняющей системы.
Это версии для конкретных моделей памяти и диагностические библиотеки. Имеются также дополнительные библиотеки, обеспечивающие
контейнеры, графику и математические операции. При выборе используемых библиотек исполняющей системы следует иметь в виду что перечисленные ниже библиотеки используются только в 16-разрядных
приложениях DOS. Об обработке исключительных ситуаций рассказывается выше.
Библиотеки поддержки DOS
Статические (OBJ и LIB) 16-разрядные библиотеки исполняющей
системы Borland С++ после установки записываются в подкаталог
LIB. Для каждого из имен этих библиотек символ '?' представляет
одну и 6 поддерживаемых Borland моделей памяти. Каждая модель
имеет собственный библиотечный файл и файл поддержки математических операций с версиями подпрограмм, написанных для конкретной
модели.
В следующей таблице перечислены имена библиотек Borland С++,
которые доступны только для 16-разрядных приложений DOS.
BIDSH.LIB | Библиотеки классов Borland модели памяти
huge. |
BIDSDBH.LIB | Диагностическая версия той же библиотеки. |
C?.LIB | Библиотеки DOS. |
C0F.OBJ | MS-совместимые библиотеки запуска. |
C0?.OBJ | Библиотеки запуска BC. |
EMU.LIB | Эмуляция операций с плавающей точкой. |
FP87.LIB | Для программ, работающих на машинах с сопроцессором 80х87. |
GRAPHICS.LIB | Графический интерфейс Borland. |
MATH?.LIB | Математические подпрограммы. |
OVERLAY.LIB | Разработка оверлеев. |
Бинарные операции
Операции типа сложения | + | Бинарный плюс (сложение) |
- | Бинарный минус (вычитание) | |
Операции типа умножения | * | Умножение |
/ | Деление | |
% | Остаток от деления | |
Операции сдвига | << | Сдвиг влево |
>> | Сдвиг вправо | |
Поразрядные операции | & | Поразрядное И |
^ | Поразрядное исключающее ИЛИ | |
| | Поразрядное включающее ИЛИ | |
Логические операции | && | Логическое И |
|| | Логическое ИЛИ | |
Операции присваивания | = | Присваивание |
*= | Присвоить произведение | |
/= | Присвоить частное | |
%= | Присвоить остаток | |
+= | Присвоить сумму | |
-= | Присвоить разность | |
<<= | Присвоить сдвиг влево | |
>>= | Присвоить сдвиг вправо | |
&= | Присвоить поразрядное И | |
^= | Присвоить поразрядное
исключающее ИЛИ | |
|= | Присвоить поразрядное ИЛИ | |
Операции отношения | < | Меньше |
> | Больше | |
<= | Меньше или равно | |
>= | Больше или равно | |
Операции равенства | == | Равно |
!= | Не равно | |
Операции выбора элемента | . | Непосредственный выбор элемента |
-> | Косвенный выбор элемента | |
Операции с элементами класса | :: | Доступ/определение области действия |
.* | Обращение через указатель к элементу класса | |
->* | Обращение через указатель к элементу класса | |
Условные операции | a ? x : y | "Если a, то x, иначе - y" |
Операция запятой | , | Вычислить, например, a, b, c слева - направо |
Блоки списков
С помощью такого блока пользователь может выбирать что-либо
из списка. Класс TListBox инкапсулирует блоки списка и определяет
функции-элементы для создания блоков списка, модификации элементов списка, запроса о списке элемента и поиска выбранного пользователем элемента.
Один и конструкторов TListBox имеет 7 стандартных параметров
конструктора объекта управляющего элемента: родительское окно,
идентификатор ресурса, размеры и положение управляющего элемента,
а также необязательный идентификатор библиотеки.
TListBox получает заданные по умолчанию стили управляющего
элемента и добавляет LBS_STANDARD - комбинацию LBS_NOTIFY,
WS_VSCROLL (для вывода вертикально полосы прокрутки), LBS_SORT
(для сортировки списка по алфавиту) и WS_BORDER (для вывода рамки). Если вы хотите получить другой стиль, то можете модифицировать Attr.Style (в конструкторе объекта блока списка или родительского объекта).
После создания блока списка его нужно заполнить элементами
(строками). После этого вы можете включать, добавлять, удалять
элементы из списка или очищать его. Для этого используются функции ClearList, DirectoryList, AddString, InsertString, DeleteString, SetSelIndex, SetSel, SetSelString, SetSelStrings, SetSelIndexes, SetSelItemRange, SetTopIndex, SetTabStops, SetHorizontalExtent, SetColumnWidth, SetCaretIndex, SetItemData, SetItemHeight.
Существует также несколько функций-элементов, с помощью которых вы можете получить информацию о блоке списка или его элементах. Это функции: GetCount, FindString, FindExactString, GetTopIndex, GetCaretIndex, GetHorizontalExtent, GetItemData, GetItemHeight, GetItemRect, GetSelCount. GetSelIndex, GetSel, GetSelString, GetSelStrings, GetSelInbdexes, GetString, GetStringLen.
Более легкий подход в Borland С++
Сейчас наша программа на языке Си стала выглядеть более объектно-ориентированной. Однако, есть маленькая неточность, все указатели
оказываются разименованными. Например, посмотрите на фрагмент текста
из функции decompressor_next():
dc->c = *(dc->p)++; /* Обработка следующего символа буфера */
if (dc->c == 0xff) {
dc->rcnt = (*(dc->p)++)-1; /* Сброс первого символа в записи */
dc->c = *(dc->p)++; /* Здесь повторить символ */
dc->srclen -= 2;
}
Это довольно безобразный текст. Можем ли мы его исправить? Конечно, для этого нужно использовать Турбо и Borland С++.
- C -
Call of non-function
Сообщение об ошибке этапа компиляции
(вызов не функции)
Вызываемое имя не было объявлено как функция. Эта ошибка
обычно возникает при неправильном объявлении или опечатке в имени
функции.
Call to function функция with no prototype
Предупреждение этапа компиляции
(вызов функции функция без прототипа)
Это сообщение выдается в тех случаях, когда разрешено сообщение "Prototype required" ("Требуется прототип"), и вы вызываете
функцию функция без первоначального задания прототипа этой
функции.
Call to undefined function функция
Сообщение об ошибке этапа компиляции
(вызов не определенной функции)
В вашей программе текущая функция описывается как возвращающая тип, отличный от void в С++ (или int в Си), но компилятор обнаружил возврат без значения. Обычно это указывает на ошибку.
virtual cannot be used with data member
Сообщение об ошибке этапа компиляции
(virtual нельзя использовать с элементами данных)
Элемент данных описан как virtual. Так можно описывать только функции-элементы.
Cannot access an inactive scope
Сообщение об ошибке этапа компиляции
(нельзя обратиться к неактивной области действия)
Вы пытаетесь проверить или вычислить переменную, локальную
по отношению к функции, которая в данный момент не является активной. Это сообщение возникает при вычислении выражения с помощью встроенного отладчика. Это сообщение используется только встроенным отладчиком.
Cannot add or substract relocatable symbols
Сообщение об ошибке этапа компиляции
(сложение или вычитание переместимых идентификаторов невозможно)
Единственная арифметическая операция, которая может выполняться с переместимым именем идентификатора в качестве ассемблерного операнда - это сложение или вычитание с константой. Переменные, процедуры, функции и метки являются переместимыми идентификаторами. Если Var - это переменная, а Const - это константа, то
команды:
MOV AX,Const+Const
и
MOV AX,Var+Const
допустимы, а команда MOV AX AX,Var+Var недопустима.
Cannot allocate a reference
Сообщение об ошибке этапа компиляции
(нельзя выделить ссылку)
Предпринята попытка создать ссылку с помощью операции new.
Это не допускается, поскольку ссылки не являются объектами, поэтому их нельзя распределить с помощью new.
идентификатор cannot be declared in an anonymous union
Сообщение об ошибке этапа компиляции
(идентификатор нельзя описать в анонимном объединении)
Компилятор обнаружил описание функции-элемента или статический элемент анонимного объединения. Такие объединения могут содержать только элемент данных.
функция_1 cannot be distinguished from функция_2
Сообщение об ошибке этапа компиляции
(функция_1 не может отличаться от функции_2)
Тип параметра, указанный в описании этих двух функций не отличаются достаточно, чтобы их можно было идентифицировать как
различные. Попробуйте изменить порядок параметров в одном из описаний.
Cannot call main from within the program
Сообщение об ошибке этапа компиляции
С++ не допускает рекурсивных вызовов функции main.
Cannot call near class member function with a pointer of type тип
Сообщение об ошибке этапа компиляции
(невозможно вызвать функцию-элемент ближнего класса с указателем указанного типа)
Функции-элементы ближних классов (классы являются ближними
по умолчанию в моделях памяти TINY, SMALL и MEDIUM) нельзя вызывать с помощью указателей элементов типа FAR или HUGE. (Заметим,
что это применимо также к вызовам элементов с помощью указателей.) Либо измените указатель на ближний, либо опишите класс как
дальний.
Cannot cast from тип_1 to тип_2
Сообщение об ошибке этапа компиляции
(Приведение типа между типом_1 и типом_2 невозможно)
Приведение типа тип_1 к типу тип_2 здесь запрещено. В Си
указатель может быть приведен к целому типу или к другому типу
указателя. Целочисленный тип может быть приведен к любому целому
типу, типу с плавающей точкой и указателю. Тип с плавающей точкой
может быть приведен к целому типу или другому типу с плавающей
точкой. Структуры и массивы не позволяют выполнение для них приведений типа. Невозможны также приведения для типа void.
В С++ проверяется наличие преобразований и конструкторов,
определяемых пользователем, и в случае их отсутствия применяются
правила приоритета ( за исключением указателей на элементы класса). Из целых типов только для константы со нулевым значением допускается приведение к типу указателя элемента. Указатель элемента допускает приведение к целому типу или аналогичному указателю
элемента. Последний будет указывать на элемент данных, если на
него был установлен исходный указатель, и на функцию-элемент, если на нее был установлен исходный указатель. Уточняющий класс типа, к которому выполняется приведение, должен быть тем же, что и базовый класс исходного.
Cannot convert тип_1 to тип_2
Сообщение об ошибке этапа компиляции
(невозможно преобразовать тип_1 в тип_2)
Присваивание, инициализация или выражение требует выполнение
заданного преобразования типа, но данное преобразование недопустимо.
Cannot create instance abstract class класс
Сообщение об ошибке этапа компиляции
(Создание экземпляра абстрактного класса класс невозможно)
Абстрактные классы с "чистыми" виртуальными функциями не могут использоваться непосредственно, допускается лишь создание
производных (порожденных) от них классов.
Cannot define a pointer or reference to a reference
Сообщение об ошибке этапа компиляции
(Определение указателя или ссылки на ссылку невозможно)
Указатель на ссылку или ссылку на ссылку не допускается.
Cannot find класс::класс (класс&) to copy a vector
Сообщение об ошибке этапа компиляции
(Не найден класс::класс (класс&) для копирования вектора)
Если класс С++ класс_1 содержит вектор (массив) класса
класс_2 и вы хотите сконструировать объект типа класс_1 из другого объекта типа класс_1, то должен быть конструктор
класс_2::класс_2 (класс_2&) такой, чтобы могли быть сконструированы элементы вектора.
Данный конструктор принимает только один
параметр (являющийся ссылкой на его класс) и называется конструктором ссылки.
Обычно компилятор создает конструктор ссылки автоматически.
Однако, если вы определили конструктор для класса класс_2, имеющего параметр типа класс_2, и дополнительные параметры со значениями по умолчанию, то данный конструктор ссылки не может существовать и не может быть создан компилятором. (Вследствие того, что
класс_2::класс_2 (класс_2&) и класс_2::класс_2 (класс_2&, int =
1) не различаются компилятором). Вы обязаны переопределить данный
конструктор таким образом, чтобы не все параметры имели значения
по умолчанию. Затем вы можете определить конструктор ссылки или
позволить компилятору создать собственный.
Cannot find класс::операция= (класс&) to copy a vector
Сообщение об ошибке этапа компиляции
(Не найден класс::операция=(класс&)для копирования вектора)
Когда в С++ класс "класс_1" содержит вектор (массив) класса
класс_2, и вы хотите скопировать класс типа класс_1, где должна
быть операция присваивания класс::операция=(класс&), для копирования данного вектора. Обычно компилятор подставляет такую операцию автоматически. Однако, если вы для класса_2 определяете operator=, но не ту, которая воспринимает параметр типа класс&, то
компилятор не будет подставлять ее автоматически - вы должны указать ее сами.
Cannot find default конструктор to initialize array element
of type класс
Сообщение об ошибке этапа компиляции
(для инициализации элемента массива типа класс невозможно
найти используемый по умолчанию конструктор)
При описании массива класса, имеющего конструкторы, вы должны либо явно инициализировать каждый элемент данного массива, либо класс должен содержать используемый по умолчанию конструктор
(он будет использоваться для инициализации элементов массива, не
имеющих явных инициализаторов). Если вы не определили конструктор
по умолчанию, компилятор будет определять для класса используемый
по умолчанию конструктор.
Cannot find default конструктор to initialize base class
класс
Сообщение об ошибке этапа компиляции
(для инициализации базового класса класс невозможно найти
используемый по умолчанию конструктор)
Когда в С++ строится производный класс "класс_2", должен
быть построен каждый базовый класс "класс_1". Если конструктор
для класса_2 не задает конструктор для "класса_1" (как часть заголовка класса_2), то должен существовать конструктор
класс_1::класс_1() для базового класса. Данный конструктор без
параметров называется используемым по умолчанию конструктором.
Если вы не определили используемый по умолчанию конструктор, компилятор будет подставлять используемый по умолчанию конструктор
автоматически. Если вы определили конструктор, его нужно указать
явно.
Cannot find default конструктор to initialize member идентификатор
Сообщение об ошибке этапа компиляции
(для инициализации элемента идентификатор невозможно найти
используемый по умолчанию конструктор)
Если класс С++ класс_2 содержит элемент класса класс_2, и вы
хотите построить объект типа класс_1, но не из другого объекта
типа класс_1, то требуется наличия конструктора
класс_2::класс_2(), благодаря чему может быть построен данный
элемент. Данный конструктор без параметров называется используемым по умолчанию конструктором. Если вы не определили используемый по умолчанию конструктор для класса класс_2, компилятор будет
подставлять используемый по умолчанию конструктор автоматически.
Если вы определили конструктор, его нужно указать явно.
Cannot find MAKE.EXE
Сообщение об ошибке утилиты MAKE
(не найден файл MAKE.EXE)
Не найдена утилита MAKE. Убедитесь, что она находится в текущем каталоге или по маршруту.
Cannot generate COM file: data below initial CS:IP defined
Сообщение об ошибке утилиты TLINK
(файл COM сгенерировать невозможно, определены данные ниже
первоначального значения CS:IP)
Данная ошибка является результатом попытки сгенерировать
данные или код ниже стартового адреса файла .COM (обычно 100).
Убедитесь, что начальный адрес устанавливается в значение 100 с
помощью инструкции ORG 100H. Для программ, написанных на языке
высокого уровня, такая ошибка возникать не должна. Если она возникает, убедитесь, что компонуется корректный объектный модуль
инициализации (C0x).
Cannot generate COM file: invalid initial entry point address
Сообщение об ошибке утилиты TLINK
(файл COM сгенерировать невозможно: неверный адрес начальной
точки входа)
Вы использовали параметра /Tdc или /t, но начальный адрес
программы не равен 100H, что требуется для файлов .COM.
Cannot generate COM file: program exceeds 64K
Сообщение об ошибке утилиты TLINK
(файл COM сгенерировать невозможно: программа превышает по
размеру 64К)
Вы использовали параметр /Tdc или /t, но общий размер программы превышает предел формата .COM.
Cannot generate COM file: segment-relocatable items present
Сообщение об ошибке утилиты TLINK
(невозможно сгенерировать файл COM: присутствуют относитель-
ные перемещаемые записи)
Вы использовали параметр /Tdc или /t, но программа содержит
относительные корректировки сегмента, которые не допускаются в
файлах .COM.
Cannot generate COM file: stack segment present
Сообщение об ошибке утилиты TLINK
(невозможно сгенерировать файл COM: присутствуют сегмент
стека)
Вы использовали параметр /Tdc или /t, но программа содержит
сегмент стека, что не допускается для файлов .COM.
Cannot generate функция from template function шаблон
Сообщение об ошибке этапа компиляции
(из указанного шаблона невозможно сгенерировать данную функцию)
Обнаружен вызов шаблона функции, но соответствующую шаблону
функцию нельзя сгенерировать из данного шаблона.
Cannot have a non-inline function in a local class
Cannot have a static data in a local class
Сообщение об ошибке этапа компиляции
(в локальном классе встроенная функция или статические данные не допускаются)
Все элементы класса, описанного для функции как локальный,
должны быть полностью определены в определении класса. Это означает, что такие локальные классы не могут содержать никаких статических элементов данных, и тела всех их функций-элементов должны определяться в определении класса.
Cannot have multiple paths for implicit rule
Сообщение об ошибке утилиты MAKE
(для неявных правил не допускается несколько маршрутов)
Для каждого расширения неявного правила может быть только
один маршрут. Списки множественных маршрутов допустимы только для
зависимых файлов и в явном правиле, например:
{path1;path2}.c.obj: # недопустимо
{path}.c.obj # допустимо
Cannot have paths for target
Сообщение об ошибке утилиты MAKE
(для целевого файла не допускается несколько маршрутов)
Списки множественных маршрутов допустимы только для зависимых файлов и явном правиле, например:
{path1;path2}.c.obj: # недопустимо
{path}.c.obj # допустимо
Cannot initialize a class member here
Сообщение об ошибке этапа компиляции
(инициализация элемента класса здесь невозможна)
Отдельные элементы структур, объединений и классов С++ могут
не иметь инициализаторов. Структура или объединение могут инициализироваться как единое целое при помощи инициализаторов в фигурных скобках. Класс С++ можно инициализировать только при помощи
конструктора.
Cannot initialize тип_1 with тип_2
Сообщение об ошибке этапа компиляции
(тип_1 не может быть инициализирован типом_2)
Вы пытаетесь инициализировать объект типа тип_1 значением
типа тип_2, что недопустимо. Правила инициализации те же, что и
для присваивания.
Cannot modify a const object
Сообщение об ошибке этапа компиляции
(модификация объекта-константы невозможна)
Недопустимая операция с объектом, объявленным константой,
например, попытка присваивания такому объекту.
Cannot overload 'main'
Сообщение об ошибке этапа компиляции
(переопределение функции 'main' невозможно)
Функция main - это единственная функция, переопределить которую нельзя.
функция cannot return a value
Сообщение об ошибке этапа компиляции
(функция не может возвращать значение)
Это сообщение выдается, если функция с типом возврата void
содержит оператор return, возвращающий некоторое значение, например, int.
идентификатор cannot start an argument declaration
Сообщение об ошибке этапа компиляции
( указанный идентификатор не может начинать описание аргумента)
В начале аргумента в описателе функции найден не определенный идентификатор. Это часто вызывается опечатками в имени или
описании типа или пропуском (ошибка обычно возникает при включении файла заголовка).
идентификатор cannot start an parameter declaration
Сообщение об ошибке этапа компиляции
(указанный идентификатор не может начинать описание параметра)
В начале аргумента в описателе функции найден не определенный идентификатор. Это часто вызывается опечатками в имени или
описании типа или пропуском (ошибка обычно возникает при включении файла заголовка).
Cannot take address of main
Сообщение об ошибке этапа компиляции
(адрес main получить невозможно)
В С++ не допускается получение адреса функции main.
Cannot throw type - ambiguous class база
Сообщение об ошибке этапа компиляции
(тип породить невозможно - неоднозначный базовый класс)
Не допускается порождать класс, содержащий более одной копии
невиртуального (базового) класса.
Cannot write a string option
Сообщение об ошибке утилиты MAKE
Параметр -W утилиты MAKE записывает в MAKE.EXE символьный
параметр. При строковом параметре генерируется данное сообщение.
Cannot write GRPDEF list, extended dictionary aborted
Сообщение об ошибке утилиты TLIB
(список GRPDEF записать невозможно, расширенный словарь отброшен)
Библиотекарь не может записать в конец библиотечного файла
расширенный словарь. Обычно это указывает на недостаток места на
диске.
Can't grow LE/LIDATA record buffer
Сообщение об ошибке утилиты TLIB
(невозможно увеличение записи буфера LE/LIDATA)
Ошибка командной строки. См. сообщение out of memory reading
LE/LIDATA record from object buffer
.
Case bypassed initialization of local variable
Сообщение об ошибке этапа компиляции
(конструкция case обошла инициализацию локальной переменной)
В С++ недопустимо любым способом обходить инициализацию локальной переменной. В данном случае в конструкторе case имеется
ветвь, по которой управление передается за точку инициализации
локальной переменной.
Case outside of switch
Сообщение об ошибке этапа компиляции
(оператор case вне оператора switch)
Компилятор встретил оператор case вне оператора switch. Это
часто случается при несоответствии числа правых и левых фигурных
скобок.
Case statement missing :
Сообщение об ошибке этапа компиляции
(в операторе case отсутствует :)
Оператор case должен содержать выражение типа константы, за
которым следует двоеточие. Либо в выражении оператора case отсутствует двоеточие, либо перед двоеточием находится лишний идентификатор.
Catch expected
Сообщение об ошибке этапа компиляции
(требуется catch)
В программе С++ за блоком try должен следовать по крайней
мере один блок catch.
Character constant must be one or two characters long
Сообщение об ошибке этапа компиляции
(символьная константа должна иметь в длину один или два символа)
Символьные константы могут иметь длину только в один или два
символа.
Character constant too long
Сообщение об ошибке утилиты MAKE
(слишком длинная символьная константа)
Символьные константы могут иметь длину только в один или два
символа.
Circular depandency exists in makefile
Фатальная ошибка утилиты MAKE
(в формирующем файле имеется циклическая зависимость)
Формирующий файл указывает, что файл должен иметь новую версию до того, как его можно построить. Возьмем, например, явные правила:
filea: fileb
fileb: filec
filec: filea
Это предполагает, что файл filea зависит от файла fileb, который зависит от файла filec, а файл filec зависит от файла filea. Это недопустимо, так как прямо или косвенно не может зави сеть от самого себя.
Class класс may not contain pure functions
Сообщение об ошибке этапа компиляции
(указанный класс может не содержать "чистых" функций)
Описанный класс не является абстрактным, поэтому он может не
содержать "чистых" функций.
Class member элемент declared outside its class
Сообщение об ошибке этапа компиляции
( элемент класса объявлен вне своего класса)
Функции-элементы класса С++ могут описываться только внутри
объявления класса. В отличие от функций, не являющихся элементами
класса, они не могут иметь несколько объявлений или описываться в
других местах.
Code has no effect
Предупреждение этапа компиляции
(код не вызывает никаких действий)
Данное предупреждение выдается, когда компилятор встречает
оператор с операциями, не выполняющими никаких действий. Например, оператор:
a + b;
не оказывает воздействия ни на какую переменную. Операция не нужна и наверняка записана по ошибке.
Colon expected
Фатальная ошибка утилиты MAKE
(требуется двоеточие)
Вы забыли указать в конце неявного правила двоеточие.
.c.obj: # правильно
.c.obj # неправильно
Command arguments too long
Фатальная ошибка утилиты MAKE
(Аргументы команды имеют слишком большую длину)
Аргументы команды, выполняемой обслуживающей программой
MAKE, имеют в длину более 127 знаков - ограничение, установленное
системой DOS.
Command syntax error
Фатальная ошибка утилиты MAKE
(синтаксическая ошибка в команде)
Это сообщение появляется, если:
Первая строка правила начинается с пробела.
Неявное правило не состоит из расшир.расшир:.
Явное правило не содержит имени перед : символа.
Макроопределение не содержит имени перед = символ.
Command too long
Фатальная ошибка утилиты MAKE
(слишком длинная команда)
Длина команды превышает 128 символов. Желательно использовать командный файл утилиты.
Common segment exceeds 64K
Сообщение об ошибке утилиты TLINK
(общий сегмент превышает 64К)
Программа содержит более 64К ближних неинициализированных
данных. Попытайтесь описать некоторые неинициализированные данные, как дальние.
Compiler could not generate copy constructor for class класс
Сообщение об ошибке этапа компиляции
(компилятор не может сгенерировать конструктор копирования
для класса класс)
В соответствии с правилами языка компилятор не может сгенерировать для класса необходимый конструктор копирования.
Compiler could not generate default constructor for class
класс
Сообщение об ошибке этапа компиляции
(компилятор не может сгенерировать используемый по умолчанию
конструктор для класса)
В соответствии с правилами языка компилятор не может сгенерировать для класса необходимый конструктор, используемый по
умолчанию.
Compiler could not generate operator= for class класс
Сообщение об ошибке этапа компиляции
(компилятор не может сгенерировать для класса operator=)
В соответствии с правилами языка компилятор не может сгенерировать для класса необходимую операцию присваивания.
Compiler table limit exceeded
Фатальная ошибка этапа компиляции
(превышен размер таблицы компилятора)
Данное сообщение появляется при переполнении одной из внутренних таблиц компилятора. Это обычно означает, что компилируемый
модуль содержит слишком много объявлений классов C++, либо слишком много функций или других элементов программы. В этом случае
увеличение доступной компилятору памяти не поможет. Единственным
средством обычно является упрощение файлов программы.
Compound statement missing }
Сообщение об ошибке этапа компиляции
(в составном операторе отсутствует })
Компилятор дошел до конца исходного файла, но не обнаружил
закрывающей фигурной скобки. Это обычно бывает при несовпадающем
количестве правых и левых скобок.
Condition is always false
Condition is always true
Предупреждение этапа компиляции
(условие всегда ложно/истинно)
Компилятор обнаружил сравнение значений, при котором результат всегда принимает ложное или истинное значение. Например:
void proc(unsigned x)
{
if (X >= 0) /* всегда 'true' */
{
.
.
.
}
}
Conflicting type modifiers
Сообщение об ошибке этапа компиляции
(противоречащие друг другу модификаторы типа)
Это случается, когда в объявлении встречается, например, два
ключевых слова - far и near, относящихся к одному и тому же указателю. Одному указателю может соответствовать только один модификатор адресации, а функция может иметь только один модификатор
языка (cdecl, pascal или interrupt).
идентификатор conflicts with module модуль
Сообщение об ошибке утилиты TLINK
(конфликт указанного идентификатора с модулем)
Это указывает на несогласованность определений идентификатора. TLINK нашел виртуальную функцию и одно общее определение с
тем же именем.
Constant expression required
Сообщение об ошибке этапа компиляции
(требуется выражение типа константы)
Массивы должны объявляться с заданным константой выражением.
Данная ошибка обычно вызывается опечаткой в константе в #define.
Constant is long
Предупреждение этапа компиляции
(длинная константа)
Компилятор встретил либо десятичную константу, превышающую
значение 32767, либо восьмеричную (или шестнадцатиричную) константу, превышающую значение 65535 без следующей за ней буквы l
или L. Такая константа будет рассматриваться как имеющая тип
long.
Constant member элемент is class without constructors
Сообщение об ошибке этапа компиляции
(элемент-константа элемент в классе без конструкторов)
Класс, содержащий элементы-константы, должен иметь по крайней мере один конструктор, определенный пользователем. В противном случае такие элементы инициализировать будет невозможно.
Constant member элемент is not initialized
Предупреждение этапа компиляции
(элемент-константа не инициализирована)
Класс С++ имеет константу-элемент, которая не была инициализирована. Отметим, что допустимым является инициализировать константу-элемент, а не присваивать ей значение.
Constant out of range in comparison
Предупреждение этапа компиляции
(участвующая в сравнении константа вне допустимого диапазона)
В исходном файле имеется сравнение, в котором участвует подвыражение, лежащее вне диапазона, допустимого для прочих типов
подвыражений. Например, сравнение числа unsigned с -1 не имеет
смысла. Для того, чтобы получить константу unsigned больше 32767
(десятичное), требуется либо явно задать приведение типа к
unsigned (например, (unsigned)65535), либо добавить к константе
буквы u или U (например, 65535u).
При выдаче данного сообщения компилятор тем не менее сгенерирует код для сравнения. Если даже данный код будет всегда давать одинаковый результат, например при сравнении выражения типа
Char с 4000, код все равно будет выполнять сравнение.
Constant variable переменная must be initialized
Сообщение об ошибке этапа компиляции
(указанная переменная-константа должна инициализироваться)
Данный объект С++ описан как const, но не инициализируется.
Поскольку значений ему присвоить нельзя, он должен инициализироваться в точке описания.
Constructor cannot be const or volatile
Сообщение об ошибке этапа компиляции
(конструктор не может иметь тип const или volatile)
Конструктор описан как const и/или volatile, а это не допускается.
Constructor cannot have a return type specification
Сообщение об ошибке этапа компиляции
(конструктор не может содержать спецификацию типа возврата)
Конструкторы С++ имеют неявный тип возврата, используемый
компилятором, но вы не можете описать тип возврата или возвратить
значение.
Conversion may lose significant bits
Предупреждение этапа компиляции
(при преобразовании могут быть потеряны значащие биты)
В операции присваивания, или в других обстоятельствах, требуется преобразование типа long или unsigned long в int или
unsigned int. Поскольку переменные типов int и long имеют разный
размер, такое преобразование может привести к изменению работы
программы.
Conversion of near pointer not allowed
Сообщение об ошибке этапа компиляции
(преобразование ближнего указателя недопустимо)
Ближний указатель не может преобразовываться в дальний при
вычислении выражения, если программа в текущий момент не выполняется. Причина этого состоит в том, что для преобразования требуется знать текущее значение регистра DS программы пользователя,
которое в данный момент просто не существует. Это сообщение используется только в отладчике интегрированной среды.
Conversion operator cannot have a return type specification
Сообщение об ошибке этапа компиляции
( операция преобразования не может иметь спецификацию типа
возврата)
Функция-элемент преобразования типа С++ задает тип возврата,
отличный от самого типа. В описании функции преобразования
operator может не задаваться никакого типа возврата.
Conversion to тип will fail fo members of virtual base класс
Сообщение об ошибке этапа компиляции
(для элементов виртуального базового класса класс преобразование к указанному типу выполнить не удастся)
Данное предупреждение выводится в некоторых случаях, когда
указатель-элемент приводится к другому типу указателя-элемента,
если класс указателя-элемента содержит виртуальные базовые
классы, и использован параметр -Vv. Это означает, что если преобразуемый указатель-элемент указывает (во время преобразования) на
элемент класса класс, то преобразование выполнить нельзя, а результатом преобразования будет указатель-элемент со значением
NULL.
Could not allocate memory for per module data
Сообщение об ошибке утилиты TLIB
(невозможно выделить память для данных модулей)
Библиотекарь исчерпал доступную память.
Could not create list file имя_файла
Сообщение об ошибке утилиты TLIB
Библиотекарь не может создать для библиотеки файл списка.
Это может вызываться нехваткой места на диске.
Could not find a match for аргумент(ы)
Сообщение об ошибке этапа компиляции:
(не найдено соответствие аргументу (аргументам))
Не найдена функция С++ с параметрами, соответствующими заданным аргументам.
Could not find file имя_файла
Сообщение об ошибке этапа компиляции
(невозможно найти файл имя_файла)
Компилятор не может найти файл, заданный в командной строке.
Could not get procedure address from DLL имя_файла
Сообщение об ошибке утилиты TLINK
(невозможно получить адрес процедуры из указанной DLL)
Компоновщик не может получить из заданной DLL адрес процедуры. Убедитесь в корректности версии DLL.
Could not load DLL имя_файла
Сообщение об ошибке утилиты TLINK
(указанную DLL загрузить невозможно)
Компоновщик не может загрузить заданную DLL. Убедитесь, что
она включена в маршрут.
Could not write output
Сообщение об ошибке утилиты TLIB
(невозможно записать выходные данные)
Библиотекарь не может записать выходной файл.
Couldn't alloc memory for per module data
Сообщение об ошибке утилиты TLIB
(невозможно выделить память для данных модуля)
Библиотекарь исчерпал доступную память.
имя_файла couldn't be creates, original won't be changed
Предупреждающее сообщение об ошибке утилиты TLIB
(невозможно создать файл, содержимое исходного файла изменено не будет)
Предпринята попытка извлечь объект (действие '*'), но библиотекарь не может создать объектный файл, в который можно записать
выделяемый модуль. Либо объектный файл уже существует и доступен
только по чтению, либо диск переполнен.
Couldn't get LE/LIDATA record buffer
Сообщение об ошибке утилиты TLIB
(невозможно получить буфер LE/LIDATA)
Ошибка командной строки. См. сообщение out of memory reading
LE/LIDATA record from object module.
Couldn't get procedure address from DLL имя_файла
Сообщение об ошибке утилиты TLINK
(невозможно получить адрес процедуры из указанной DLL)
Компоновщик не может получить из заданной DLL адрес процедуры. Убедитесь, что DLL включена в маршрут.
Couldn't load DLL имя_файла
(указанную DLL загрузить невозможно)
Компоновщик не может загрузить заданную DLL. Убедитесь, что
она включена в маршрут.
Cycle in include files: имя_файла
Сообщение об ошибке утилиты MAKE
(цикл во включаемых файлах)
Формирующий файл включает в сценарии генерации сам себя.
Назад | Содержание | Вперед
CGA в режиме низкой разрешающей способности
В режиме низкой разрешающей способности вы имеете возможность выбрать одну из четырех четырехцветных палитр. В каждой из
этих четырех палитр вы можете сами установить только первый (цвет
0) элемент; цвета 1, 2 и 3 являются фиксированными. Первый элемент палитры (цвет 0) - это цвет фона. Этот цвет может являться
одним из 16 имеющихся цветов (см. таблицу цветов фона, приводимую
ниже).
Вы выбираете желаемую палитру, выбирая соответствующий режим
(CGAC0, CGAC1, CGAC2, CGAC3); эти режимы используют палитры цветов от 0 до 3, соответственно, как показано в следующей таблице.
Цвета вычерчивания в CGA и эквивалентные им константы определяются в graphics.h.
Константа, присвоенная номеру цвета (значению эл. изображения)
0 | CGA_LIGHTGREEN | CGA_LIGHTRED | CGA_YELLOW |
1 | CGA_LIGHTCYAN | CGA_LIGHTMAGENTA | CGA_WHITE |
2 | CGA_GREEN | CGA_RED | CGA_BROWN |
3 | CGA_CYAN | CGA_MAGENTA | CGA_LIGHTGRAY |
Для того, чтобы назначить один из этих цветов цветом вычерчивания CGA, нужно вызвать функцию setcolor, задав в ней в качестве аргумента либо номер цвета, либо имя соответствующей константы; например, если вы используете палитру 3 и желаете
назначить цветом вычерчивания cyan, то можно записать:
setcolor(1);
или
setcolor(CGA_CYAN);
В следующей таблице перечислены назначаемые для CGA цвета
фона:
0 | BLACK | 8 | DARKGRAY |
1 | BLUE | 9 | LIGHTBLUE |
2 | GREEN | 10 | LIGHTGREEN |
3 | CYAN | 11 | LIGTHCYAN |
4 | RED | 12 | LIGHTRED |
5 | MAGENTA | 13 | LIGHTMAGENTA |
6 | BROWN | 14 | YELLOW |
7 | LIGHTGRAY | 15 | WHITE |
Цвета CGA для переднего плана те же, что находятся в данной
таблице. Для назначения одного из этих цветов в качестве фонового
цвета служит функция setbkcolor(цвет), где цвет - это один из
элементов приведенной выше таблицы. Отметим, что для CGA цвет не
является значением элемента изображения (индексом в палитре). Он
прямо задает фактический цвет, помещаемый в первый элемент палитры.
CGA в режиме высокой разрешающей способности
В режиме высокой разрешающей способности (640x200) CGA работает с двумя цветами - черным цветом фона и цветным передним планом. Элементы изображения могут принимать при этом значения только 0 или 1. В связи с особенностями CGA цветом переднего плана
фактически является тот цвет, который аппаратное обеспечение считает цветом фона. Таким образом, цвет переднего плана устанавливается подпрограммой setbkcolor.
Цвет для переднего плана может быть выбран из предыдущей
таблицы. CGA далее будет использовать этот цвет для отображения
им всех элементов изображения, имеющих значение 1.
Режимы CGAHI, MCGAMED, MCGAHI, ATT400MED и ATT400HI работают
аналогичным образом.
Черчение и заполнение
Ниже приводится краткий обзор функций черчения и закраски:
arc | Чертит дугу окружности. |
circle | Чертит окружность. |
drawpoly | Чертит контур многоугольника. |
ellipse | Чертит эллиптическую дугу. |
getarccoords | Возвращает координаты последнего вызова
arc или ellipse. |
getaspectratio | Возвращает коэффициент сжатия для текущего графического режима. |
getlinesettings | Возвращает текущий тип линии, шаблон линии и толщину линии. |
line | Чертит линию из точки (x0,y0) в (x1,y1). |
linerel | Чертит линию в точку, задаваемую относительным расстоянием от текущей позиции (CP). |
lineto | Чертит линию из текущей позиции (CP) в
(x,y). |
moveto | Перемещает текущую позицию (CP) в (x,y). |
moverel | Перемещает текущую позицию (CP) на относительное расстояние. |
rectangle | Рисует прямоугольник. |
setaspectratio | Изменяет коэффициент сжатия по умолчанию. |
setlinestyle | Устанавливает толщину и тип текущей линии. |
bar | Чертит и закрашивает столбец. |
bar3d | Чертит и закрашивает трехмерный столбец. |
fillellipse | Чертит и закрашивает эллипс. |
fillpoly | Чертит и закрашивает многоугольник. |
getfillpattern | Возвращает определяемый пользователем шаблон закраски. |
getfillsettings | Возвращает информацию о текущем шаблоне и цвете закраски. |
pieslice | Чертит и закрашивает сектор окружности. |
sector | Чертит и закрашивает эллиптический сектор. |
setfillpattern | Выбирает шаблон закраски, определяемый
пользователем. |
setfillstyle | Устанавливает шаблон и цвет закраски. |
При помощи функций черчения и раскрашивания Borland C++ вы
можете вычерчивать цветные линии, дуги, окружности, эллипсы, прямоугольники, секторы, дву- и трехмерные столбики, многоугольники,
а также различные правильные или неправильные формы, являющиеся
комбинациями перечисленных графических примитивов. Ограниченную
форму изнутри или снаружи можно заполнить одним из 11 предопределенных шаблонов (образцов заполнителей), либо шаблоном, определенным пользователем. Можно также управлять толщиной и стилем линии вычерчивания, а также местоположением текущей позиции (CP).
Линии и незакрашенные формы вычерчиваются при помощи функций
arc, circle, drawpoly, ellipse, line, linerel, lineto и rectangle. Затем можно закрасить эти формы с помощью floodfil, либо можно объединить вычерчивание/закраску в одном шаге при помощи функций bar, bar3d, fillellipse, fillpoly, pieslice и sector. Функция
setlinestyle позволяет задать тип линий (и граничных линий форм):
толстая или тонкая, сплошная, пунктир и т.д., либо для вычерчивания линии можно задать ваш собственный шаблон. При помощи функции
setfillstyle можно выбрать предопределенный шаблон заполнения,
либо определить собственный шаблон заполнения в setfillpattern.
Функция moveto позволяет переместить CP в желаемую позицию, а
функция moverel позволяет сдвинуть ее на желаемую величину смещения.
Выяснить текущий тип и толщину линии позволяет функция
getlinesettings. Информацию о текущем шаблоне заполнения и цвете
заполнителя можно получить через функцию getfillsettings. Определяемый пользователем шаблон заполнения можно получить при помощи
функции getfillpattern.
Получить сведения о коэффициенте относительного удлинения
(коэффициенте масштабирования, применяемом графической системой
для того, чтобы окружности выглядели круглыми) позволяет функция
getaspectratio, а получить координаты последней нарисованной дуги
или эллипса - функция getarccoords. Если окружности не получаются
идеально круглыми, можно исправить дело при помощи функции setaspectratio.
Четвертый BORLAND С++ и его окружение
М.Вахтеров, С.Орлов, 1994 г.
Введение
Глава 1. Азы С++
Глава 2. Наставление пользователю по Borland C++ 4.0
Глава 3. Справочная информация по программированию
Глава 4. Справочник по работе с DOS
Глава 5. Наставление по отладчику Turbo Debugger 4.0
Глава 6. Краткий справочник по библиотеке Borland C++ 4.0
Глава 7. Наставление по Borland ObjectWindows for C++ 2.0
Число десятичных знаков
Вы можете задать, сколько десятичных знаков должно участвовать в преобразовании из двоичного типа в bcd. Это число является
вторым, необязательным аргументом в конструкторе bcd. Например,
для преобразования $1000.00/7 в переменную bcd, округленную до
ближайшего цента, можно записать:
bcd a = bcd(1000.00/7, 2)
где 2 обозначает два разряда после десятичной точки. Таким образом:
1000.00/7 = 142.85714
bcd(1000.00/7, 2) = 142.860
bcd(1000.00/7, 1) = 142.900
bcd(1000.00/7, 0) = 142.000
bcd(1000.00/7, -1) = 140.000
bcd(1000.00/7, -2) = 100.000
Округление происходит по банковским правилам, что означает
округление до ближайшего целого числа, причем в случае одинакового "расстояния" до ближайшего целого в прямую и обратную сторону
округление выполняется в сторону четного. Например:
bcd(12.335, 2) = 12.34
bcd(12.245, 2) = 12.34
bcd(12.355, 2) = 12.36
Такой метод округления задается стандартом IEEE.
Назад | Содержание | Вперед
Чтение и запись целых чисел
Старые потоки записывают данные типов int и unsigned как
двухбайтовые значения. Чтобы облегчить переход на 32-разрядные
платформы, новые потоки записывают значения int и unsigned как
4-байтовые значения. Новые потоки могут считывать старые потоки и
будут корректно обрабатывать 2-байтовые значения.
Старые потоки предусматривают две функции-элемента для чтения и записи целых значений:
void writeWord(unsigned);
unsigned readWord();
В новых потоках они изменились:
void writeWord(uint32);
uint 32 readWord();
Существующий програмный код, который использует эти функции,
после перекомпиляции и перекомпоновки будет продолжать работать
корректно, хотя вызов readWord будет генерировать предупреждения
о потере точности (когда возвращаемое значение в 16-разрядном
приложении присваивается переменной типа int или unsigned). Однако в новых программах этих функций следует избегать. В общем случае истинный размер записываемых данных вам вероятно известен,
поэтому библиотека потоков предусматривает теперь отдельные функции для каждого размера:
void writeWord16(uint16);
void writeWord32(uint32);
uint16 readWord16(uint16);
uint32 writeWord32(uint32);
Что такое драйвер устройства?
Драйвер устройства - это набор подпрограмм, используемых
операционной системой DOS для управления на нижнем уровне функциями ввода-вывода. Устанавливаемые драйверы устройств (в отличие
от драйверов, встроенных в DOS) устанавливаются с помощью включения соответствующих строк, например:
device = clock.sys
в файл CONFIG.SYS. Когда DOS выполняет операцию ввода-вывода для
отдельного символа, она просматривает связанный список заголовков
устройств, выполняя поиск устройства с соответствующим логическим
именем (например, COM1). В случае драйверов блочно-ориентированных
устройств, таких, как драйвер диска, DOS отслеживает, сколько установлено драйверов блочно-ориентированных устройств, и обозначает каждый из них буквой: A - первый установленный драйвер устройства, B - второй и т.д. Когда вы, например, ссылаетесь на
дисковод C, DOS знает, что нужно вызвать драйвер третьего блочно-ориентированного устройства.
Связанный список двух заголовков драйвера содержит смещение
двух компонентов самого драйвера устройства: подпрограмму функции
и подпрограмму обработки прерывания.
Когда DOS определяет, что требуется вызвать данный драйвер
устройства, она вызывает драйвер дважды. При первом вызове драйвера DOS общается с подрограммой функции и передает ей указатель
на буфер в памяти, который называется заголовком запроса. Этот
заголовок запроса содержит информацию о том, какие функции требует выполнить DOS от драйвера устройства. Подпрограмма функции
просто сохраняет данный указатель для последующего использования. При втором вызове драйвера устройства DOS вызывает подпрограмму обработки прерывания, которая выполняет реальные функции, заданные DOS в заголовке запроса, например, пересылку
символов с диска.
В заголовке запроса с помощью байта, который называется кодом команды, определяется, что должен делать драйвер устройства.
Код команды определяет одну из предопределенных операций из набора операций, которые должны выполнять все драйверы устройств. Набор кодов команд (операций) для драйверов символьно-ориентированных и блочно-ориентированных устройств различен.
Проблема при отладке драйверов устройств состоит в том, что
файл .EXE отсутствует, так как для выполнения соответствующих
функций драйвер должен быть загружен во время загрузки системы с
помощью команды DEVICE = DRIVER.EXT, где EXT - это расширение
.SYS, .COM или .BIN. Это означает, что отлаживаемый драйвер устройства уже резидентен в памяти до начала отладки. Следовательно,
функции по выполнению загрузки и перемещения таблицы идентификаторов весьма полезны, поскольку они могут восстановить информацию
об идентификаторах для дизассемблированного сегмента памяти (когда драйвер загружен). Как мы увидим далее, команда File Resident
также очень полезна.
Что такое поток?
Потоком называется абстрактное понятие, относящееся к любому
переносу данных от источника (или поставщика данных) к приемнику
(или потребителю) данных. Когда речь идет о вводе символов от источника, используются также синонимы извлечение, прием и получение, и вставка, помещение или запоминание, когда речь идет о выводе символов в приемник. В качестве источников и приемников данных (или и того и другого) существуют классы для поддержки буферов памяти (iostream.h), файлов (fstream.h) и строк (strstream.h).
Что такое резидентная программа?
Резидентными (TSR) называют такие программы, которые остаются в оперативной памяти после того, как они завершат управление.
В Borland Си и С++, предусмотрена специальная функция geninterrupt, которая выдает такое программное прерывание.
Резидентная программа состоит из двух частей - рабочей части
и резидентной части. Рабочая часть выполняет загрузку резидентной
части в память и устанавливает вектор прерываний, который определяет характер вызова резидентной в памяти программы. Если резидентная программа должна вызываться с помощью программного прерывания, то рабочая часть программы помещает адрес резидентной части кода в соответствующий вектор прерывания. Если резидентная
программа должна вызываться с помощью оперативной клавиши, то резидентная часть должна модифицировать обработчик прерывания DOS
для обработки нажатия соответствующих клавиш (клавиши) на клавиатуре.
Когда рабочая часть завершает выполнение, она вызывает функцию DOS, которая позволяет части файла .EXE оставаться резидентной в оперативной памяти после завершения выполнения программы.
Рабочая часть резидентной программы знает размер резидентной части, а также ее адрес в памяти, и передает эту информацию DOS.
Операционная системе DOS при этом резервирует специальный блок
памяти, но может свободно записывать информацию в незащищенную
часть памяти. Таким образом, резидентная часть остается в памяти,
а рабочая часть может быть "затерта".
Тонкость отладки резидентных программ состоит в том, что вы
должны иметь возможность отлаживать и резидентную, и рабочую
часть программы. Когда выполняется файл .EXE, то выполняется
только код рабочей части TSR. Поэтому, когда вы как обычно запускаете отладчик, задав имя файла, вы видите выполнение только рабочей части кода программы: то, как он устанавливает резидентную
часть и обработчики прерываний. Чтобы отлаживать резидентную
часть, вы должны задать точку останова и сделать резидентным сам
отладчик.
Что же такое объекты?
Начнем с того, что объекты можно сравнить, отвлеченно, с объектами физического мира - компьютерами, автомобилями, электронными платами. Они обладают свойствами, такими, как, например, размер, производительность. Детали автомобиля, компьютера можно использовать многократно. Стандартные элементы позволяет разработчику сосредоточиться над стоящей перед ним задачей вместо того, чтобы заново изобретать
средства для ее решения.
Наши объектно-ориентированные объекты - это объединение функций
и данных (включая простые переменные и структуры) в виде независимой
конструкции. Эти конструкции - строительные блоки вашей программы.
Ниже приведены простые примеры объектов:
Window: Bank:
int x, y, wd, ht; double savings;
void draw(); void deposit();
void hide(); double withdraw();
Объекты подобны миниатюрным программам. Они содержат и данные, и
функции, которые в терминологии ООП называются методами. (В С++ функции класса называются функциями-элементами или, как их еще называют,
- функциями-членами.)
Замечание: В других объектно-ориентированных языках классы часто называются объектами, функции элементы - методами, а элементы данных - полями.
Данные обычно специально "упрятываются" и могут принимать значения, от (для) функций-элементов объектов.
Объект Сбербанк
Sber_bank
< deposit << "Вклад $999"
$$$ < > Функции-элементы Передаваемые сообщения
Данные > Withdraw < > << "Снять $5555"
>> $$$ Деньги!
class sber_bank { // Объявление класса
public: // Упрятывание управления данными
double big_bucks; // Элемент данных
void deposit(double bucks); // Функция-элемент
double withdraw(double bucks); // Еще одна функция-элемент
};
Цвет фона и вычерчивания
Цвет фона всегда соответствует значению элемента изображения
0. Когда выполняется очистка области экрана в цвет фона, это означает просто установку всех элементов изображения этой области в
значение 0.
Цветом вычерчивания (цветом переднего плана) называется значение, в которое устанавливаются элементы изображения при вычерчивании линий. Цвет вычерчивания устанавливается функцией
setcolor(n), где n есть допустимое для текущей палитры значение
элемента изображения