Чтение ошибок
Ошибки — нормальная часть программирования. Их делают каждый день даже опытные программисты. Важно быстро их находить и исправлять, и в этом помогают сообщения об ошибках.
Прежде чем запустить программу, компилятор просматривает её целиком. Найдя ошибку, он вообще не запускает программу, даже строки до ошибки, и показывает красное сообщение об ошибке. Например, в этой программе на строке 4 не хватает точки с запятой:
#include <stdio.h>
int main(void) {
printf("Привет!\n")
printf("Как дела?\n");
return 0;
}Clang, компилятор на этом сайте, выводит:
main.c:4:30: error: expected ';' after expression
4 | printf("Привет!\n")
| ^
| ;
1 error generated.Важнее всего первая строка сообщения. Читайте её слева направо:
main.c— имя файла с программой, того, что открыт в редакторе.4— номер строки с ошибкой. Номера строк видны слева в редакторе.30— номер столбца: какой по счёту символ в строке. Четыре пробела в начале строки тоже считаются. Русские буквы Clang считает за два символа (в файле каждая занимает два байта), поэтому в строке с ними номер столбца получается немного больше, чем вы насчитаете символов. Значок ^ при этом всегда указывает на правильное место.error:— это ошибка. После него идёт описание по-английски:expected ';' after expressionозначает, что компилятор ожидал;после выражения, здесь — послеprintf(...).
Ниже Clang показывает строку с ошибкой и отмечает место значком ^. Часто он даже пишет, чего там не хватает, здесь — ;. Последняя строка, 1 error generated., сообщает, сколько ошибок нашёл Clang.
Сообщение выглядит немного иначе, когда не хватает закрывающей кавычки текста:
#include <stdio.h>
int main(void) {
printf("Привет!\n);
return 0;
}main.c:4:12: warning: missing terminating '"' character [-Winvalid-pp-token]
4 | printf("Привет!\n);
| ^
main.c:4:12: error: expected expression
1 warning and 1 error generated.Строка со словом warning: — это предупреждение: компилятор указывает на то, что выглядит подозрительно. Здесь оно даже полезнее самой ошибки. missing terminating '"' character означает, что не хватает закрывающей кавычки, а значок ^ указывает на кавычку, у которой нет пары. Без неё компилятор не может понять, где заканчивается текст, поэтому после printf( он не находит ничего осмысленного: expected expression значит, что он ожидал выражение, то есть то, что нужно вывести.
Программа, в которой есть только предупреждения и нет ошибок, запускается, а предупреждения этот сайт не показывает. Поэтому самые важные предупреждения сайт превращает в ошибки, например %d без значения из упражнения «Текст и числа». Их можно узнать по -Werror в конце строки: [-Werror,-Wformat-insufficient-args].
Одна ошибка иногда вызывает несколько сообщений, а иногда скрывает другую ошибку, которую компилятор находит, только когда вы исправите первую. Поэтому всегда сначала исправляйте первую ошибку и запускайте программу снова. Остальные сообщения часто исчезают, потому что их вызывала только первая ошибка. И наоборот: после исправления может появиться новая ошибка.
Другие частые ошибки и их сообщения:
- Неправильно написано
printf, напримерprinftилиPrintf:call to undeclared function 'prinft'; ISO C99 and later do not support implicit function declarations. Компилятор не знает функции с таким именем. В примечании ниже он даже подсказывает, что вы, скорее всего, имели в виду:did you mean 'printf'? - Нет строки
#include <stdio.h>: сообщение начинается сcall to undeclared library function 'printf', а примечание под ним говорит, что делать:include the header <stdio.h>. - Нет закрывающей
}в концеmain:expected '}'с примечаниемto match this '{', которое указывает на скобку без пары.
Строки со словом note: — просто дополнительные заметки. Некоторые из них указывают на файлы стандартной библиотеки, например stdio.h, и читать их не нужно.
Задание
- 1
В программе в редакторе две ошибки. Запустите её и прочитайте первое сообщение об ошибке: на какой строке и в каком столбце ошибка и что не так? Исправьте её и запустите программу снова. Появится новое сообщение: первая ошибка скрывала вторую. Исправьте и её, чтобы программа выводила:
Турнир по крестикам-ноликам Когда: суббота, 10:00 Где: кабинет 2Б