Mapra: C++ Teil 2 Felix Gruber, Sven Groß IGPM 2. Mai 2017 Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai 2017 1 / 11
Themen vom letzten Mal Kontrollstrukturen Funktionen const Referenzen Zeiger dynamische Felder Rekursion Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai 2017 2 / 11
Heutige Themen 1 Graphisches Debuggen 2 Zusammengesetzte Datentypen Strukturen (Structs) Überladen von Operatoren 3 Vektoren Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai 2017 3 / 11
Debuggen mit gdb und ddd/kdbg Programm mit -g compilieren für Debuggingsymbole bzw. g ++ -g -o prog < Quelltexte und Objektdateien > g ++ -g -c quelltext. cpp g ++ -g -o prog quelltext. o weiteredateien. o Starte Debugger mit gdb prog (textbasiert) oder ddd prog bzw. kdbg prog (für grafisches Front-End) Code::Blocks besitzt auch ein grafisches Front-End zum gdb Demo Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai 2017 4 / 11
Wdh.: Häufig benötigte gdb-befehle break setze Breakpoint, benötigt Zeilennummer oder Funktionsnamen als Argument run starte das Programm next führe nächste Zeile im Quelltext aus step führe nächste Zeile aus, gehe dabei ggf. in aufgerufene Funktion print gibt den Wert des als Argument übergebenen Ausdrucks aus set variable i = 42 setzt i auf 42 backtrace zeige stack trace an frame 1 wechsele in Stack-Frame 1 continue Angehaltenes Programm normal weiterlaufen lassen quit beende Debug-Session und gdb Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai 2017 5 / 11
Wdh.: Literatur zu gdb Free Software Foundation. Debugging with GDB: The GNU Source-Level Debugger. GNU Press, 10th edition, 2014. https://sourceware.org/gdb/current/onlinedocs/gdb/. Norman Matloff and Peter Jay Salzman. The Art of Debugging with GDB, DDD, and Eclipse. No Starch Press, San Francisco, 2008. Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai 2017 6 / 11
Wdh.: gdb-tutorials Norman Matloff. Guide to faster, less frustrating debugging, 2002. http://heather.cs.ucdavis.edu/~matloff/unixandc/clanguage/ Debug.html. Ryan M. Schmidt. RMS s gdb debugger tutorial. http://www.unknownroad.com/rtfm/gdbtut/gdbtoc.html. Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai 2017 7 / 11
Strukturen (Structs) Strukturen: Zusammenfassung unterschiedlicher Datentypen zu einem neuen benutzerdefinierten Datentyp z.b. neuer Datentyp Datum: int string int struct Datum { int Tag ; string Monat ; int Jahr ; }; // Semikolon nicht vergessen! Datum MamasGeb, MeinGeb ; MamasGeb. Tag = 12; MamasGeb. Monat = " Februar "; MamasGeb. Jahr = 1954; MeinGeb = MamasGeb ; // Zuweisung MeinGeb. Jahr += 30; // ich bin genau 30 Jahre juenger Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai 2017 8 / 11
Überladen von Operatoren (operator overloading) praktisch wäre, folgendes schreiben zu können: if ( MamasGeb < MeinGeb ) // Datumsvergleich cout << " Mama ist aelter als ich."; möglich, wenn man folgende Funktion definiert: bool operator < ( const Datum & a, const Datum & b) {... } Das nennt man Operatorüberladung. MamasGeb < Urlaub ist dann äquivalent zum Funktionsaufruf operator<( MamasGeb, Urlaub ) für viele Operatoren möglich, z.b. + - * / == >> << usw., je nach konkretem Datentyp sinnvoll Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai 2017 9 / 11
Vektoren Alternative zu C-Feldern (Arrays) ein Datentyp aus der STL (Standard Template Library) Datentyp der Einträge bei Deklaration angeben, z.b. vector<datum> Angabe der Größe bei Deklaration oder später mit resize, Abfrage der Größe mit size Zugriff auf Einträge mit [ ]-Operator Nummerierung 0,..., n-1, keine Bereichsprüfung! # include < vector > using std :: vector ; vector < double > vec1 (2), vec2, vec3 ; vec2. resize (5); // Groesse auf 5 Eintraege aendern vec3. reserve (5); // Speicher reservieren, Groesse weiter 0 vec2 [0] = 1.; // erlaubter Zugriff vec3 [0] = 1.; // undefinierter Zugriff for ( int i =0; i< vec2. size (); ++i) vec2 [ i] = 0.07; Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai 2017 10 / 11
Vektoren (2) vec2. push_ back (4.1); // haengt neuen Eintrag hinten an, // d. h. vec2 [5] = 4.1 vec3. push_ back (4.1); // haengt neuen Eintrag hinten an, // d. h. vec3 [0] = 4.1 vec1 = vec2 ; // Zuweisung, passt Groesse von vec1 an vector < double >:: iterator it; for (it= vec1. begin (); it!= vec1. end (); ++ it) cout << (* it) << endl ; kein Vektor im mathematischen Sinne: arithmetische Operatoren (+, -, *) nicht implementiert Ändern der Länge führt evtl. zu Reallozierung an anderer Speicheradresse Vorsicht mit Zeigern! STL definiert weitere Container wie list, map, dazu später mehr Container verwenden Iteratoren statt Zeiger Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai 2017 11 / 11