การประเมินทักษะการเขียนโปรแกรม C ของคุณ
แล็บนี้จะให้การฝึกฝนในรูปแบบของการเขียนโปรแกรมที่คุณต้องทำได้อย่างเชี่ยวชาญ โดยเฉพาะสำหรับงานมอบหมายในชั้นเรียนครั้งต่อๆ ไป เนื้อหาที่ครอบคลุมควรได้รับการตรวจสอบสำหรับคุณ ทักษะบางส่วนที่ทดสอบได้แก่:
ห้องปฏิบัติการเกี่ยวข้องกับการใช้คิว ซึ่งสนับสนุนระเบียบการเข้าคิวเข้าหลังออกก่อน (LIFO) และเข้าก่อนออกก่อน (FIFO) โครงสร้างข้อมูลพื้นฐานคือรายการเชื่อมโยงแบบวงกลมที่ได้รับการปรับปรุงเพื่อให้การดำเนินการบางอย่างมีประสิทธิภาพมากขึ้น
มีข้อกำหนดเบื้องต้นบางประการที่ต้องติดตั้งบนเครื่องของคุณก่อนจึงจะสามารถสร้างและรันระบบปรับเกรดอัตโนมัติได้
คำสั่งต่อไปนี้จะติดตั้งการขึ้นต่อกันที่จำเป็นและเป็นทางเลือกทั้งหมดบน Ubuntu Linux 20.04 หรือใหม่กว่า:
$ sudo apt install build-essential git clang-format cppcheck aspell colordiff valgrind
Distro บางตัวเช่น 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/
ก่อนที่จะรัน autograders ให้คอมไพล์โค้ดของคุณเพื่อสร้างโปรแกรมทดสอบ 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
: สร้างโปรแกรมประเมินผล qtest
README.md
: ไฟล์นี้scripts/driver.py
: โปรแกรมไดรเวอร์ รัน qtest
บนชุดการติดตามมาตรฐานscripts/debug.py
: โปรแกรมตัวช่วยสำหรับ GDB ดำเนินการ qtest
โดยไม่มี SIGALRM และ/หรือวิเคราะห์ไฟล์ core dump ที่สร้างขึ้นไฟล์ตัวช่วย
console.{c,h}
: ใช้ล่ามบรรทัดคำสั่งสำหรับ qtestreport.{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
ในพรอมต์
$ ./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 ซึ่งสามารถพบได้ในไฟล์ใบอนุญาต
ซอร์สโค้ดภายนอก: