Programmieren in C++

Ähnliche Dokumente
Programmieren in C++

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Angewandte Mathematik und Programmierung

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Programmieren in C++ Templates

Zeiger in C und C++ Zeiger in Java und C/C++

Grundlagen der Informatik 2. Operatoren

Praxis der Programmierung

Crashkurs C++ - Teil 1

Dynamische Datentypen

Informatik II: Algorithmen und Datenstrukturen SS 2013

Repetitorium Informatik (Java)

C-Programmierkurs Mathematik

Algorithmen zur Datenanalyse in C++

Übungsblatt 1. Java Vorkurs (WS 2017)

Informatik - Übungsstunde

8. Referenzen und Zeiger

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Programmierkurs. Steffen Müthing. January 18, Interdisciplinary Center for Scientific Computing, Heidelberg University

Mehrdimensionale Arrays

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / 2015 Vorlesung 3, Donnerstag 6.

Unterlagen. CPP-Uebungen-08/

Zeiger, Arrays und Strings in C und C++

Überblick. R.Grossmann / P. Sobe 1

Vorlesung Programmieren

2. Aufgabe (3 Punkte) Ergänzen Sie die leeren Zellen derart, dass sich in einer Zeile die selben Zahlenwerte ergeben.

Informatik I (D-ITET)

Repetitorium Programmieren I + II

INE1 Bit-Operationen. Bit-Operationen Übungen Bits setzen, löschen, abfragen Beispiel: Bitmap

Programmierkurs C++ Variablen und Datentypen

Informationsverarbeitung im Bauwesen

Zeiger in C und C++ Zeiger in Java und C/C++

Programmierkurs C++ Templates & STL (1/2)

Programmieren in C++

Programmiervorkurs Einführung in Java Tag 1

GI Vektoren

Überblick. 5. Objekt und Klasse, Elementfunktionen

RO-Tutorien 3 / 6 / 12

Repetitorium Programmieren I + II

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Teil I Debuggen mit gdb

Klausur. 2. Aufgabe (3 Punkte) Ergänzen Sie die leeren Zellen derart, dass sich in einer Zeile die selben Zahlenwerte ergeben.

Praxis der Programmierung

Kurze Einführung in die Benutzung des Dokumentationswerkzeugs Doxygen

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

Java Referenzdatentypen genauer betrachtet

Informatik für Mathematiker und Physiker Woche 7. David Sommer

Grundlagen der Informatik 11. Zeiger

Elementare Datentypen in C++

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

5. Abgeleitete Datentypen

Übungsstunde: Informatik 1 D-MAVT

Grundlagen der Informatik 6. Arrays I

Anregungen zu Übung 2

C++ Templates. Wozu Templates? Definition von Templates. Gebrauch von Templates. Instanziierung und Organisation

Hello World! Eine Einführung in das Programmieren Variablen

Kurzeinführung in C/C++ Informationsquellen: - Webseite zur Vorlesung, Abschnitt Informationen zu C und C++ Einleitung

C-Pointer (Zeiger, Adressen) vs. C++ Referenzen

Implementieren von Klassen

Ursprünge. Die Syntax von Java. Das Wichtigste in Kürze. Konsequenzen. Weiteres Vorgehen. Rund um Java

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 2. Teil

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

Einführung Programmierpraktikum C Michael Zwick

Herzlich willkommen!

Zusammenfassung des Handzettels für Programmieren in C

Einführung in die Programmiersprache C

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

4.2 Programmiersprache C

Transkript:

Programmieren in C++ SS 2016 Vorlesung 8, Dienstag 14. Juni 2016 (Templates, Templates, Templates) Prof. Dr. Hannah Bast Lehrstuhl für Algorithmen und Datenstrukturen Institut für Informatik Universität Freiburg

Blick über die Vorlesung heute Organisatorisches Inhalt Erfahrungen mit dem Ü7 Input/Output Referenzen und Zeiger Kurze Wiederholung Templates Prinzip + Beispiel Templates Instanziierung Templates Spezialisierung Bitweise Operatoren & ^ ~ << >> Übungsblatt 8: Eine templatisierte Klasse Set<T>, mit einer effizienteren Implementierung für den Typ char 2

Erfahrungen mit dem Ü7 1/3 Zusammenfassung / Auszüge Für die meisten gut machbar und relativ wenig Aufwand Man konnte schnell sehr viele doofe Fehler machen Probleme durch fehlende 0-Terminierung bei Verwendung von C-Funktionen wie strlen oder printf Bitte Zeiger und Referenzen nochmal erklären "Neben dem Programmieren Fußball zu schauen war keine gute Idee, ohne Fußball ging es wesentlich schneller" 3

Erfahrungen mit dem Ü7 2/3 Die Zahl 137 137 ist die natürliche Zahl nach 136 und vor 138 Zahl mit dem am schlauesten klingenden Wikipedia-Artikel 137? Da ist doch die Anzahl der Semester bis zum Bachelor! Dazu sage ich nichts ohne meinen Anwalt auf den ich laut 137 Strafprozessordnung ein Anrecht habe Die Zahl 137 ist super: sie ist eine Primzahl, und die Quersumme (11) und deren Quersumme (2) auch 137 ist kein Palindrom 4

Erfahrungen mit dem Ü7 3/3 Die Zahl 137 und Wolfgang Pauli 1 / 137 ist der Wert der Feinstrukturkonstanten α ~ elektromagnetische Kraft zw. zwei Elementarladungen Pauli (und auch andere Physiker) hat tief beschäftigt, warum genau 1 durch eine natürliche Zahl, und warum gerade 137 Pauli hatte sich viel mit der Kabbala beschäftigt In der jüdischen Numerologie ist Kabbala 137 Die Tora hat 304.805 Buchstaben, 50 + 84 + 03 = 137 Pauli starb im Raum 137 im Rotkreuz Krankenhaus in Zürich Jahre später fand man heraus, dass α = 1 / 137.04 5

Fragen auf dem Forum Wiederholung der Wiederholung Wir helfen Ihnen gerne, aber Sie müssen uns auch helfen, damit wir Ihnen helfen können Hilfe zur Selbsthilfe! Sie lernen nichts, wenn wir einfach die Fehler in Ihrem Code finden und fixen Versuchen Sie: den Fehler einzugrenzen (gdb nicht vergessen) den dazugehörigen Code zu posten (aber nicht alles) eine möglichst konkrete Frage zu stellen Wenn Ihnen das schwer fällt, bauen Sie ein minimales Beispiel, bei dem der Fehler auftritt Dazu nach und nach Code entfernen bzw. vereinfachen 6

Referenzen und Zeiger 1/2 Wiederholung * Mit * bei einer Deklaration deklariert man eine Zeigervariable = die Adresse von einem Stück Speicher int* p = new int; // Pointer to 4 bytes in memory. Mit * vor einer Zeigervariablen bekommt man den Inhalt des Speichers, der unter dieser Adresse steht *p = 42; // Set value to 42. printf("%d\n", *p); // Prints 42. Es kann ohne Probleme mehrere Zeiger geben, die auf dasselbe Stück Speicher zeigen int* q = p; // *q ist now also 42. 7

Referenzen und Zeiger 2/2 Wiederholung & Mit & vor einer normalen Variablen bekommt man die Adresse dieser Variablen int* p = &x; // p is now the address of x. Mit & bei einer Deklaration erhält man eine Variable, die auf denselben Speicher zeigt wie eine andere int& y = x; // Make y an alias for x. y = 42; // Assign the value 42 to y. printf("%d\n", x); // Prints 42. Es kann ohne Probleme mehrere solcher Aliase für einund dasselbe Stück Speicher geben int& z = y; // Value of z is now also 42. 8

Templates 1/8 Motivation Manchmal hat man Klassen, die man fast genauso auch für einen anderen Typ braucht, zum Beispiel class ArrayInt {... methods int* _elements; }; class ArrayFloat {... methods float* _elements; }; Der Code ist fast identisch, außer dass an diversen Stellen in der einen Klasse int und in der anderen float steht Solche "code duplication" ist immer schlechter Stil Wenn man in der einen Klasse was ändert, ist die Gefahr groß, dass man es in der anderen vergisst Außerdem ist es unnötige (nicht ganz) doppelte Arbeit 9

Templates 2/8 Motivation Mit Templates kann man einen oder mehrere Typen bei der Implementierung "offen lassen" template<class T> class Array { methods T* _elements; } Erst bei der Deklaration gibt man dann den Typ an Array<int> a1; Array<float> a2; Array<char> a3; // Array of ints. // Array of floats. // Array of chars. Das < > ist dabei Teil des Klassennamens Der Compiler erzeugt in der Tat für jedes T anderen Code 10

Templates 3/8 Instanziierung Bei Template-Klassen wird durch die Implem. in der.cpp Datei noch kein Code erzeugt siehe nm C Array.o Um Code zu erzeugen, muss man sagen für welche Typen T man die Klasse gerne hätte Dafür gibt es zwei Alternativen Alternative 1: Implementierung in der.h Datei Alternative 2: Explizite Instanziierung in der.cpp Datei Beide Alternativen haben Vor- und Nachteile Wir bevorzugen in dieser Veranstaltung Alternative 2 11

Templates 4/8 Instanziierung, Alternative 1 Die Deklaration wie gehabt in der.h Datei Man schreibt die Implementierung, die normalerweise in der.cpp Datei steht, AUCH in die.h Datei Vorteil: Klasse wird erzeugt wenn sie gebraucht wird #include "./Array.h"... Array<int> arrayint; // Here Array<int> gets compiled. Nachteil: Wenn in 10 verschiedenen Dateien Array<int> benutzt wird, wird der Code dafür 10 mal kompiliert Aber ok, wenn der Code schnell zu kompilieren ist 12

Templates 5/8 Instanziierung, Alternative 2 Explizite Code-Erzeugung am Ende der.cpp Datei template class Array<int>; // Compile Array<int> here. template class Array<float>; // Compile Array<float> here. Vorteil: Code für Array<int> und Array<float> wird jetzt nur einmal erzeugt und steht in der entspr..o Datei Nachteil: Man muss sich entscheiden, für welche T man den Code haben will und für welche nicht Insbesondere ist das unmöglich für Bibliotheken, wo man gar nicht wissen kann, für welchen Typ T jemand die Template-Klasse später mal benutzen will 13

Templates 6/8 Template-Funktionen Man kann auch nur einzelne Funktionen "templatisieren" template<class T> T cube(t x) { return multiply(multiply(x, x), x); }... int n = 3; printf("n^3 = %d\n", cube<int>(n)); // Prints 27. Erst beim Aufruf wird die Funktion für diesen Typ kompiliert Und auch dann erst dann gibt es ggf. Fehlermeldungen Man kann beim Aufruf statt cube<int> auch cube schreiben... der Compiler findet den Typ dann selber heraus 14

Templates 7/8 Fehlermeldungen Sind oft sehr lang und verwirrend FileX:123: instantiated from [some function] FileY:456: instantiated from [some other function]... FileZ:789: instantiated from [yet another function] SomeFile.cpp:666: instantiated from here SomeFile.h:555: error: [some error message] 15 Am wichtigsten sind dabei meistens die letzten Zeilen Die Zeile mit "instantiated from here" sagt, wo das das Template zum ersten Mal konkret benutzt wird Die Zeile mit "error" sagt, wo beim Kompilieren im Template Code der Fehler aufgetreten ist

Templates 8/8 Spezialisierung Für einzelne Typen möchte man die Klasse vielleicht ganz anders implementieren, oft aus Effizienzgründen Die Deklaration in der.h Datei schreibt man dann so template<> Array<bool> { // Different implementation, packing 8 Bits in 1 Byte. } Die Implementierung in der.cpp Datei dann ohne template Array<bool>::get {... } Bemerkung: die spezialisierte Klasse kann auch ganz andere Memberfunktionen- und variablen haben 16

Bitweise Operatoren 1/2 Beispiele char x = 7; char y = 18; // 00000111 in binary // 00010010 in binary. Oder, Und, Exklusiv-Oder, Negation x y // 00010111 in binary = 23. x & y // 00000010 in binary = 2. x ^ y // 00010101 in binary = 21. ~x // 11111000 in binary = 248. Bits nach rechts oder links schieben x << 2 // 00011100 in binary = 28. y >> 3 // 00000010 in binary = 2. 17

Bitweise Operatoren 2/2 Fortsetzung Das geht genauso mit anderen Typen, z.b. int Es werden dann entsprechend mehr Bits auf einmal manipuliert, beim int z.b. typischerweise 32 Bits Moderne Rechner haben auch 256-Bit oder sogar 512-Bit Register Mit Bit-Operationen darauf (oft in Hardware gegossen) kann man einiges an Performance herausholen 18

Hinweise zum Übungsblatt 1/2 Der Typ char In C/C++ steht der Typ char für den Inhalt von einem einzigen Byte also 256 verschiedene Werte Es gibt eine Variante mit und eine ohne Vorzeichen: signed char: Werte im Bereich -128.. 127 unsigned char: Werte im Bereich 0.. 255 Wichtig: char ohne Angabe ist ein signed char Wenn man den Wert eines char als Index für ein Feld benutzen will, sollte man ihn als unsigned char casten char c = ; unsigned char i = static_cast<unsigned char>(c); 19

Hinweise zum Übungsblatt 2/2 Unit Tests Die Unit Tests sind für dieses Übungsblatt vorgegeben Das sollte Ihnen erstens Arbeit sparen Und dient zweitens automatisch auch als Spezifikation dafür, was Ihre Klasse machen soll Deshalb diesmal keine gesonderte TIP Datei 20

Literatur / Links Alles zu Templates http://www.cplusplus.com/doc/tutorial/templates Bitweise Operatoren http://www.cplusplus.com/doc/tutorial/operators/ 21