Bewerten Sie Ihre C-Programmierkenntnisse
In diesem Labor üben Sie den Programmierstil, den Sie benötigen, um ihn kompetent beherrschen zu können, insbesondere für die späteren Aufgaben im Kurs. Das behandelte Material sollte für Sie überprüft werden. Einige der getesteten Fähigkeiten sind:
Das Labor umfasst die Implementierung einer Warteschlange, die sowohl die Warteschlangendisziplinen Last-In, First-Out (LIFO) als auch First-In-First-Out (FIFO) unterstützt. Die zugrunde liegende Datenstruktur ist eine kreisförmige, doppelt verknüpfte Liste, die erweitert wurde, um einige Vorgänge effizienter zu gestalten.
Es gibt einige Voraussetzungen, die auf Ihrem Computer installiert sein müssen, bevor Sie die Autograder erstellen und ausführen können.
Der folgende Befehl installiert alle erforderlichen und optionalen Abhängigkeiten unter Ubuntu Linux 20.04 oder höher:
$ sudo apt install build-essential git clang-format cppcheck aspell colordiff valgrind Einige Distributionen wie Arch Linux installieren aspell-en nicht mit aspell und Sie müssen es explizit installieren:
$ sudo pacman -S aspell-en Hinweis: Die Cppcheck-Version muss mindestens 1.90 sein, andernfalls werden möglicherweise Fehler mit Fehlalarmen gemeldet. Sie können die Version erhalten, indem Sie $ cppcheck --version ausführen. Überprüfen Sie die Entwicklerinformationen zum Erstellen von Cppcheck aus dem Quellcode.
clang-format in vim Wenn Sie clang-format nach dem Speichern mit vim automatisch ausführen möchten, unterstützt clang-format laut Clang-Dokumentation die Integration für vim.
Indem Sie Folgendes zu $HOME/.vimrc hinzufügen
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 () Darüber hinaus lässt es sich problemlos in den Codierungsworkflow integrieren, da es Formatierungsänderungen beim Speichern einer Datei verarbeiten kann. Hinweis: Unter Ubuntu Linux 18.04 lautet der Pfad zu clang-format.py /usr/share/vim/addons/syntax/ .
Bevor Sie die Autograder ausführen, kompilieren Sie Ihren Code, um das Testprogramm qtest zu erstellen
$ makeÜberprüfen Sie die Richtigkeit Ihres Codes, z. B. Autograder:
$ make test Sehen Sie sich die Beispielverwendung von qtest an:
$ make checkJeder Schritt zum Befehlsaufruf wird entsprechend angezeigt.
Überprüfen Sie das Speicherproblem Ihres Codes:
$ make valgrind./.valgrindrc , um die Argumente von Valgrind anzupassen$ make clean oder $ rm /tmp/qtest.* um die vom Ziel-Valgrind erstellten temporären Dateien zu bereinigenZusätzliche Optionen können an make erkannt werden:
VERBOSE : Steuern Sie die Build-Ausführlichkeit. Wenn VERBOSE=1 , wird jeder Befehl im Build-Prozess wiedergegeben.SANITIZER : aktiviert den auf Desinfektionsmittel gerichteten Build. Derzeit wird AddressSanitizer unterstützt. qtest qtest bietet einen Befehlsinterpreter, der Warteschlangen erstellen und bearbeiten kann.
Führen Sie $ ./qtest -h aus, um die Liste der Befehlszeilenoptionen anzuzeigen
Wenn Sie $ ./qtest ausführen, wird eine Eingabeaufforderung cmd> angezeigt. Geben Sie help ein, um eine Liste der verfügbaren Befehle anzuzeigen.
Sie werden diese beiden Dateien abgeben
queue.h : Geänderte Version der Deklarationen, einschließlich neuer Felder, die Sie einführen möchtenqueue.c : Modifizierte Version des Warteschlangencodes, um Mängel des Originalcodes zu behebenTools zur Auswertung Ihres Warteschlangencodes
Makefile : Erstellt das Evaluierungsprogramm qtestREADME.md : Diese Dateiscripts/driver.py : Das Treiberprogramm führt qtest auf einem Standardsatz von Traces ausscripts/debug.py : Das Hilfsprogramm für GDB, führt qtest ohne SIGALRM aus und/oder analysiert die generierte Core-Dump-Datei.Hilfsdateien
console.{c,h} : Implementiert den Befehlszeileninterpreter für qtestreport.{c,h} : Implementiert das Drucken von Informationen mit unterschiedlichen Ausführlichkeitsstufenharness.{c,h} : Angepasste Version von malloc/free/strdup, um ein strenges Test-Framework bereitzustellenqtest.c : Code für qtestTrace-Dateien
traces/trace-XX-CAT.cmd : Vom Treiber verwendete Trace-Dateien. Dies sind Eingabedateien für qtest .traces/trace-eg.cmd : Eine einfache, dokumentierte Trace-Datei zur Demonstration der Funktionsweise von qtest Vor der Verwendung von GDB debug qtest müssen einige Routineanweisungen ausgeführt werden. Das Skript scripts/debug.py deckt diese Anweisungen ab und stellt grundlegende Debugfunktionen bereit.
$ 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 > Wenn qtest bei der Ausführung außerhalb von GDB auf einen Segmentierungsfehler stieß, konnten wir GDB im Post-Mortem-Debugging-Modus aufrufen, um den Fehler herauszufinden.
Die Core-Dump-Datei wurde im Arbeitsverzeichnis von qtest erstellt.
$ 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 wurde in qtest integriert und bietet die folgenden benutzerfreundlichen Funktionen:
Im qtest -Befehlszeileninterpreter ist bereits ein kleiner Webserver integriert, den Sie nutzen können, indem Sie den web -Befehl in seiner Eingabeaufforderung ausführen.
$ ./qtest
cmd > web
listen on port 9999, fd is 3Führen Sie die folgenden Befehle in einem anderen Terminal aus, nachdem der integrierte Webserver bereit ist.
$ 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 wird unter der BSD-2-Klausel-Lizenz veröffentlicht. Die Nutzung dieses Quellcodes unterliegt einer BSD-ähnlichen Lizenz, die in der LICENSE-Datei zu finden ist.
Externer Quellcode: