Оценка ваших навыков программирования на C
Эта лабораторная работа даст вам возможность попрактиковаться в том стиле программирования, который вам понадобится, особенно для последующих заданий в классе. Весь изложенный материал должен быть рассмотрен вами. Некоторые из проверяемых навыков:
Лабораторная работа предполагает реализацию очереди, поддерживающей принципы организации очередей «последним пришел — первым обслужен» (LIFO) и «первым пришел — первым обслужен» (FIFO). Базовая структура данных представляет собой циклический двусвязный список, улучшенный для повышения эффективности некоторых операций.
Прежде чем вы сможете собирать и запускать автогрейдеры, на вашем компьютере необходимо установить несколько предварительных условий.
Следующая команда установит все необходимые и дополнительные зависимости в Ubuntu Linux 20.04 или более поздней версии:
$ sudo apt install build-essential git clang-format cppcheck aspell colordiff valgrind Некоторые дистрибутивы, такие как Arch Linux, не устанавливают aspell-en с помощью aspell , и вам придется установить его явно:
$ sudo pacman -S aspell-en Примечание. Версия Cppcheck должна быть не ниже 1.90, в противном случае она может сообщать об ошибках с ложными срабатываниями. Вы можете получить его версию, выполнив $ cppcheck --version . Проверьте информацию о разработчике для сборки Cppcheck из исходного кода.
clang-format в vim Если вы хотите автоматически запускать clang-format после сохранения с помощью vim, clang-format поддерживает интеграцию с vim согласно документации Clang.
Добавив следующее в $HOME/.vimrc
function ! Formatonsave ()
let l:formatdiff = 1
py3f < path-to-clang-format.py > /clang-format.py
endfunction
autocmd BufWritePre * .h, * .hpp, * .c, * .cc, * .cpp call Formatonsave () Кроме того, он легко интегрируется в рабочий процесс кодирования, поскольку может обрабатывать изменения форматирования при сохранении файла. Примечание. В Ubuntu Linux 18.04 путь к clang-format.py — /usr/share/vim/addons/syntax/ .
Прежде чем запускать автооценщики, скомпилируйте код, чтобы создать программу тестирования qtest
$ makeПроверьте корректность вашего кода, т.е. автогрейдеров:
$ make test Проверьте пример использования qtest :
$ make checkКаждый шаг вызова команды будет отображаться соответствующим образом.
Проверьте проблему с памятью вашего кода:
$ make valgrind./.valgrindrc , чтобы настроить аргументы Valgrind.$ make clean или $ rm /tmp/qtest.* для очистки временных файлов, созданных целевым valgrind.Дополнительные опции можно узнать по марке:
VERBOSE : управление подробностью сборки. Если VERBOSE=1 , отображать каждую команду в процессе сборки.SANITIZER : включить сборку, направленную на дезинфицирующие средства. На данный момент поддерживается AddressSanitizer. qtest qtest предоставляет интерпретатор команд, который может создавать очереди и управлять ими.
Запустите $ ./qtest -h чтобы просмотреть список параметров командной строки.
Когда вы выполните $ ./qtest , появится командная строка cmd> . Введите help чтобы просмотреть список доступных команд.
Вы сдадите эти два файла
queue.h : измененная версия объявлений, включая новые поля, которые вы хотите добавить.queue.c : измененная версия кода очереди для исправления недостатков исходного кода.Инструменты для оценки кода очереди
Makefile : собирает оценочную программу qtestREADME.md : Этот файлscripts/driver.py : программа-драйвер запускает qtest со стандартным набором трассировок.scripts/debug.py : вспомогательная программа для GDB выполняет qtest без SIGALRM и/или анализирует сгенерированный файл дампа ядра.Вспомогательные файлы
console.{c,h} : реализует интерпретатор командной строки для qtest.report.{c,h} : реализует печать информации на разных уровнях детализации.harness.{c,h} : индивидуальная версия malloc/free/strdup для обеспечения строгой среды тестирования.qtest.c : код для qtestФайлы трассировки
traces/trace-XX-CAT.cmd : файлы трассировки, используемые драйвером. Это входные файлы для qtest .traces/trace-eg.cmd : простой документированный файл трассировки для демонстрации работы qtest Прежде чем использовать qtest отладки GDB, необходимо выполнить некоторые рутинные инструкции. Сценарий scripts/debug.py охватывает эти инструкции и обеспечивает базовую функцию отладки.
$ scripts/debug.py -h
usage: debug.py [-h] [-d | -a ]
optional arguments:
-h, --help show this help message and exit
-d, --debug Enter gdb shell
-a, --analyze Analyze the core dump file$ scripts/debug.py -d
Reading symbols from lab0-c/qtest...done.
Signal Stop Print Pass to program Description
SIGALRM No No No Alarm clock
Starting program: lab0-c/qtest
cmd > Когда qtest обнаружил ошибку сегментации во время работы вне GDB, мы могли вызвать GDB в режиме посмертной отладки, чтобы выяснить ошибку.
Файл дампа ядра был создан в рабочем каталоге qtest .
$ ulimit -c unlimited
$ ulimit -c
unlimited$ scripts/debug.py -a
Reading symbols from lab0-c/qtest...done.
[New LWP 9424]
Core was generated by ` lab0-c/qtest ' .
Program terminated with signal SIGSEGV, Segmentation fault.
#0 ...
#1 ... (backtrace information)
#2 ...
(gdb) linenoise был интегрирован в qtest , предоставляя следующие удобные функции:
Небольшой веб-сервер уже интегрирован в интерпретатор командной строки qtest , и вы можете использовать его, запустив web команду в его командной строке.
$ ./qtest
cmd > web
listen on port 9999, fd is 3Запустите следующие команды в другом терминале после того, как встроенный веб-сервер будет готов.
$ curl http://localhost:9999/new
$ curl http://localhost:9999/ih/1
$ curl http://localhost:9999/ih/2
$ curl http://localhost:9999/ih/3
$ curl http://localhost:9999/sort
$ curl http://localhost:9999/quit lab0-c выпускается под лицензией BSD 2. Использование этого исходного кода регулируется лицензией в стиле BSD, которую можно найти в файле LICENSE.
Внешний исходный код: