В данном разделе кратко описывается программирование в среде
Windows и Win32, и описывается, как можно перенести в эти среды
программы. Такой перенос позволит компилировать ваши программы в
16- и 32-разрядной версии Windows.
32-разрядные инструментальные средства Borland C++ обеспечивают создание 32-разрядных файлов .OBJ и .EXE в формате переносимых выполняемых файлов PE. Это формат выполняемого файла для
программ Win32 и Windows NT.
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 имя
Сообщение об ошибке этапа компиляции
(неоднозначное имя элемента)
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 нужные
действия.
| Version Number | Задает номер версии проекта, который
выводится в диалоговом окне Help About. Эта информация сохраняется в файле .RC проекта. |
| Copyright | Определяет информацию об авторских
правах, которая выводится в диалоговом окне About. |
| Description | Описывает приложение и выводит текст
в окне Help About приложения. По умолчанию это имя проекта. |
| Author | Фамилия программиста, генерирующего
исходный код. Используется в комментариях сгенерированного кода. |
| Company | Название фирмы, где работает программист. Используется в комментариях сгенерированного кода. |
| Start Up | Задает начальное состояние основного окна приложения:
Normal - задает используемый по умолчанию размер (определяется значением WS_NORMAL). Minimized - запуск в виде пиктограммы в оперативной области Windows. Maximized - заполняет при запуске всю оперативную область Windows. |
| Control Style | Определяет, какой тип управляющих
элементов использует приложение: Windows - стандартные управляющие элементы Windows. BWCC - использует специализированные управляющие элементы Borland. 3D - трехмерные управляющие элементы Windows. |
| Target Name | Определяет имя создаваемого проекта как базовое для используемых по умолчанию имен и других элементов проекта. |
| Base Directory | Задает маршрут базового каталога, в котором находятся все подкаталоги проекта. Все маршруты в проекте определяются относительно этого каталога. Имя данного каталога передается администратору проекта в качестве новой цели AppExpert. Заданным по умолчанию значением для базового каталога является каталог родительского узла проекта, определенный в администраторе проекта. |
| Help File Support | Генерирует исходные файлы справочника
Help (.RTF) и файл проекта Help (.HPJ). Файл проекта Help добавляется к проекту администратора проекта и автоматически формируется с целевым приложением. Исходный файл Help содержит шаблонный текст для элементов меню приложения. |
| Help File Name | Именует связанные с приложением справочные файлы. |
| 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 | Документирует генерируемый код частично или полностью. |
| 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.
| () [] -> :: . ! ~ - ++ -- & * (приведение типа) | Слева-направо |
| sizeof new delete | Справа-налево |
| .* ->* | Слева-направо |
| * / % | Слева-направо |
| + - | Слева-направо |
| << >> | Слева-направо |
| < <= > >= | Слева-направо |
| == != | Слева-направо |
| & | Слева-направо |
| ^ | Слева-направо |
| | | Слева-направо |
| && | Слева-направо |
| || | Слева-направо |
| ?:(условное выражение) | Справа-налево |
| = *= /= := += -= &= ^= |= <<= >>= | Справа-налево |
| , | Слева-направо |
После загрузки программы TDW автоматически определяет, нужно
ли пересылать программу на удаленную систему. В отношении загрузки программы в удаленную систему отладчик отличается гибкостью.
Сначала он проверяет наличие программы на удаленной системе. Если
программы там нет, он передает ее. Если программа на удаленной
системе имеется, он анализирует дату и время копии программы на
локальной системе и удаленной системе. Если копия на локальной
системе более поздняя (новая), чем на удаленной, он предполагает,
что вы перекомпилировали и перекомпоновали программу и передает
ее по линии связи. Учтите однако, что TDW передает только файлы
.EXE.
Назад | Содержание | Вперед
Система Borland C++ ориентирована также на использование
утилиты MAKE в целях автоматической проверки зависимостей для
включаемых файлов. Компиляторы BCC и BCC32 создают объектные файлы, которые содержат используемую утилитой MAKE информацию о всех
файлах включения, необходимых для создания объектного файла. Параметр командной строки -a утилиты MAKE проверяет эту информацию,
чтобы удостовериться в "современности" всех используемых файлов.
Когда утилита MAKE осуществляет автоматическую проверку зависимостей, она считывает имена файлов включения, а также время и
дату создания объектных файлов. Если какой-либо включаемый файл
был модифицирован, утилита MAKE осуществляет перекомпиляцию для
обновления объектного файла.
Когда в поле ввода выводится подсказка для ввода имени идентификатора, вы можете набрать часть имени, а затем нажать Ctrl+N.
Turbo Debugger заполнит остальную часть имени автоматически. При
этом набранная часть должна уникальным образом идентифицировать
имя. Если с набранных символов не начинается ни одно из имен, то
ничего не происходит. При наличии нескольких идентификаторов, соответствующих набранным вам символам, выводится список имен, из
которого вы можете выбрать нужное.
При разрешении автоматического создания дочерний объект создается одновременно с родительским. Чтобы исключить дочернее окно
из механизма автоматического создания и вывода, вызовите в конструкторе дочернего объекта функцию-элемент DisableAutoCreate.
Обратное действие выполняет EnableAutoCreate. По умолчанию автоматическое создание разрешено для всех классов кроме диалоговых
блоков.
Настоящий "мгновенный" курс C++ в сжатой и всеобъемлющей форме
представляет программирование на С++, прежде всего, для программистов, владеющих основами традиционного Си, и дает возможность совершить быстрый переход к С++.
При отсутствии опыта работы с Cи и С++, возможно, по-началу, могут показаться трудными новые концепции, обсуждаемые здесь, но разбор
(и эксперименты) с примерами помогут прояснить картину. Прежде, чем
начать работу, окружите себя уже имеющимися у Вас учебными пособиями
и руководствами по С++. Возможно одно из них пригодится для более детального изучения С++.
Несмотря на то, что каждая тема с помощью примеров и подробных
разъяснений раскрывает основные идеи языка, для желающих стать настоящими хакерами рекомендуется дополнительно проработать книги Страуструпа.
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
Сообщение об ошибке этапа компиляции
Базовые параметры определяют, куда будет записываться сгене-
рированный код, и управляет поддержкой справочных файлов.
Базовые параметры управляют общим видом основного окна при-
ложения.
Базовые параметры определяют используемые по умолчанию параметры дочернего окна MDI.
Абстрактный класс TValidator - это базовый класс, из которого получаются все объекты проверки допустимости. Все его функции-элементы всегда возвращают значения True, а Error не выполняет никаких действий. Чтобы определять, какие значения являются
допустимыми, производные классы должны переопределять функции IsValid, IsValidInput и Error.
Библиотека INCLUDE\CLASSLIB содержит файлы заголовков, необходимые для компиляции программы, которая использует классы контейнеров. Для каждого ADT или FDS в этом каталоге имеется соответствующий файл заголовка. Убедитесь, что вы включили INCLUDE в
маршрут доступа и явно ссылаетесь на файл заголовка.
Библиотека 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 позволяет уменьшить объем файла .EXE, экономит системную
память и обеспечивает большую гибкость при изменении и расширении
приложений. DLL - это библиотека выполняемых модулей, содержащая
функции или ресурсы, используемые приложениями или другими DLL.
DLL не имеет основной функцией, которая обычно служит точкой входа в основную программу. DLL содержит несколько точек входа, по
одной на каждую экспортируемую функцию. При загрузке DLL операционной системой она (одна ее копия) может совместно использоваться
несколькими приложениями. Для полного понимания DLL полезно понимать, чем отличаются статическая и динамическая компоновка.
Ниже представлен краткий обзор библиотечных программ Borland
С++, доступных только для 16-разрядных приложений DOS. Библиотечные подпрограммы состоят из функций и макрокоманд, которые можно
вызывать в программах Си и С++ для выполнения различных задач,
включая ввод-вывод различного уровня, работу со строками и файлами, распределение памяти, управление процессом, преобразование
данных, математические вычисления и др.
В данном разделе вы найдете имена библиотек из файлов в подкаталоге LIB с описанием их использования, а также представленные
по категориям библиотечные подпрограммы (в соответствии с типом
выполняемых ими задач).
При использовании DLL вы должны дать компоновщику определения функций, которые хотите импортировать из DLL. Эта информация
временно удовлетворяет внешние ссылки на функции, вызываемые компилируемым кодом, и сообщает загрузчику Windows, где найти функции на этапе выполнения. Сообщить компоновщику о функциях импорта
можно двумя способами:
Вы можете добавить секцию IMPORT в файл определения модуля
и перечистить все функции DLL, которые будет использовать
данный модуль.
Включить библиотеку импорта для DLL можно при компоновке
модуля.
Библиотека импорта содержит определения импорта для всех или
некоторых экспортируемых функций для одной или более DLL. Утилита
IMPLIB создает для DLL библиотеки импорта. IMPLIB создает библиотеки импорта непосредственно из DLL или из файлов определения модуля DLL (либо из их комбинации).
В приложениях DOS используются статические библиотеки исполняющей системы (OBJ и LIB). Эти приложения описаны в данном разделе. Дополнительные библиотеки вы найдете в справочнике по библиотекам.
Существует несколько версий библиотеки исполняющей системы.
Это версии для конкретных моделей памяти и диагностические библиотеки. Имеются также дополнительные библиотеки, обеспечивающие
контейнеры, графику и математические операции. При выборе используемых библиотек исполняющей системы следует иметь в виду что перечисленные ниже библиотеки используются только в 16-разрядных
приложениях 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.
Сейчас наша программа на языке Си стала выглядеть более объектно-ориентированной. Однако, есть маленькая неточность, все указатели
оказываются разименованными. Например, посмотрите на фрагмент текста
из функции decompressor_next():
dc->c = *(dc->p)++; /* Обработка следующего символа буфера */
if (dc->c == 0xff) {
dc->rcnt = (*(dc->p)++)-1; /* Сброс первого символа в записи */
dc->c = *(dc->p)++; /* Здесь повторить символ */
dc->srclen -= 2;
}
Это довольно безобразный текст. Можем ли мы его исправить? Конечно, для этого нужно использовать Турбо и Borland С++.
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 недопустима.
В режиме низкой разрешающей способности вы имеете возможность выбрать одну из четырех четырехцветных палитр. В каждой из
этих четырех палитр вы можете сами установить только первый (цвет
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 цвет не
является значением элемента изображения (индексом в палитре). Он
прямо задает фактический цвет, помещаемый в первый элемент палитры.
В режиме высокой разрешающей способности (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).
М.Вахтеров, С.Орлов, 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 есть допустимое для текущей палитры значение
элемента изображения