Hochschule Fulda – FB AI Sommersemester 2017

Slides:



Advertisements
Ähnliche Präsentationen
Einführung in die Programmiersprache C/C++
Advertisements

der Universität Oldenburg
Klassen - Verkettete Liste -
Hochschule Fulda – FB ET Sommersemester 2010
Konzepte objektorientierter Systeme
Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Donnerstag Andreas Döring SS 2004.
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Dynamische Datentypen
Indirekte Adressierung
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
Konstruktoren.
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: Benutztes Objekt kennt den Kontext seiner Nutzung nicht. Daher kann es in besonderen Situationen keine Entscheidung.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
Abstrakter Datentyp in C++ I - Klasse -
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Einführung in die Programmierung
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Programmieren in C Zeichen-/Stringfunktionen Dynamischer Speicher
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Informatik 1 Letzte Übung.
Dynamische Datentypen
Programmieren in C Dynamische Listen / Bäume
EPROG Tutorium #3 Philipp Effenberger
Programmieren in C Grundlagen C 2
Informatik II Grundlagen der Programmierung Programmieren in C printf() mit variabler Feldbreite Hochschule Fulda – FB ET Sommersemester 2014
Hochschule Fulda – FB ET Sommersemester 2014
Programmieren in C Module und Bibliotheken Hochschule Fulda – FB AI Sommersemester Peter Klingebiel, HS Fulda, DVZ.
Programmieren in C Grundlagen C 2
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
early binding (frühe Bindung) late binding (späte Bindung)
Ausnahmen Vorlesung besteht aus zwei Teilen Programmierung (4 SWS)
Vererbung. Klassen - Vererbung  Eine Klasse kann von einer Basisklasse abgeleitet werden  Die abgeleitete Klasse erbt die Eigenschaften und Methoden.
Die STL. Schreiben und Lesen von Dateien  Einbinden von  Lesen und Schreiben über stream-Objekte Streams führen Transformationen zwischen Programmobjekten.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Singletons, Exceptions und (s)printf. Template Klassen  äquivalent zu Template-Funktionen  beim Erzeugen von Instanzen muss der Typ angegeben werden.
Tutorium Software-Engineering SS14 Florian Manghofer.
Programmieren in C / C++ Klassen und Vererbung, Templates
Programmieren in C Dynamische Listen / Bäume
Konstruktoren.
Programmieren in C Zeichen-/Stringfunktionen Dynamischer Speicher
Dynamischer Speicher malloc wird in c++ eher nicht mehr verwendet.
Programmieren in C / C++ Erste Schritte mit C++ Klassen und Objekte
Programmieren in C Grundlagen C 2
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
Programmieren in C Wie speichert C
Programmieren in C Module und Bibliotheken
Einführung in die Programmierung
Einführung in die Programmierung
Polymorphie Überladen
Ausnahmen Exceptions Definition Ausnahmen erzeugen Ausnahmen abfangen
Implementieren von Klassen
Objektorientierte Programmierung
 Präsentation transkript:

Programmieren in C / C++ Weitere Features von C++ C++ und Embedded Systems Hochschule Fulda – FB AI Sommersemester 2017 http://c.rz.hs-fulda.de Peter Klingebiel, HS Fulda, FB AI

default Parameter 1 C++ erlaubt voreingestellte Parameter für Funktionen Beispiel: int mul(int, int); ... int mul(int p1 = 1, int p2 = 2) { return p1 * p2; } ... cout << "2 integer: "; int a, b; cin >> a >> b; // a = 3, b = 4 cout << mul(a, b); // -> 12 (3 * 4) cout << mul(a); // -> 6 (3 * 2) cout << mul(); // -> 2 (1 * 2) Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

ranged-based und auto 1 C++ kennt range-based Schleifen (ab C++11) int ai[] = { 11, 22, 33, 44, 55 }; for(int i = 0; i < 5; i++) // wie C-Schleife cout << ai[i]; // -> 1122334455 for(int i : ai) // range-based -> i=ai[0]..i=ai[4] cout << i; // -> 1122334455 C kennt Spezifizierer auto für automatische Variable C++ spezifiziert mit auto einen Typ, der vom Compiler passend zum Scope konkretisiert wird Beispiel (von oben): Array durchlaufen for(auto i : ai) // range-based -> i=ai[0]..i=ai[4] cout << i; // -> 1122334455 Compiler typisiert korrekt zur Compilezeit! Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Überladen von Operatoren 1 wie Funktionen können auch Operatoren überladen werden. Beispiel Klasse für komplexe Zahlen: class complex { private: double re, im; // Real- und Imaginärteil public: friend complex operator+ (complex &a, complex &b); }; complex operator+ (complex &a, complex &b) { complex c; c.re = a.re + b.re; c.im = a.im + b.im; } ... complex a(1.1, 2.2), b(3.3, 4.4), c; c = a + b; // c.im -> 4.4, c.re -> 6.6 ... Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Virtuelle Funktionen 1 Polymorphismus: wesentlicher Bestandteil der objektorientierten Programmierung Polymorphismus  die gleiche Methode wird von unterschiedlichen Klassen / Objekten genutzt und hat i.d.R. unterschiedliche Resultate Beispiel: von einer Basisklasse Tier werden die Klassen Hering und Maus abgeleitet, die Methode bewegen() ist für jedes Tier allerdings sehr spezifisch und unterschiedlich Realisierung in C++ über virtual functions Klasse ist polymorph, wenn sie virtual functions hat Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Virtuelle Funktionen 2 einfaches Beispiel class Zahl { // Basisklasse public: virtual void print() = 0; // muss sein }; class IntZahl : public Zahl { // abgeleitete Klasse private: int val; public: IntZahl(int i) { val = i; } virtual void print() { cout << val; } }; Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Virtuelle Funktionen 3 einfaches Beispiel (Fortsetzung) class FloatZahl : public Zahl { // abgleitete Klasse private: float val; public: FloatZahl(float f) { val = f; } virtual void print() { cout << val; } }; int main() { IntZahl iz(4711); FloatZahl fz(3.141); iz.print(); // -> 4711 fz.print(); // -> 3.141 } Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Container 1 die C++ Standardbibliothek (STL) kennt generische Containerklassen, in denen Daten gleichen Typs komfortabel zusammengefasst werden z.B. array, vector, list u.a. mit Methoden wie begin(), end(), at() u.a.m. Beispiel: Vektor/eindimensionales Feld durchlaufen vector<int>vi { 1, 2, 3, 4, 5 }; vector<string>vs {"AA", "BB", "CC", "DD", "EE" }; ... for(int i = 0; i < 5; i++) cout << vi.at(i); // -> 12345 for(int i = 0; i < 5; i++) cout << vs.at(i); // -> AABBCCDDEE Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Container 2 Beispiel (Fortsetzung): Vektoren durchlaufen vector<int>vi { 1, 2, 3, 4, 5 }; vector<string>vs { "AA", "BB", "CC", "DD", "EE" }; ... for(auto a = vi.begin(); a != vi.end(); a++) cout << *a; // -> 12345 for(auto a = vs.begin(); a != vs.end(); a++) cout << *a; // -> AABBCCDDEE noch besser: range-based für Schleifen for(auto a : vi) cout << a; // -> 12345 for(auto a : vs) cout << a; // -> AABBCCDDEE Compiler typisiert korrekt zur Compilezeit! Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Smart Pointer 1 dynamische Daten mit new und delete sind auch in C++ nur mit großer Vorsicht zu programmieren und sehr fehleranfällig Beispiel ... int *ip1 = new int; *ip1 = 4711; int *ip2 = ip1; ... cout << *ip1 << " " << *ip2; // -> 4711 4711 ... delete ip1; ... cout << *ip2; // ??? Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Smart Pointer 2 die STL bietet intelligente oder smart Pointer, die sehr viel sicherer sind und intern verwaltet werden Beispiel mit auto_ptr #include <memory> ... auto_ptr<int> ap1(new int); // ap1 erzeugen *ap1 = 4711; cout << *ap1 << endl; // -> 4711 auto_ptr<int>ap2; // ap2 anlegen ap2 = ap1; // Kopie von ap1? cout << *ap2 << endl; // -> 4711 cout << *ap1 << endl; // Fehler! ap2 ist Kopie von ap1, ap1 ist jetzt undefiniert! auto_ptr lassen nur eine Referenz zu! Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Smart Pointer 3 sind Kopien notwendig  shared_ptr verwenden, die mehrere Pointer auf ein Objekt zulassen #include <memory> ... shared_ptr<int> ap1(new int); // ap1 erzeugen *ap1 = 4711; cout << *ap1 << endl; // -> 4711 shared_ptr<int>ap2; // ap2 anlegen ap2 = ap1; // Kopie von ap1! cout << *ap2 << endl; // -> 4711 cout << *ap1 << endl; // -> 4711, ok! ap2 ist echte Kopie von ap1, ap1 bleibt erhalten! interner Zähler sorgt dafür, dass nur die Objekte frei-gegeben werden, die kein Pointer mehr referenziert Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Exceptions 1 die konventionelle Fehlerbehandlung überprüft i.d.R. Werte, z.B. Operanden oder Rückgabewerte auf Korrektheit und löst im Fehlerfall eine entsprechende Fehlerbehandlung aus Beispiele double divide(double a, double b) { if(b == 0) // Fehler! else return a / b; } ... char *p = malloc(4711); if(p == NULL) // Fehler! Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Exceptions 2 für Fehlerbehandlung führt C++ die Überwachung eines Blocks mit try und das Auslösen einer Exception mit throw ein try { if(b == 0) throw "Division durch 0!"; else ... } die Exception wird mit catch abgefangen catch(const char *msg) { cout << "Exception: " << msg << endl; ... } Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

