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.