C++ für Embedded C Programmierer (30.3.2020 - 3.4.2020 Baden Württemberg)

Kursaufbau

Test Driven Development bzw. Unittesting ist Teil der Kursanforderung, ergänzend zu den C++-Themen.

Lasst uns also den Kursverlauf testgetrieben entwickeln dort, wo es Sinn macht.

  • Die meisten der Livehacking Demos können als Testcases gestaltet werden.

  • Übungen erst recht; der Trainer formuliert die Aufgabe als Unittest - die Teilnehmer hacken - alle diskutieren - nächste Iteration …

Kursverlauf

Im folgenden eine Niederschrift des Geschehenen. Übungen und Live-Hacking-Demos des Trainers sind im zur Seite gehörenden Git-Repository (bzw. eines Clones in einem privaten Github-Respository) entwickelt worden.

Die Code-Integration mit HTML verläuft noch nicht ideal, sodass man den Code hier nicht ansehen kann. Bitte dazu das Repo clonen. Wann immer im folgenden Code erwähnt wird, ist dieser im zugehörigen Clone in dem Subdirectory zu finden, das der URL im URL-Bar entspricht. Hier also <clone-root>/trainings/log/detail/2020-03-30/code/.

Tag 1

Ein nicht unbeträchtlicher Teil des Tages wurde dafür verwendet, um das Google Test Framework auf Ubuntu 16.04 LTS (mit GCC5 als System-Compiler) zum Laufen zu bekommen. Daraus entstanden ist eine Installationsanleitung.

  • Code: code/gtest-basics/. Live-Hacking, GTest und Test Driven Development. Anfangs ohne CMake mit direkter Toolchain-Benutzung, dann Migration auf CMake.

    • Zuerst drei separate Test-Executables: code/gtest-basics/fail.cc, code/gtest-basics/non-fatal.cc, code/gtest-basics/simple.cc.

    • Dann eine Aggregation durch den Linker (bitte code/gtest-basics/CMakeLists.txt ansehen) aller Testcases in ein einzelnes Executable.

Tag 2

  • Klassen (Einführung): Konstruktoren, Methoden, Referenzen, const

    • Code: code/class-basics/. “Point” Klasse (Live-Hacking)

      • Zuerst in C als struct

      • C++ Äquivalent als class

      • const bei Parameter-Übergabe

      • const Methoden

      • Langsames Ausbauen: Operator Overloading

  • Dynamisches Memory, code/dynmem-ownership/

    • code/dynmem-ownership/dynmem-tests.cc. Eine Reihe von Tests, um zu demonstrieren, wie in C und in C++ dynamisch alloziert wird. malloc()/free() vs. new/delete vs. new[]/delete[]

    • Ownership, bzw. RAII (Resource Acquisition is Initialization).

    • Verwenden von Konstruktor und Destruktor, um Memory-Fehler zu vermeiden. Siehe dazu code/dynmem-ownership/ownership-ctor-dtor.cc

    • Benutzung von valgrind

    • Ausflug: std::string, size() und capacity(). Siehe code/dynmem-ownership/string-demo.cc

Tag 3

Tag 4

  • Diskussion (Code: code/static-vs-inline/): static (File-Scope), und was hat das zu tun mit inline?

  • Pointer-Datentypen (Unittest: code/smart-pointers/ownership.cc). std::shared_ptr<> (Shared Ownership) und std::unique_ptr<> (Exclusive Ownership), demonstriert anhand einer Manager/Employee/Testcase Beziehung.

  • Vorgriff auf STL (Code: code/smart-pointers/lt-sort.cc): sortieren von EmployeeRecord``s in einem ``std::vector nach verschiedenen Kriterien.

  • Templates Intro (Code: class-template/): class Point mit parametrisierbarem Koordinatentyp

Tag 5

  • STL Containers (Code: code/stl-container/, Slides: C++03 (PDF), 102ff)

    • Überblick, Arten von Containern

    • Pointerarithmetik Wiederholung

    • Iteratoren, Iteration mit for

    • Demos

      • std::vector (code/vector.cc).

      • std::list (code/list.cc)

      • std::map (code/map.cc)

    • Diskussion: Laufzeitverhalten, O-Notation

    • C++11 Verbesserungen gegenüber C++03 (Slides: C++03 (PDF), 6ff)

  • lambda. Siehe

    • code/stl-container/sort-is-n-log-n.cc. Gegenüberstellung explizite Funktion vs. Lambda.

    • code/stl-container/vector.cc: TEST(Vector, Sort_Algorithm_Reverse_Lambda)

    • code/stl-container/threads.cc

  • Vererbung vs. Templates. Fallstudie, livegehackt. Wir haben einen Sensor Thermometer, der über SPI angebunden ist, und auf den komplexe Stücke Software aufbauen. Nun will ein Kunde, dass wir einen vergleichbaren über I2C anbinden. Zwei Möglichkeiten, und Diskussion,

    • Vererbung (Code: code/inheritance-interfaces-virtual/)

    • Templates (Code: code/inheritance-morph-to-templates/)

  • Exceptions wurden nicht explizit als eigenes Kapitel behandelt und quasi im Vorbeigehen erklärt.