Exceptions 3 diese Art der Fehlerbehandlung mit Exceptions ist zwar relativ sicher aber sehr aufwendig leider werden viele Ausnahmebedingungen, insbesondere Hardware-Exceptions wie Division durch 0 von den meisten C++-Compilern nicht abgefangen es gibt aber viele in den C++-Libraries definierte Standard-Ausnahmebedingungen, die sich mit Exceptions abfangen lassen in der Arduino-IDE sind Exceptions nicht möglich Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

C++ für Embedded Systems 1 C++-Mythen: C++ ist viel zu langsam C++ generiert übelsten Maschinencode Objekte sind viel zu groß virtuelle Funktionen sind tierisch langsam C++ ist nicht ROM-fähig Klassenbibliotheken erzeugen riesig große Binaries Abstraktion führt zu totaler Ineffizienz ... stimmt das denn überhaupt? Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

C++ für Embedded Systems 2 alles was C kann, kann C++ auch viele C++-Funktionalitäten und -Features werden vom Front-End, vom Compiler erledigt  kein Einfluß auf Codegenerierung und Laufzeit! Überladung von Funktionen und Operatoren Referenzen Klassen, Objekte und Memberfunktionen Vererbung Konstruktoren und Destruktoren Namespaces Templates usw. Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

C++ für Embedded Systems 3 Einfluß auf Codegenerierung und Laufzeit: z.B. virtuelle Funktionen Tabelle für virtuelle Methoden im Objekt (vtable) Referenzierung aus Tabelle vor Funktionsaufruf z.B. Exceptions Überwachung eines Bereichs (try) Auslösen und Abfangen (throw, catch) z.B. Umgang mit dynamischem Speicher Memoryleaks u.ä. ggfs. andere Verfahren für dynamischen Speicher ... Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

C++ für Embedded Systems 4 kurzes Resume: C++ ist hervorragend für Programmierung von Embedded Systems geeignet wenn Codegröße und / oder Laufzeit gefordert sind, sollte auf einige Features von C++ verzichtet werden virtuelle Funktionen Exceptions usw. die kommenden Standards C++17 und C++20 werden weitere spezifische Sprachelemente für die Programmierung von Embedded Systems enthalten Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI