Методичка по Visual Studio 2008
.pdfРис. 7. Добавление файла исходного кода в проект
Шаг 5. В окне Добавление нового элемента выберите категорию Visual C++, шаблон Файл C++ (.cpp) и введите имя файла, как пока- зано на рис. 8.
Рис. 8. Настройка параметров элемента, добавляемого в проект
11
Шаг 6. В окне редактора кода с именем example1.cpp наберите приведенный ниже текст программы (пример 1 и рис. 9).
Пример 1. Программа на языке C/C++ с вводом и выводом в кон-
сольном окне
#include <stdio.h> /* подключение scanf_s и printf_s */
#include <conio.h> /* подключение _getch */ #include <locale.h> /* подключение setlocale */
void main()
{
//установка поддержки русского языка setlocale(LC_CTYPE, "Russian");
int a = 0;
printf_s("Введите число a: "); // вывод на экран scanf_s("%d", &a); // ввод с клавиатуры
const int b = 7; int c;
if (0 == a % 2) { c = a + b;
printf_s("Число a – четное, c = %d\n", c);
}
else {
c = a * b;
printf_s("Число a – нечетное, c = %d\n", c);
}
_getch(); // ожидание ввода с клавиатуры
}
ЗАМЕЧАНИЕ. В данной работе в приведенных примерах программ использу- ются усовершенствованные версии функций ввода и вывода – scanf_s и printf_s, которые поддерживаются Visual Studio 2008. Эти функции отсутст- вуют в стандартной библиотеке языка C/C++, поэтому для создания приложений, компилируемых в других средах разработки, целесообразно использовать обычные функции scanf и printf.
12
Шаг 7. Выберите в меню Построение команду Построить решение для того, чтобы скомпилировать программу.
Шаг 8. Выберите в меню Отладка ► Начать отладку. Через неко- торое время после этого на экране должно появиться окно консоли, показанное на рис. 10.
Шаг 9. Введите какое-нибудь число (может потребоваться перед этим сначала щелкнуть на окне консоли, чтобы сделать его активным), дождитесь вывода результата работы программы (рис. 11), а затем на- жмите любую клавишу, чтобы выйти из приложения.
Рис. 9. Текст программы в редакторе кода Visual Studio
Рис. 10. Окно консольного приложения
13
Рис. 11. Результат выполнения программы
КОМПИЛЯЦИЯ ПРОГРАММЫ В VISUAL STUDIO. ИСПРАВЛЕНИЕ СИНТАКСИЧЕСКИХ ОШИБОК
Компиляцией программы называется преобразование программой- компилятором (входящей в состав Visual Studio) исходного текста про- граммы, написанного на языке программирования (например, на C или C++), в объектный файл.
Объектный файл (также – объектный модуль, англ. object file) –
файл с промежуточным представлением отдельного модуля програм- мы, полученный в результате обработки исходного кода компилято- ром. Объектный файл содержит в себе особым образом подготовлен- ный код (часто называемый бинарным), который обрабатывается
компоновщиком.
Компоновщик (редактор связей – от англ. link editor, linker) –
программа, которая производит компоновку – принимает на вход один или несколько объектных модулей и собирает по ним готовый испол- нимый файл.
Исполнимый (исполняемый) файл (также исполнимый модуль,
англ. executable file) – это разновидность файла, содержимое которого
является готовой к непосредственному исполнению компьютерной программой.
Таким образом, в процессе создания исполняемого файла програм- мы можно выделить два этапа: компиляцию и компоновку. Если в ходе
компиляции или компоновки не обнаруживаются ошибки в исходном
14
тексте программы, то бывает, что процесс формирования исполняемо- го файла проходит для пользователя незаметно.
Однако часто в программах содержатся ошибки. Некоторые из этих ошибок автоматически обнаруживаются средствами VS. После обна-
ружения ошибки процесс сборки исполняемого файла прерывается и выдается соответствующее диагностическое сообщение для пользова- теля. Такие программные ошибки (фатальные для процесса сборки приложения) можно разделить на две категории: синтаксические (или
времени компиляции) и ошибки компоновки.
Синтаксические ошибки – это ошибки, обнаруживаемые во время
компиляции исходного текста программы и связанные с нарушениями каких-либо грамматических или синтаксических правил языка про- граммирования. Ошибки компоновки – это ошибки, обнаруживаемые во время объединения компоновщиком объектных файлов для получе- ния исполняемого файла.
Рассмотрим автоматическое обнаружение указанных видов ошибок на отдельных примерах. Для этого создадим консольное приложение спосо- бом, указанным в предыдущем разделе (выполните шаги с 1 по 5). Далее на шаге 6 в окне редактора кода наберите приведенный ниже текст програм- мы (см. пример 2). Затем выполните сборку приложения (шаг 7), выбрав в меню Построение ► Построить решение. После этого в окне Вывод
должны появиться сообщения об обнаруженных ошибках (рис. 12).
Для более удобной работы со списком ошибок в VS предусмотрено окно Список ошибок, которое можно открыть, выбрав в меню Вид ► Другие окна ► Список ошибок. В открытом окне Список ошибок два-
жды щелкните по первой обнаруженной ошибке и убедитесь, что при этом в редакторе кода курсор переместится на строку с ошибкой (рис. 13).
СОВЕТ. Полезно просматривать список ошибок, начиная с первой, потому что одна-единственная ошибка может вызвать цепную реак- цию, появление «наведенных» ошибок. Исправление этой единственной ошибки приведет и к исчезновению остальных. Однако ограничивать- ся исправлением только одной ошибки все же не стоит, поскольку вы будете терять время на повторную сборку решения (а оно может составлять в серьезных приложениях до нескольких часов!). С опы- том вы научитесь легко отличать «наведенные» ошибки от реальных.
Как видно из рис. 13, сообщение об ошибке содержит номер ошиб- ки (в классификации ошибок компиляции) и краткое ее описание. Бы- вает, что диагностической информации компилятора недостаточно, чтобы понять суть ошибки, и в таких случаях следует искать ее более подробное описание.
15
Как правило, во встроенной справочной системе VS можно найти исчерпывающее описание ошибки, возможных причин ее возникнове- ния и способов ее исправления, а также примеры программ с ошибка- ми такого же типа (и номера). Для получения справочной информации достаточно нажать клавишу F1 на текущей ошибке в окне Список ошибок или в окне Вывод, в результате чего должно появиться окно справочной системы с описанием ошибки, как показано на рис. 14.
Пример 2. Программа для преобразования массива, содержащая в
своем тексте ошибки
//Дан массив размера N из различных целых чисел.
//Ввести элементы массива с клавиатуры. Затем обнулить
//те элементы, массива которые расположены между его
//минимальным и макcимальным элементами (не включая
//эти минимальный и максимальный элементы)
#include <stdio.h> #include <locale.h>
const int Nmax = 10;
void main()
{
int a[Nmax], N = 0 /* Ошибка cинтаксиса: отсутсвует ; в конце объявления переменных */
setlocale(LC_CTYPE, "Russian"); printf_s("Введите размер массива N: ");
scnf_s("%d", &N); /* Ошибка cинтаксиса: неверное имя функции (должно быть scanf_s) */
printf_s("ВВОД элементов массива a:\n"); for (int i = 0; i < N; i++) {
printf_s("Введите элемент a[%d]: ", i); scanf_s("%d", &a[i]);
/* Ошибка синтаксиса: нет закрывающей скобки } */
//Поиск максимального и минимального элементов int iMax = 0, iMin = 0;
for (int i = 1; i < N; i++) { if (a[iMax] < a[i]) iMax = i; else
if (a[iMin] > a[i]) iMin = i;
}
16
//Обнуление элементов массива между
//максимальным и минимальным его элементами
i1 = iMin; /* Ошибка cинтаксиса: не объявлен тип переменной i1 (должно быть int i1 = iMin) */
int i2 = iMax;
if (iMin > iMax) {
i1 = iMax; i2 = iMin;
}
for (int i = i1; i < i2; i++) /* Логическая ошибка:
должно быть i = i1 + 1 */
a[i] = 0;
printf_s("ВЫВОД элементов массива a:\n"); for (int i = 0; i < N; i++)
printf_s("элемент a[%d] = %d\n", i, a[i]);
_getch(); /* Ошибка синтаксиса: в программе отсутсвует описание функции _getch() */
}/* Чтобы исправить ошибку, добавьте
вначало программы #include <conio.h> */
Рис. 12. Окно Вывод с сообщениями об ошибках компиляции
17
Рис. 13. Окно Список ошибок
Просмотрите весь список обнаруженных компилятором ошибок и ознакомьтесь с их подробным описанием в справочной системе. Точно установите строки текста программы, содержащие ошибки (для этого
следует дважды щелкнуть по ошибке в списке и курсор в редакторе кода переместится на строку с ошибкой). Используя полученную ин- формацию (и указания в комментариях в тексте программы), исправьте ошибки, а затем перекомпилируйте программу. Если все синтаксиче- ские ошибки были исправлены, то компиляция пройдет успешно и бу- дет собран исполняемый файл.
18
Рис. 14. Окно справочной системы с описанием ошибки
Проверьте работу программы, запустив ее на выполнение командой меню Отладка ► Начать отладку (или нажав клавишу F5). На рис. 15 показан пример ввода-вывода программы, из которого видно, что программа, хотя и работает, но выдает неверный результат, по- скольку максимальный элемент массива тоже обнуляется. Это значит, что в коде программы содержится ошибка, которую автоматически не удалось обнаружить. Средства поиска такого рода ошибок (называе- мых логическими) будут рассмотрены в следующем разделе.
Теперь рассмотрим пример ошибки, которая обнаруживается на этапе компоновки объектных файлов в исполняемый файл. Представ- ленная ниже программа (пример 3) должна выводить сообщение о том, является ли введенное целое число четным или нечетным. В процессе компиляции этой программы ошибок не будет обнаружено, поскольку
вся необходимая компилятору информация о функции isEven дана в прототипе (имя функции, тип возвращаемого ею значения, количество, имена и типы ее формальных параметров).
19
Введите размер массива N: 6 ВВОД элементов массива a: Введите элемент a[0]: 2 Введите элемент a[1]: 5 Введите элемент a[2]: 3 Введите элемент a[3]: 1 Введите элемент a[4]: -1 Введите элемент a[5]: 4 ВЫВОД элементов массива a: элемент a[0] = 2
элемент a[1] = 0 элемент a[2] = 0 элемент a[3] = 0 элемент a[4] = -1 элемент a[5] = 4
Рис. 15. Ввод-вывод программы обработки массива целых чисел (см. пример 2)
Однако на этапе сборки компоновщику потребуется определение функции isEven, которое отсутствует (закомментировано) в про- грамме, что вызовет появление соответствующего диагностического сообщения (рис. 16). Обратите внимание, что идентификатору isEven
в диагностическом сообщении предшествует ключевое слово __cdecl. Так компоновщик сообщает о ненайденном декорирован- ном имени функции (?isEven@@YAHH@Z), иногда называемом сигна- турой, и соответствующим образом определенной библиотечной про- цедуре. Внимательное изучение содержимого окна Вывод (рис. 17) показывает, что программа действительно успешно скомпилировалась,
афатальная ошибка произошла при компоновке.
Спомощью встроенной справочной системы можно получить (на- жав F1 на выделенном сообщении об ошибке) общее описание данного типа ошибок и советы по их исправлению (рис. 18).
Для того чтобы исправить ошибку в нашем случае, достаточно уб- рать знак комментария с последней строки кода в данной программе,
после чего следует повторно сделать сборку приложения и проверить его работу.
20