評估您的 C 程式設計技能
本實驗將為您提供需要能夠熟練完成的程式設計風格的練習,特別是對於課程中後面的作業。所涵蓋的資料都應該供您審閱。測驗的一些技能是:
該實驗室涉及實現一個隊列,支援後進先出 (LIFO) 和先進先出 (FIFO) 排隊規則。底層資料結構是循環雙向鍊錶,經過增強以使某些操作更加有效率。
在您能夠建置和運行自動評分器之前,必須在您的電腦上安裝一些先決條件。
以下命令將在 Ubuntu Linux 20.04 或更高版本上安裝所有必要和可選的依賴項:
$ sudo apt install build-essential git clang-format cppcheck aspell colordiff valgrind某些發行版(例如 Arch Linux)不會使用aspell安裝aspell-en ,您必須明確安裝它:
$ sudo pacman -S aspell-en注意:Cppcheck版本必須至少為1.90,否則可能會報錯誤。您可以透過執行$ cppcheck --version來取得其版本。檢查開發人員資訊以從原始碼建立 Cppcheck。
clang-format整合到vim如果你想用 vim 儲存後自動執行clang-format ,根據 Clang 文檔,clang-format 支援與 vim 整合。
透過將以下內容加入$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 所建立的暫存文件make 可以辨識額外的選項:
VERBOSE :控制建置的詳細程度。如果VERBOSE=1 ,則回顯建置過程中的每個命令。SANITIZER :啟用消毒劑定向建置。目前支援AddressSanitizer。 qtest qtest提供了一個可以建立和操作佇列的命令解釋器。
運行$ ./qtest -h查看命令列選項列表
當你執行$ ./qtest時,它會給予命令提示字元cmd> 。鍵入help以查看可用指令的清單。
您將提交這兩份文件
queue.h :聲明的修改版本,包括您想要引入的新字段queue.c :佇列程式碼的修改版本,以修復原始程式碼的缺陷用於評估佇列程式碼的工具
Makefile :建構評估程序qtestREADME.md :這個文件scripts/driver.py :驅動程序,在一組標準追蹤上運行qtestscripts/debug.py :GDB 的幫助程序,在沒有 SIGALRM 的情況下執行qtest和/或分析產生的核心轉儲檔案。幫助文件
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的操作在使用 GDB debug qtest之前,需要執行一些常規指令。腳本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 伺服器,您可以透過在提示字元中執行web命令來使用它。
$ ./qtest
cmd > web
listen on port 9999, fd is 3內建Web伺服器準備就緒後,在另一個終端機中執行以下命令。
$ 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/quitlab0-c是根據 BSD 2 條款許可證發布的。此原始程式碼的使用受 BSD 樣式許可證的約束,該許可證可在 LICENSE 檔案中找到。
外部原始碼: