Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка по Visual Studio 2008

.pdf
Скачиваний:
300
Добавлен:
27.03.2015
Размер:
6.26 Mб
Скачать

Рис. 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