Bewerten Sie Ihre C-Programmierkenntnisse
In diesem Labor üben Sie den Programmierstil, den Sie benötigen, um ihn, insbesondere für die späteren Aufgaben im Kurs, kompetent beherrschen zu können. 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 check
Jeder 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 sind an make erkennbar:
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 qtest
README.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 qtest
Trace-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 Debug-Funktionen 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 3
Fü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: