تقييم مهاراتك في البرمجة بلغة C
سيمنحك هذا المختبر تدريبًا على أسلوب البرمجة الذي ستحتاج إلى أن تكون قادرًا على القيام به بكفاءة، خاصة بالنسبة للمهام اللاحقة في الفصل. يجب أن تتم مراجعة جميع المواد المغطاة لك. بعض المهارات التي تم اختبارها هي:
يتضمن المعمل تنفيذ قائمة انتظار، ودعم كل من أنظمة انتظار الدخول أولاً يخرج أولاً (LIFO) وأول ما يدخل أولاً يخرج أولاً (FIFO). بنية البيانات الأساسية عبارة عن قائمة دائرية مزدوجة الارتباط، تم تحسينها لجعل بعض العمليات أكثر كفاءة.
هناك بعض المتطلبات الأساسية التي يجب تثبيتها على جهازك قبل أن تتمكن من إنشاء برامج الدرجات التلقائية وتشغيلها.
سيقوم الأمر التالي بتثبيت جميع التبعيات المطلوبة والاختيارية على Ubuntu Linux 20.04 أو الأحدث:
$ sudo apt install build-essential git clang-format cppcheck aspell colordiff valgrind
بعض التوزيعات مثل Arch Linux لن تقوم بتثبيت aspell-en
مع aspell
، ويجب عليك تثبيته بشكل صريح:
$ sudo pacman -S aspell-en
ملاحظة: يجب أن يكون إصدار Cppcheck 1.90 على الأقل، وإلا فإنه قد يُبلغ عن أخطاء ذات نتائج إيجابية خاطئة. يمكنك الحصول على نسخته عن طريق تنفيذ $ cppcheck --version
. تحقق من معلومات المطور لإنشاء Cppcheck من المصدر.
clang-format
في vim
إذا كنت تريد تشغيل clang-format
تلقائيًا بعد الحفظ باستخدام vim، فإن تنسيق clang يدعم التكامل مع 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/
.
قبل تشغيل برامج الدرجات التلقائية، قم بتجميع التعليمات البرمجية الخاصة بك لإنشاء برنامج الاختبار 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 و/أو يحلل ملف التفريغ الأساسي الذي تم إنشاؤه.ملفات مساعده
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 الذي يمكن العثور عليه في ملف الترخيص.
كود المصدر الخارجي: