ревизия от 08.09.2023
- Введение
- Инструкция по сдаче лабораторных работ
- Начало работы
- Локальное тестирование
- Компиляция
- clang-format
- cppcheck
- clang-tidy
- Открытые тесты
- Как загрузить лабу
- В какую ветку загружать
- Какие кнопочки нажимать, чтобы загрузить
- Требования к Pull Request
- Общие советы
В течение годового курса по C++ вам предстоит делать лабораторные работы на отработку пройденного на лекциях материала. Получать и сдавать домашние задания вы будете через Github.
Можно и нужно обсуждать друг с другом, преподавателями и кем угодно:
- Содержимое лекций
- Не связанные с домашкой куски кода, вроде "нет ли UB в этой программе?" или "за сколько работает vector::push_back в каких случаях?"
- Настройку среды разработки, запуск компиляторов, отладчиков, и анализаторов
- Вопросы на StackOverflow
- Чисто алгоритмическую часть заданий по C++, вообще не зависящую от языка программирования, вроде "какую структуру данных надо использовать, чтобы работало за линию вместо квадрата"
Следует спрашивать напрямую у своего практика (лектора, проверяющего — если практик недоступен), чтобы получить надёжную информацию:
- Вопросы по условию
- Подсказки
У каждого из вас есть личный репозиторий labs-<github-username>
, работать Вы будете исключительно с ним. Для каждой выданной лабораторной работы в нём есть отдельная ветка (например, lab00-demo
), в которую вы загружаете Ваше решение. По мере выдачи новых домашек в вашем личном репозитории будут появляться новые ветки.
Сдача домашнего задания происходит итеративно (в среднем 2-3 итерации), цикл выглядит следующим образом:
- написание и локальное тестирование Вашего решения
- корректное оформление Pull Request с прохождением всех открытых автопроверок и "ОК" от бота
- проверяющий делает код-ревью Вашего Pull Request'а, выставляет баллы за стиль и корректность
- внимательное чтение замечаний и осознание того, что нужно исправить
ВАЖНО: прочитайте гайд полностью перед тем как загружать домашнее задание.
Для начала нужно скачать ваш репозиторий с лабораторной работой. Рассмотрим на примере lab00-demo
.
В условии каждой лабы четко прописано, в каких файлах должно находиться ваше решение. Нельзя переименовывать, удалять или создавать новые файлы.
Для lab00-demo
это overview.cpp
.
И вот вы написали какой-то код в overview.cpp
и по готовности лабораторной работы изменили tests.txt
.
Для успешного прохождения тестов для лабораторных работ
необходимо чтобы код был корректно отформатирован.
Например, есть вот такой код(по мотивам overview.cpp
):
int main() {
int case_number = 0;
while (true) {
std::cin >> case_number;
switch (case_number) {
case -1:
return 0;
case 1: {
int a = 0;
int b = 0;
std::cin >> a >> b;
std::cout << a + b << std::endl;
break;
}
default:
std::cout << "Undefined case number!\n";
}
}
}
Чтобы его отформатировать следует зайти в терминал и прописать команду.
clang-format-15 -i путь-до-файла
Результат форматирования:
int main() {
int case_number = 0;
while (true) {
std::cin >> case_number;
switch (case_number) {
case -1:
return 0;
case 1: {
int a = 0;
int b = 0;
std::cin >> a >> b;
std::cout << a + b << std::endl;
break;
}
default:
std::cout << "Undefined case number!\n";
}
}
}
Так же мы можем форматировать несколько файлов командой
clang-format-15 -i путь-до-файла1 путь-до-файла2 путь-до-файла3
-i - это флаг, который означает, что код отформатируется и запишется в тот же файл.
Если бы этого флага не было, то результат форматирования вывелся бы в терминал.
Clang-format имеет разные настройки форматирования. Эти настройки можно написать в файле под названием .clang-format. Если запустить clang-format в этой же директории, то код отформатируется в соответствии с этими настройками. В репозитории labs-ник_на_github есть файл .clang-format.
clang-tidy - это средство анализа кода, помогает замечать логические ошибки и писать более оптимальный код.
Запускается следующей командой:
clang-tidy имя-файла
Аналогично, clang-tidy
имеет разные настройки форматирования.
Если запустить clang-tidy в директории с лабораторной работой, то код отформатируется
в соответствии с необходимыми настройками.
В репозитории labs-ник_на_github
есть файл .clang-tidy
.
cppcheck - это статический анализатор, нужный для выявления ошибок, на которые компиляторы не обращают внимания, таких как ошибка в логическом выражении в условном операторе ветвления (if) и использование shadows и unusable variable
Команда для запуска (в консоли):
cppcheck --language=c++ -DSOME_DEFINE_TO_FIX_CONFIG --enable=all --error-exitcode=1 --inline-suppr путь-до-файла
Заметим, что путь до файла можно заменить названием файла, если запускать cppcheck из директории с этим файлом.
Так же можно проверить несколько файлов, если заменить название файла на *.cpp (или другое расширение)
Как правило, к лабораторной работе прилагается набор открытых тестов. Для их прохождения сначала необходимо скомпилировать программу.
Компиляция - преобразование всех *.cpp файлов в один исполняемый бинарный .exe файл
Перед прочтением этой главы у вас должны быть установлены хотя бы два компилятора.
Чтобы проверить, что всё установлено нормально запустите:
-
g++ --version
илиg++-12 –v
- чтобы проверить g++ -
clang++ -v
илиclang++-15 -v
- чтобы проверить clang++ если версии без суффикса одинаковые, можно его не приписывать
Шаблон команды выглядит таким образом:
g++-12|clang++-15 path/to/source.cpp -std=c++17 -Wall -Wextra -Werror -o path/to/output_executable
Расшифровка:
g++-12|clang++-15
-- выбираем одним из двух компиляторов
path/to/source.cpp
-- путь до каждой единицы трансляции (компилятору можно передать через пробел каждый *.cpp
файл, который нужно скомпилировать)
-std=c++98|c++11|c++14|c++17|c++20
-- выбираем стандарт C++, с которым хотим скомпилировать
-Wall -Wextra -Werror
-- включаем предупреждения компилятора и говорим ему трактовать предупреждения, как ошибки
-o path/to/output_executable
-- флаг -o
(от слова output) позволяет указать, куда положить результат компиляции (по умолчанию создаётся .out
)
Теперь скомпилируем overview.cpp
следующей командой:
g++-12 overview.cpp -std=c++17 -Wall -Wextra -Werror -o result
Пропишем ls
и убедимся, что появился res
Запустить скомпилированную программу можно командой ./path/to/exe
Теперь можем протестировать программу.
Тесты можно запустить командой:
bash /path/to/run-test-data.sh ./path/to/exe
Теперь, когда мы протестировали, отформатировали программу, прошли проверки cppcheck и clang-tidy, можем загружать наше решение на GitHub.
Открываем ваш репозиторий на github и меняем ветку с main на ветку соответствующей лабы (например, lab00-demo) (очень важный момент).
Убедитесь, что находитесь в ветке lab00-demo, сверху слева написано название ветки в которой вы находитесь. После этого, заходим в lab00-demo/solution/tests.txt и оставляем только те подзадачи, которые уже выполнили.
Теперь можем изменить файл overview.cpp
. Ещё раз внимательно смотрим, что находимся в нужной ветке (сейчас для нас это -- lab00-demo
)
Смотрим в какой ветке мы находимся, должны быть в lab00-demo. После вставки своего кода, жмем commit changes.
После этого, должно появиться окно в главном окне вашего репозитория, которое предлагает создать pull request. Жмем на Compare & pull request.
Меняем название pull request на ваше имя и вашу лабораторную работу. Вводите имя и название лабораторной аккуратно, пробелы важны. После этого жмем на кнопку Create pull request.
После этого появится окно. Здесь оно показывает, что некоторые тесты не были пройдены.
Заходим в Pull Requests и видим там свой Pull Request, заходим туда и смотрим какие тесты пройдены. При необходимости коммитим ещё раз.
Если горит зеленая галочка - то все ок, мы сдали подзадачу лабораторной работы.
Вас может привлечь огромная зелёная кнопка Squash and merge
-- её нельзя нажимать. Оставьте всё, как есть.
- если в чем-то не уверены -- пишите практику\флудилку. Вам очень хотят помочь и очень не хотят возиться с возможными последствиями Ваших ошибок, так что дешевле -- переспросить.
- каждый раз смотрите, в какой ветке вы находитесь -- в main коммитить нельзя.