DIPL.-ING. MARTIN WEITZEL, 64380 ROSSDORF, GERMANY

gedis-cpp

Montag Vormittag

Git-Archiv zum Herunterladen der Schulungs-Unterlagen:

https://github.com/tbfe-de/mc-cppmodern

Montag Mittag Übung

Schulungsunterlage Seite 45

decltype-Regeln testen und verstehen (evtl. durch Vorhersagen der Ausgabe und ggf. Hinzufügen weiterer Testfälle). Wichtigste Punkte:

  • Wann wird Referenz (&) dazu gefügt und wann nicht?
  • Wann wird const weggelassen und wann nicht?

Schulungsunterlage Seite 57

Anhand von Variationen des Beispiels überprüfen:

  • Wann wird tatsächlich die Compilezeit-Variante einer constexpr-Funktion aufgerufen?
  • Wie lässt sich das ggf. eindeutig demonstrieren?

Zusatzfrage (erfordert Erweiterung des Beispiels):

  • Darf eine constexpr Funktion intern eine nicht-constexpr Funktion aufrufen?

Montag Nachmittag Live Demo

Perfect Forwarding: http://coliru.stacked-crooked.com/a/98986f077989f0c1

Montag Nachmittag Übung

Schulungsunterlage Seite 114

  • auto-Variablen Typdeduktion vorhersagen und anschließend überprüfen

Schulungsunterlage Seite​ 109

Verwenden Sie nicht das Coliru-Beispiel sondern übernehmen Sie den Code den abgedruckten Code.

  • Vervollständigen Sie den Code des Move-Assignments;
  • testen Sie diesen mit einem main-Programm
  • Fügen Sie Copy-Construktor und Copy-Assignment hinzu (= "tiefes Kopieren");
  • testen Sie diesen mit einem main-Programm.
  • Was vereinfacht durch Ersetzen des const char* nm durch einen std::string nm?
  • Wieviel größer wird die Klassen point dadurch?

Dienstag Vormittag Live Demo

Motivation für das C++17 Feature "if constexpr" und Template-Metaprogrammierung: http://coliru.stacked-crooked.com/a/300793e0fb8c242d (Dieses Beispiel soll vor allem die Nutzungsseite demonstreren, die Implementierung der relativ komplizierten Helfer-Templates wird später erläutert.)

Verwendung von std.:function und std::bind im Rahmen einer Grundstruktur des "Publisher-Subscriber"-Patterns: http://coliru.stacked-crooked.com/a/c732adf104b3e140

Dienstag Mittag Übung

Erstellen Sie ein einfaches Beispielprogramm aus den folgenen Bestandteilen.

Schulungsunterlage Seite 143 

Code der Klasse check_divisable (nur diesen Teil, nicht die anderen Teile)

Schulungsunterlage Seite 147

Code der Funktion capture_nothing (nur diesen Teil, nicht die anderen Teile)

Fürgen Sie #include-Anweisungen für die erforderlichen Header-Files (<algorithm>, <initializer_list>, <iostream>, und <iterator>) sowie ein einfaches main Programm hinzu, welches diese Funktion testhalber aufruft, z.B. so:

capture_nothing({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13});

Da copy_if nun die Standardfunktion aus dem Namensraum std ist, müssen Sie außerdem entweder diese noch mit std:: qualifizieren oder eine entsprechende using Anweisung hinzufügen.

Testen Sie ob das kompilierte Programm – es sollte alle durch zwei teilbaren Zahlen ausgeben.

Ändern Sie nun den Aufruf wie folgt:

capture_divisable(2, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13});

Sie müssen nun natürlich auch die bisherige Funktion capture_nothing anpassen (= zum einen die erforderliche Namensänderung und zum anderen das zusätzliches Argument). Dieses zusätzliche Argument soll der Teiler sein, für den die Teilbarkeit geprüft wird, Das heißt je nach erstem Argument N sollte capture_divisable alle durch N teilbaren Zahlen ausgeben.

Zeigen Sie sowohl die Lösung per Lambda und wie auch alternativ eine Lösung mit Verwendung von check_divisable.

Dienstag Nachmittag Übung

(Siehe Exercises/05_Wednesday1/zutun.txt mindestens Schrit 1+2, weitere soviel die Zeit erlaubt)

(TBD: Zusammenfassung der Besprechung am Mittwochmorgen)

Mittwoch Mittag Übung

Die Programmbeispiele finden Sie als kompilierbaren Code für Coliru hier:

http://coliru.stacked-crooked.com/a/d3f1fc362e5ed6b1

Wählen Sie zunächst rechts unten EDIT, damit Sie das Beispiel verändern können. Da dieser Quelltext aus ZWEI HAUPT-Beispielen besteht, aktivieren Sie der besseren Überichtlichkeit halber im Hauptprogramm ganz am Ende jeweils nur einen.

Schulungsunterlage Seite 243

Lokalisieren Sie die Klasse my::link_elem im Coliru-Beispiel und vergleichen Sie diese mit  der Schulungsunterlage. Was kam offensichtlich noch hinzu und welchen Zweck dürfte das erfüllen?

http://coliru.stacked-crooked.com/a/b2bb750ce84c97b0Schulungsunterlage Seite 244

Was sind Ihre Erwartungen an die Anzahl der existierenden link_elem Objekte an den mit Kommentaren markierten Stellen? Lokalisieren Sie diesen im Coliru-Beispiel in den Zeilen 53 bis 63.

Überprüfen Sie Ihre Erwartungen indem Sie das Beispiel kompilieren und ausführen NACHDEM Sie im Hauptprogramm folgende Änderung vorgenommen haben:

int main() {
    circular_demo();
 // airtraffic_demo(); // <----- momentan de-aktivieren
}

Deaktivieren Sie nun den Code in den Zeilen 46 bis 64 des Coliru-Bespiels indem Sie die bedingte Kompilierung von #if 1 in Zeile 46 auf #if 0 ändern.

  • Wieviele link_elem Objekte werden noch vorhanden sein, wen die Funktion in Zeile 75 endet?
  • Wie ändert sich das, wenn man in der while-Schleife das push_back auskommentiert und dafür den Kommentar vor dem push_front entfernt?

Schulungsunterlage Seite 246

Ab hier kompilieren Sie das Coliru-Beispiel bitte NACHDEM Sie im Hauptprogramm folgende Änderung vorgenommen haben:

int main() {
//  circular_demo();// <----- momentan de-aktivieren
    airtraffic_demo();
}

  • Demonstrieren Sie, dass es mit dem Code so wie gezeigt zu einem Memory-Leak kommt (d.h. am Ende sind alle Flüge und alle Flughäfen gelöscht aber dennoch sind eine Rehe von Objekten dieser Art vorhanden). 
  • Versuchen Sie als Abhilfemaßnahme die for-Schleife von Seite 248 einzubauen. Bringt das den gewünschten Erfolg?
  • Ändern Sie die using-Typdefnition von flight_ref in einen std::weak_ptr und kommen Sie basierend darauf zu einer Abschätung welche weiteren Maßnahmen notwendig sind, um den Code wieder kompilierbar zu machen (sowohl ohne wie auch mit Wiederherstellung der ursprünglichen Funtionalität).

Donnerstag Mittag Übung

Erzeugen Sie eine größere Menge von Zufallszahlen und speichern Sie diese in einen std::array

  • Algorithmus std::generate_n

Sorrtieren Sie diese Daten

  • Algorithmus std::sort

Prüfen Sie ob die Daten tatsächlich sortiert sind

  • Algorithmus std::is_sorted

Wenn alles funktioniert, erledigen Sie das Sortieren in zwei parallelen Threads, die Sie mit std::async starten und mischen Sie den sortierten unteren und oberen Datenbereich anschließend zusammen.

  • Algorithmus: std::inplace_merge

http://coliru.stacked-crooked.com/a/eb7ee896015649b6

Donnerstag Nachmittag Übung

Analsysieren Sie diesen Source-Code dahingehend, welche Werte am Ende minimal und maximal in counter enthalten sein können:

std::atomic_int counter{0};

void uptick(int n) {
    while (n-- > 0) {
        int local = counter;
        counter = ++local;
    }
}

int main() {
    auto f1 = std::async(std::launch::async, []() {uptick(1, 5);});
    auto f2 = std::async(std::launch::async, []() {uptick(2, 3);});
    f1.get();
    f2.get();
}

Als kompilierbares Bespiel finden Sie diesen Code hier:
http://coliru.stacked-crooked.com/a/eb7ee896015649b

Wenn Sie zu einem Ergebnis gekommen sind versuchen Sie durch gezieltes Einfügen von Verzögerungen mittels std::this_thread::sleep_for den kleinsten und größten Wert zu reproduizieren oder sehen Sie sich die Lösung hier an (kleinster Wert)
http://coliru.stacked-crooked.com/a/7492915c6e021ad5
und hier (größter Wert):
http://coliru.stacked-crooked.com/a/b2bb750ce84c97b0

Freitag Vormittag Live Demo

Variadische Templates am Beispiel einer Funktion die beliebige Argumente ausgibt.

http://coliru.stacked-crooked.com/a/7eede92a4d80dd3d

Über die während der Demo gezeigte Funktionalität ist hier auch noch die Ausgabe eines Parameters zusammen mit dessen Namen gezeigt.