> 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"> > 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">

Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Hochschule Fulda – FB AI Sommersemester 2017

Ähnliche Präsentationen


Präsentation zum Thema: "Hochschule Fulda – FB AI Sommersemester 2017 "—  Präsentation transkript:

1 Programmieren in C / C++ Weitere Features von C++ C++ und Embedded Systems
Hochschule Fulda – FB AI Sommersemester 2017 Peter Klingebiel, HS Fulda, FB AI

2 default Parameter 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

3 ranged-based und auto 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]; // -> for(int i : ai) // range-based -> i=ai[0]..i=ai[4] cout << i; // -> 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; // -> Compiler typisiert korrekt zur Compilezeit! Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

4 Ü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 -> Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

5 Virtuelle Funktionen 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

6 Virtuelle Funktionen 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

7 Virtuelle Funktionen 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(); // -> fz.print(); // -> } Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

8 Container 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); // -> for(int i = 0; i < 5; i++) cout << vs.at(i); // -> AABBCCDDEE Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

9 Container 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; // -> 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; // -> for(auto a : vs) cout << a; // -> AABBCCDDEE Compiler typisiert korrekt zur Compilezeit! Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

10 Smart Pointer 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; // -> delete ip1; ... cout << *ip2; // ??? Programmieren in C / C++ - Peter Klingebiel - HS Fulda - FB AI

11 Smart Pointer 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

12 Smart Pointer 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

13 Exceptions 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

14 Exceptions 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

15 Exceptions 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

16 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

17 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

18 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

19 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


Herunterladen ppt "Hochschule Fulda – FB AI Sommersemester 2017 "

Ähnliche Präsentationen


Google-Anzeigen