Выполнение и отладка программы
Компиляция и сборка программы выполняется командами меню Project:
Compile Unit (комбинация клавиш Alt+F9) – компиляция модуля, создается объектный файл UnHello.obj;
Make PrHello (или Ctrl+F9) – сборка программы из откомпилированных модулей;
Build PrHello – сборка программы с перекомпиляцией всех модулей.
После выполнения команд Make или Build создается исполняемая программа PrHello.exe, имя которой совпадает с именем проекта.
Для запуска программы нужно выполнить команду Run, Run или нажать клавишу F9. При выполнении рассматриваемой программы будет создано текстовое окно, в которое выведутся результаты работы, рис.18. После нажатия клавиши Enter работа программы завершается и ее окно закрывается.
Рис.18. Работа консольного приложения
Пошаговое выполнение (трассировку) программы можно производить командами меню Run:
Step over или F8 – выполнение одной строки программы без захода в функции;
Run, Trace into или F7 – выполнение одной строки программы с заходом в функции, вызываемые в выполняемой строке;
Run, Go to cursor или F4 – выполнение программы до точки расположения курсора;
Run, Program reset или Ctrl+F2 – выход из режима отладки;
Add Watch или Ctrl+F5 – добавление переменной или выражения для просмотра.
Окно для наблюдения за переменными и выражениями выводится командой View, Debug Windows, Watches или Ctrl+Alt+W.
Файлы проекта
В состав проекта для программы 3 войдут файлы:
UnHello.cpp – файл с программным кодом;
PrHello.bpr – файл с описанием проекта;
UnHello.obj – файл, содержащий машинные команды (объектный);
PrHello.exe – рабочая программа.
Кроме этого, автоматически будут созданы файлы:
PrHello.bpf – текстовый файл с описанием проекта;
PrHello.res – двоичный файл ресурсов проекта;
PrHello.tds – двоичный файл c отладочной информацией;
*.~cp, *.~bpr, *.~h – резервные копии соответствующих файлов.
Основными файлами являются файлы: *.bpr, *.bpf, *.res, *.cpp, *.h. Только они необходимы при переносе программ с компьютера на компьютер. Остальные файлы можно безболезненно удалять с диска, так как они при компиляции всякий раз создаются заново.
В программу могут входить несколько cpp-файлов. Тот из них, который содержит функцию main, называют головным модулем проекта. В рассматриваемом примере головным модулем является файл UnHello.cpp.
Автоматическая генерация кода
Из рассмотренного примера видно, что стандартные элементы программного кода C++ Builder генерирует автоматически, в частности, создает простейший вариант главной функции программы main. Также автоматически выполняются действия по созданию файла проекта, нужно только правильно сохранять проект.
В исходный код включаются директивы препроцессора, которые рационализируют процесс создания программы. Рассмотрим их.
В программу часто входят весьма большие заголовочные файлы, многократная перекомпиляция которых не нужна и занимает много времени. Если в настройках среды в диалоге Project, Options, вызываемом командой меню Project, Options…, выбран переключатель Use pre-compiled headers, то заголовочные файлы компилируются только один раз и в откомпилированном виде записываются на диск. Директива
#pragma hdrstop
завершает список заголовочных файлов, подлежащих предварительной компиляции.
Директива
#pragma argused
подавляет вывод предупреждения о том, что аргументы функции, следующей за этой директивой, не используются. Если удалить (или закомментировать) эту директиву (рис. 16), компилятор выдаст предупреждение о том, что нигде не используются аргументы функции main:
[C++ Warning] UnHello.cpp(16): W8057 Parameter 'argc' is never used
[C++ Warning] UnHello.cpp(16): W8057 Parameter 'argv' is never used
Здесь 16 – номер последней строки функции main, в пределах которой обнаружена данная неточность.
Особенности ввода и вывода
Попытаемся напечатать приветствие по-русски.
#include <iostream.h>
int main(int argc, char* argv[])
{
cout << "Здравствуй, Мир!";
cin.get();
return 0;
}
Программа выведет:
╟фЁртёЄтєщ, ╠шЁ!
Непонятный набор символов вместо русских букв выводится потому, что при вводе текста программы и при ее выполнении используются разные кодовые таблицы с различной кодировкой русских букв. Windows-программы, в том числе и C++ Builder, используют кодовую таблицу 1251, исполняется же консольная программа в текстовом окне, где применяется кодовая таблица 866 операционной системы DOS. Чтобы правильно отображать русские буквы при работе программы, необходимо делать перекодировку из кодовой таблицы 1251 в кодовую таблицу 866. Для этого можно применять функцию
bool CharToOem(char* in, char* Buff);
которая переводит строку символов in в строку Buff, используя кодировку, принятую в среде исполнения программы. В нашем случае средой выполнения программы является окно DOS, поэтому будет использована соответствующая кодировка русских букв. Для доступа к функции
CharToOem в программу нужно включить заголовочный файл windows.h.
Напишем вспомогательную функцию Rus для упрощения преобразования:
#include <windows.h> // Для доступа к CharToOem
char Buff[500]; // Буфер для преобразованной строки
char* Rus(char* in) // Функция для преобразования русских букв
{
CharToOem(in, Buff); // Функция CharToOem преобразует строку in
return Buff; // в строку Buff, используя кодировку DOS
}
#pragma hdrstop
#pragma argsused
#include <iostream.h>
int main(int argc, char* argv[])
{
cout << Rus("Здравствуй, Мир!");
cin.get();
return 0;
}
Эта программа, как и ожидалось, напечатает:
Здравствуй, Мир!
Функцию Rus нельзя применять в цепочках печати вида:
cout << Rus(”Здравствуй,” << Rus(” Мир!");
так как в этом случае будет напечатано:
Здравствуй, Здравствуй,
Для печати нескольких строк по-русски каждую строку можно выводить отдельным оператором:
cout << Rus(”Здравствуй,”;
cout << Rus(” Мир!");
В дальнейшем дополнительно не будем обговаривать, как организовывать вывод на русском языке.