Эта задача предназначена для знакомства с тестирующей системой. Вам предстоит реализовать функцию Multiply, которая перемножает 2 числа, в файле multiplication.cpp. Перед тем, как приступить к решению, настройте окружение согласно общей инструкции.
В каждой задаче обычно есть как минимум 3-4 файла:
CMakeLists.txt--- cmake-файл для сборки задачи.test.cpp--- сами тесты для задачи.*.h--- некоторый .h файл, который содержит объявления функций/классов, которые необходимо реализовать.*.cpp--- файлы, в которых вы должны реализовать то, что требуется в условии задачи (в данном случаеmultiplication.cpp)..tester.json--- файл с метаданными, которыми пользуется тестирующая система. Полеallow_changeпоказывает, какие файлы можно менять.
Вам разрешено изменять только файлы, содержащие решение задачи, --- в противном случае система не примет вашу посылку.
Когда вы делаете посылку, система запускает test.cpp, и в случае успешного завершения задача вам засчитывается.
Вы можете использовать любую удобную вам среду разработки или текстовый редактор. Обращайтесь к Yandex о том, как настроить CMake проект в вашей IDE. С самим CMake мы ещё познакомимся. Ниже будет инструкция по настройке окружения через командную строку.
В работе с кодом в индустрии очень хорошо иметь линтер, который по заданным правилам приводит ваш код к единому стилю. Мы будем использовать C++ Google Code Style с некоторыми различиями.
- Исключения будут разрешены
- Отступы в 4 пробела
- Максимальная длина строки в 100 символов
- Будем миксовать С++17 и C++20
Если ваш код не будет соответствовать кодстайлу, проверка будет падать с ошибкой. Чтобы привести его к стилю, используйте clang-format -i file.cpp, конфигурацию clang-format можно прочитать здесь.
Создадим директорию со сборкой:
# В директории cpp-advanced-hse.
mkdir build
cd buildУбедитесь, что у вас уже установлен cmake нужной версии, командой cmake --version. Версия должна быть не ниже 3.13. Если cmake еще не установлен, то нужно сделать это:
- на Ubuntu запустите
sudo apt-get update, а затемsudo apt-get install cmake - на OS X запустите
brew install cmake
Теперь запустим cmake:
cmake ..Если на этом шаге вы получаете странные ошибки, проверьте, что вы создали директорию build в корне репозитория, а не в директории с задачей.
При этом будет выведена некоторая служебная информация, в частности, используемый компилятор. Для корректной сборки необходим g++ версии не ниже 10.3 или clang++ версии не ниже 11.0.0. Установить их можно также из apt и brew соответственно.
Некоторые задачи могут компилироваться и с меньшими версиями, ответственность лежит на вас. Сервер собирает всё с clang-14.
Наконец, соберем нашу задачу test.cpp:
make test_multiplicationНазвания таргетов (в этой задаче test_multiplication) можно брать из файла .tester.json из поля "tests".
Все задачи включены в один проект, поэтому если вы попытаетесь собрать проект целиком (вызвав просто make), могут возникнуть ошибки. Поэтому при сборке нужно указывать конкретный исполняемый файл, который вам нужен.
Теперь в директории build есть исполняемый файл test_multiplication, который и нужно запустить: ./test_multiplication.
Обратите внимание, что помимо этого на сервере также осуществляется тестирование с включенными санитайзерами, которые проверяют наличие неопределенного поведения и некорректной работы с памятью в программе.
Осуществить такую сборку просто, но нужно делать это в отдельной сборочной директории:
# В директории cpp-advanced-hse.
mkdir asan_build
cd asan_build
cmake -DCMAKE_BUILD_TYPE=ASAN ..
make test_multiplicationЕсли вы реализуете решение в этой задаче просто как a * b, то тесты в asan-сборке должны упасть.
Изучите ошибку, поймите, почему тест упал, и исправьте решение.
Мы рекомендуем установить расширение clangd и отключить стандартный плагин C/C++. Чтобы clangd заработал, запускайте cmake с аргументом -DCMAKE_EXPORT_COMPILE_COMMANDS=ON. Эта опция включает генерацию файла compile_commands.json, нужного для навигации.
Чтобы clangd видел этот файл, сделайте симлинк на него в корне репозитория. Находясь в cpp-advanced-hse, выполните ln -s build/compile_commands.json compile_commands.json, где build - имя директории, в которой вы запускали cmake.