การประเมินทักษะการเขียนโปรแกรม 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 : สร้างโปรแกรมประเมินผล qtestREADME.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 : ติดตามไฟล์ที่ไดรเวอร์ใช้ เหล่านี้เป็นไฟล์อินพุตสำหรับ qtesttraces/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 ซึ่งสามารถพบได้ในไฟล์ใบอนุญาต
ซอร์สโค้ดภายนอก: