C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

Ähnliche Dokumente
Programmierung mit C Zeiger

Modellierung und Programmierung 1

1. Übung zu "Numerik partieller Differentialgleichungen"

C++ Programmierung. Uwe Naumann. LuFG Informatik 12, RWTH Aachen University, Germany

Deklarationen in C. Prof. Dr. Margarita Esponda

Programmieren in C++ Arrays, Strings und Zeigerarithmetik

Einführung in die Programmierung Arrays, Zeiger, Strings. Arvid Terzibaschian

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

2. Programmierung in C

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

Zusammenfassung des Handzettels für Programmieren in C

Die Programmiersprache C99: Zusammenfassung

Objektorientierte Programmierung mit C++ Vector und List

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Dr. Monika Meiler. Inhalt

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

Von Java nach C++ Dr. Frank Weichert Lehrstuhl Informatik VII Technische Universität Dortmund

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Vorkurs C++ Programmierung

Von Java nach C++ Frank Weichert, Heinrich Müller Informatik VII Universität Dortmund

Tutorium Rechnerorganisation

Java Einführung Klassendefinitionen

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

Dr. Monika Meiler. Inhalt

Java Einführung Methoden in Klassen

Primitive Datentypen und Felder (Arrays)

Konstruktoren und Destruktoren Initialisierung von Objekten

2. Semester, 2. Prüfung, Lösung

Zusammengehörige Daten struct. Strukturierte Datentypen und Funktionszeiger. Zugriff auf struct-elemente. Variablendeklarationen mit struct

Der C++ Crashkurs v1.0

9 Zeiger (Pointer). Dynamischer Speicher

Einführung in die Programmierung (EPR)

FHZ. K20 Arrays. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

Klausur in Programmieren

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Funktionen und Parameter

Einführung in die Programmiersprache C

Typische Speicherfehler in C

C/C++ Programmierung

String s1, s2; Eine Zuweisung geschieht am einfachsten direkt durch Angabe des Strings eingeschlossen in doppelte Hochkommata:

magnum C++ WALTER SAUMWEBER kompakt komplett kompetent

C++-Zusammenfassung. H. Schaudt. August 18, 2005

Kurze Einführung in die Programmiersprache C++ und in Root

Einführung in die STL anhand eines ausgewählten Beispiels

In der Computersprache C ist die Standardmethode zur Behandlung von Matrizen durch

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Repetitorium Informatik (Java)

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Programmierung mit C Speicherverwaltung

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Objektorientierte Programmierung OOP Programmieren mit Java

C++ - Eine Ubersicht fur Java-Programmierer

C-Propädeutikum Höhere Datentypen

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Programmieren in C. Die C-Standardbibliothek. Prof. Dr. Nikolaus Wulff

11. Übung Informatik II - Operatorfunktionen

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

Zugriff auf die Modul-EEPROMs

Meeting C++ C++11 R-Value Referenzen

Array-Verwaltung. Array-Verwaltung im Speicher Illustration. Zuweisung von Arrays. Speicherbereinigung. Aliasierung Eine Besonderheit

Technische Infor matik 2 C/C++-Kurs. Pointer und Arrays AG Rechner netze 2.1

Kurzeinführung in C/C++ Elementare Datentypen in C++

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

11.3 Virtuelle Methoden

Speicherverwaltung. Objektorientierte Programmierung. (Winter 2006/2007) Lebensdauer von Objekten. new, delete. Beispiel: Verkettete Listen

Algorithmen und Datenstrukturen

Prof. W. Henrich Seite 1

Wiederholung und Vertiefung. Programmieren in C. Pointer und so... thoto. /dev/tal e.v. 6. April 2013 (Version vom 11. April 2013) Programmieren in C

Mehr zu Datentypen: Felder, Zeiger und Strukturen

Einführung in die Programmierung

Strukturierte Datentypen und Funktionszeiger

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Javakurs für Anfänger

Klausur C++ #1 Jahr: 2001; Dozent: Dipl.Ing. Sorber

C++ - Funktionen und mehr. Kerstin Gößner und Ralf Wondratschek

Übungsaufgaben: 1. Objektorientierte Programmierung - Teil 1

5.4 Klassen und Objekte

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Es gibt zwei verschiedene Arten, wie Programme auf dem Rechner ausgeführt werden:

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Klausur in Programmieren

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Programmierkurs. SoSe Markus Geveler Inst. f. Applied Mathematics, TU Dortmund.

Grundlagen der Programmiersprache C++

Übungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks)

Modellierung und Programmierung

Angewandte Mathematik und Programmierung

Programmiersprachen Einführung in C

JAVA KURS COLLECTION

Objektorientiertes Programmieren für Ingenieure

Einführung in die Java- Programmierung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Early first draft Höllische Programmiersprachen Seminar im WS 2014/15 Speichermanagement

Transkript:

C++ Teil 5 Sven Groß 13. Mai 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 1 / 18

Themen der letzten Vorlesung Funktionen Funktionsüberladung, Signatur Rekursion const-deklaration Referenzen Zeiger Felder Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 2 / 18

Heutige Themen 1 Wdh.: Zeiger und Felder 2 Dynamische Speicherverwaltung 3 Casts bei Zeigern 4 Vektoren Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 3 / 18

Wdh.: Zeiger (Pointer) Variable, die eine Speicheradresse enthält int i= 5; double d= 47.11; int * iptr ; // Zeiger auf int double * dptr ; // Zeiger auf double Adressoperator & liefert Zeiger auf Variable (nicht zu verwecheln mit Referenz-Deklaration) iptr = &i; dptr = &d; Dereferenzierungsoperator * liefert Wert an Speicheradresse (nicht zu verwecheln mit Zeiger-Deklaration) cout << (* dptr ); // gibt d aus (* iptr )= 42; // i ist jetzt 42 dptr d Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 4 / 18

Beispiel: Referenzen und Zeiger 1 int a= 3; 2 int & r= a; // int - Referenz auf a 3 int *p= &a; // int - Zeiger auf a 4 // a hat Wert 3, r verweist auf 3, p zeigt auf 3 5 6 a+= 4; 7 cout << (* p) << endl ; 8 // a hat Wert 7, r verweist auf 7, p zeigt auf 7 9 10 r -= 2; 11 cout << a << endl ; 12 // a hat Wert 5, r verweist auf 5, p zeigt auf 5 13 14 (*p)= r*a; 15 cout << r << endl ; 16 // a hat Wert?, r verweist auf?, p zeigt auf? Quiz: Was verändert sich, wenn wir p als Zeiger auf const int deklarieren? Wie würde die Deklaration von p aussehen? Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 5 / 18

Wdh.: Felder (Arrays) Wichtiger Verwendungszweck für Zeiger: Felder Nummerierung der Einträge beginnt bei 0, endet bei n-1 Zugriff auf Einträge mit [ ]-Operator keine Bereichsprüfung (Speicherverletzung!!) double feld [5]= // legt ein Feld von 5 doubles an { 1, 2}; // ( initialisiert mit 1 2 0 0 0), // feld ist ein double - Zeiger for ( int i =2; i <5; ++i) feld [ i]= 0.7; // setzt Eintraege 2...4 cout << (* feld ); // gibt ersten Eintrag aus // ( feld [0] und * feld synonym ) feld [0] [1] [2] [3] [4] cout << feld [5]; // ungueltiger Zugriff! // Kein Compilerfehler, evtl. // Laufzeitfehler ( segmentation fault ) Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 6 / 18

Initialisierung von Feldern Felder können bei Erzeugung auch initialisiert werden, in diesem Fall muss die Länge nicht spezifiziert werden. double werte [5]= { 1.1, 2.2, 3.3, 4.4, 5.5}; // legt ein Feld von 5 doubles an // und initialisiert es mit geg. Werten double zahl [5]= { 1.1, 2.2}; // ( Rest mit Null initial.) int lottozahlen []= { 1, 11, 23, 29, 36, 42}; // legt ein Feld von 6 ints an ( ohne Laengenangabe ) // und initialisiert es mit geg. Werten int vertex_of_edge [3][2]= { {1, 2}, {0, 2}, {0, 1} }; // legt ein zweidimensionales int - Feld an // mit 3 x2 gegebenen Werten. Typ : int ** v 0 Quiz: Welchen Typ hat der Ausdruck vertex_of_edge[1]? Wie kann ich den 1. Eckpunkt der 3. Kante abfragen? v 2 e 1 e 2 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 7 / 18 e0 v 1

Kopieren von Feldern double werte [5]= { 1.1, 2.2, 3.3, 4.4, 5.5}; double * nocheinfeld = werte ; // kopiert nur den Zeiger!!! nocheinfeld [2]= 99; // veraendert werte [2]!!! double auchfalsch [5]; // reserviert neuen Speicher (5 doubles ), // auchfalsch = werte ; // Compilerfehler double richtig [5]; // neuen Speicher reservieren for ( int i =0; i <5; ++i) richtig [ i]= werte [ i]; // Werte kopieren Vorsicht beim Kopieren von Feldern! Zuweisung = verändert nur den Zeiger, nicht aber den Feldinhalt Kopie benötigt eigenen Speicher Eintrag für Eintrag kopieren Alternative für Felder: Vektoren bequem mit = kopieren (dazu später mehr) Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 8 / 18

Spezielle char-felder: C-Strings Relikt aus C-Zeiten: C-Strings char-felder hören mit Terminationszeichen \0 auf Initialisierung mit "..." char cstring []= " Hallo "; // Zeichenkette mit 5 Zeichen, aber Feld mit 6 chars // { H, a, l, l, o, \0 } char message []= " Hier spricht Edgar Wallace \n"; // noch ein C- String string botschaft = message ; // C ++ - String, der mit C- String initialisiert wird const char * text = botschaft. c_str (); //... und wieder als C- String Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 9 / 18

Zeigerarithmetik Zeiger + int liefert Zeiger: double wert [5]= { 1.1, 2.2, 3.3, 4.4, 5.5}; cout << (* wert ); // gibt ersten Eintrag aus // ( wert [0] und * wert synonym ) double * zeig = wert + 3; cout << (* zeig ); // gibt vierten Eintrag aus // ( wert [3] und *( wert +3) synonym ) double * ptr = &( wert [2]); ptr ++; bool same = ( zeig == ptr ); // true Zeiger Zeiger liefert int (Abstand): int differenz = zeig - ptr, index = zeig - wert ; wert zeig [0] [1] [2] [3] [4] Quiz: Werte von differenz und index? Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 10 / 18

Beispiel: so geht es nicht... Beispiel: Funktion, die ein Feld kopieren soll double * copy ( double * original, int n) { double kopie [ n]; // statisches Feld for ( int i =0; i<n; ++i) kopie [i]= original [i]; return kopie ; } int main () { double zahlen [3]= { 1.2, 3.4, 5.6}; double * zahlenkopie ; zahlenkopie = copy ( zahlen, 3);... return 0; } Das funktioniert so nicht! Quiz: Wieso? Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 11 / 18

Dynamische Speicherverwaltung dynamische Felder, falls Speicher vor Verlassen des Scopes freigegeben werden soll falls Speicher nach Verlassen des Scopes freigegeben werden soll (in C: falls Länge erst zur Laufzeit festgelegt werden soll) Speicherplatz belegen (allocate) mit new Speicherplatz freigeben (deallocate) mit delete, passiert nicht automatisch! int * feld = new int [5]; // legt dyn. int - Feld der Laenge 5 an int * iptr = new int ; // legt dynamisch neuen int an... delete [] feld ; // Speicher wieder freigeben delete iptr ; Strikte Regel: Auf jedes new (bzw. new[]) muss später ein zugehöriges delete (bzw. delete[]) folgen! Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 12 / 18

Dynamische Speicherverwaltung (2) normale Variablen: (automatische Speicherverwaltung) werden erzeugt bei Variablendeklaration werden automatisch zerstört bei Verlassen des Scope dynamische Variablen: (dynamische Speicherverwaltung) werden erzeugt mit new (liefert Zeiger auf neuen Speicher zurück) werden zerstört mit delete (Freigabe des Speichers) volle Kontrolle = volle Verantwortung! Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 13 / 18

Dynamische Speicherverwaltung (3) 1 { 2 double x= 0.25, * dptr = 0; // neue double - Var. x, 3 // neuer double - Zeiger dptr 4 5 int * iptr = 0, a= 33; // neue int - Var. a, 6 // neuer int - Zeiger iptr 7 { 8 double y= 0.125; // neue double - Var. y 9 dptr = new double ; // neue double - Var. ( ohne Namen ) 10 * dptr = 0.33; 11 iptr = new int [4]; // neues int - Feld ( ohne Namen ) 12 13 } // Ende des Scope : y wird automatisch zerstoert 14 for ( int i =0; i <4; ++ i) 15 iptr [i]= i*i; 16... 17 delete [] iptr ; // int - Feld wird zerstoert 18 delete dptr ; // double - Var. wird zerstoert 19 20 } // Ende des Scope : Var. x, a werden automatisch zerstoert, 21 // Zeiger dptr, iptr werden automatisch zerstoert. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 14 / 18

Beispiel: so ist es richtig Beispiel: Funktion, die ein Feld kopieren soll double * copy ( double * original, int n) { double * kopie = new int [ n]; // dynamisches Feld for ( int i =0; i<n; ++i) kopie [i]= original [i]; return kopie ; } int main () { double zahlen [3]= { 1.2, 3.4, 5.6}; double * zahlenkopie ; zahlenkopie = copy ( zahlen, 3);... delete [] zahlenkopie ; // Speicher wieder frei geben return 0; } Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 15 / 18

Casts bei Zeigern void Ausgabe ( const double * feld, int n) {... } int main () { double data []= { 47, 11, 0, 8, 15}; } Ausgabe ( data, 5); return 0; Impliziter Cast double* const double* bei Aufruf von Ausgabe const ermöglicht nur Lesezugriff auf Einträge von feld, verhindert, dass Einträge von data versehentlich in der Funktion Ausgabe verändert werden Best Practice: const benutzen, wenn möglich mehr Datensicherheit Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 16 / 18

for ( int i =0; i < w. size (); ++ i) w[i]= 0.07; Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 17 / 18 Vektoren C++-Alternative zu C-Feldern (Arrays) ein Datentyp aus der STL (Standard Template Library) Datentyp der Einträge bei Deklaration angeben, z.b. vector<double> Angabe der Größe bei Deklaration oder später mit resize, Abfrage der Größe mit size zusammenhängender Speicherbereich garantiert, aber möglicherweise keine feste Adresse Zugriff auf Einträge mit [ ]-Operator: Nummerierung 0,..., n-1, keine Bereichsprüfung! # include < vector > using std :: vector ; vector < double > v(2), w; w. resize (5);

Vektoren (2) w. push_ back ( 4.1); // haengt neuen Eintrag hinten an v. pop_ back (); // letzten Eintrag loeschen double * ptr = &(v [0]); v= w; // Zuweisung, passt Groesse von v an // ptr zeigt evtl auf ungueltigen Speicherbereich!! Zuweisung = funktioniert wie erwünscht (im Gegensatz zu Feldern) 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, auch dazu später mehr Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 18 / 18