C++ für Embedded C Programmierer (30.3.2020 - 3.4.2020 Baden Württemberg) ========================================================================= .. toctree:: :hidden: setup install-googletest vs-code code/exercise-string/index .. sidebar:: *Kursinformation* .. contents:: :local: **Beginn** Montag 30.3.2020, 8:00 **Vorbereitung, Übungen** * Bitte einen `Github `__ Account mitbringen, um an Übungen teilzunehmen. Diese werden in einem Private Repository stattfinden (Link folgt). Siehe hierzu die :doc:`Privatheitsrichtlinien `. * :doc:`Hier die Bauanleitung `; bitte wenn geht vorab ausprobieren (:doc:`Feedback ` sehr willkommen). **Schulungsbeschreibungen** * :doc:`C Einführung ` * :doc:`C Advanced ` * :doc:`C++ ` * :doc:`CMake ` **Folien** * :download:`C ` (PDF) * :download:`C++03 ` (PDF) * :download:`C++11 ` (PDF) * :download:`CMake ` (PDF) * :download:`Unittesting ` (PDF) **Screenplays** * :doc:`/trainings/material/soup/unittest/unittest_gtest_basics/screenplay` * :doc:`/trainings/material/soup/unittest/unittest_gtest_cmake/screenplay` * :doc:`/trainings/material/soup/unittest/unittest_gtest_fixture/screenplay` * :doc:`/trainings/material/soup/cxx/cxx_class_intro/screenplay` * :doc:`/trainings/material/soup/cxx/cxx_dynamic_memory/screenplay` * :doc:`/trainings/material/soup/cxx/cxx_ownership_raii/screenplay` * :doc:`/trainings/material/soup/cxx/cxx_global_initialization/screenplay` * :doc:`/trainings/material/soup/cxx/cxx_exercises/screenplay` * :doc:`/trainings/material/soup/cxx/cxx_smart_pointers/screenplay` * :doc:`/trainings/material/soup/cxx/cxx_stl_container_intro/screenplay` **Links** * C++ Online Reference: `hier `__ oder `hier `__ * `Scott Meyers: Effective Modern C++ `__ * `Git Book `__ `__. * `Googletest `__, `Primer `__ **Sonstiges** * :doc:`setup` * :doc:`install-googletest` * :doc:`vs-code` * :doc:`/blog/2020/03/ms-teams-on-linux` 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 :doc:`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 ``/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 :doc:`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 ..... * Diskussion: "Temporary Objects" (``code/class-basics/temporaries-demo.cc``) * Copy Konstruktor, Assignment operator * :doc:`code/exercise-string/index` * *Copy Constructor* und *Assignment Operator* * Zum Teufel: **Self Assignment** * Code: ``code/exercise-string/`` * Viel Diskussion 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: :download:`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: :download:`C++11 (PDF) `, 6ff) * ``auto`` * `Range based `__ ``for`` * ``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.