Dynamische Datentypen

Slides:



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

Imperative Programmierung
der Universität Oldenburg
Klassen - Verkettete Liste -
Zusammenfassung der Vorwoche
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Donnerstag Andreas Döring SS 2004.
der Universität Oldenburg
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Listen Richard Göbel.
Indirekte Adressierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Konstruktoren.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Programmieren mit JAVA
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 Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Zusammenfassung der Vorwoche Variable stehen für (einen) Wert, der sich im Programmablauf ändern kann. Variablen besitzen einen.
DVG Klassen und Objekte
Einführung in die Programmierung Datensammlung
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Einführung in die Programmierung
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
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
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
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 2008/09 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 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
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 Fachbereich.
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.
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 Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung
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 Programmiersprache C 4
Informatik 1 Letzte Übung.
Referenztypen (II) und Const- Referenzen Temporäre Objekte, Const- Referenzen, was genau ist konstant?
Arrays / Felder Themen: Arrays / Felder / Vektoren Was soll das eigentlich? Erstellen von Arrays Arrays auslesen. Wie sie verwaltet werden.
EPROG Tutorium #3 Philipp Effenberger
Java-Kurs - 3. Übung Hausaufgabe Arrays For-Schleifen.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
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.
Strukturen (Eigenschaften) Strukturen dienen zur Zusammenfassung mehrerer Komponenten verschiedener Typen zu einer Einheit, die dann mit gemeinsamen Namen.
Pointer. * und &  Bei der Definition int var1; ○ // „normale“ Variable int *var2; ○ // Zeiger auf einen Integer int *var2 = NULL; ○ // … incl. Initialisierung.
Dynamischer Speicher malloc wird in c++ eher nicht mehr verwendet.
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
 Präsentation transkript:

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

Probleme mit Feldern (variabler Länge) man kann sie nicht direkt kopieren und zuweisen

Probleme mit Feldern (variabler Länge) man kann sie nicht direkt kopieren und zuweisen falls Länge nicht zur Kompilierungszeit bekannt, muss Speicher explizit mit new geholt und mit delete[] wieder freigegeben werden (fehleranfällig)

Probleme mit Feldern (variabler Länge) man kann sie nicht direkt kopieren und zuweisen falls Länge nicht zur Kompilierungszeit bekannt, muss Speicher explizit mit new geholt und mit delete[] wieder freigegeben werden (fehleranfällig) sie können nicht wachsen/schrumpfen

Probleme mit Feldern (variabler Länge): Lösung Eine Klasse für Felder Realisiert korrekte Initialiserung und Zuweisung Automatische Speicherverwaltung (keine expliziten new und delete[] im Kundencode mehr notwendig)

Eine Klasse für Felder: Daten-Mitglieder und Konstruktor class array { public: typedef bool T; // nested type, easy to change // --- Constructor from int --------------------------- // PRE: n >= 0 // POST: *this is initialized with an array of length n array (const int n) : ptr (new T[n]), size (n) {} private: T* ptr; // pointer to first element int size; // number of elements };

Eine Klasse für Felder: Random Access Indexzugriff mittels Überladung von operator[](als Mitglieds-Funktion)

Eine Klasse für Felder: Random Access Indexzugriff mittels Überladung von operator[](als Mitglieds-Funktion) // --- Index operator (const) ------------------------- // PRE: the array has length at least i // POST: return value is i-th element (as a const ref.) const T& operator[] (const int i) const { return ptr[i]; }

Eine Klasse für Felder: Random Access Indexzugriff mittels Überladung von operator[](als Mitglieds-Funktion) // --- Index operator (const) ------------------------- // PRE: the array has length at least i // POST: return value is i-th element (as a const ref.) const T& operator[] (const int i) const { return ptr[i]; } Problem: erlaubt keinen schreibenden Zugriff wie in crossed_out[i] = false;

Eine Klasse für Felder: Random Access Zwei Überladungen von operator[]! // --- Index operator (const) ------------------------- // PRE: the array has length at least i // POST: return value is i-th element (as a const ref.) const T& operator[] (const int i) const { return ptr[i]; } // --- Index operator (non-const) ------------------------- // POST: return value is i-th element (as a reference) T& operator[] (const int i)

Eine Klasse für Felder: Sieb des Eratosthenes int main() { // input of n std::cout << “Compute prime numbers in [2, n) for n = ?”; unsigned int n; std::cin >> n; // definition and initialization: provides us with // Booleans crossed_out[0],..., crossed_out[n-1] bool* const crossed_out = new bool[n]; ... delete[] crossed_out; return 0; } Bisher

Eine Klasse für Felder: Sieb des Eratosthenes int main() { // input of n std::cout << “Compute prime numbers in [2, n) for n = ?”; unsigned int n; std::cin >> n; // definition and initialization: provides us with // Booleans crossed_out[0],..., crossed_out[n-1] array crossed_out (n); // constructor call ... delete[] crossed_out; return 0; } Neu

Eine Klasse für Felder: Sieb des Eratosthenes int main() { // input of n std::cout << “Compute prime numbers in [2, n) for n = ?”; unsigned int n; std::cin >> n; // definition and initialization: provides us with // Booleans crossed_out[0],..., crossed_out[n-1] array crossed_out (n); // constructor call ... delete[] crossed_out; return 0; } Fehler: crossed_out ist kein Standard-Feld, delete ist nicht verfügbar!

Eine Klasse für Felder: Sieb des Eratosthenes int main() { // input of n std::cout << “Compute prime numbers in [2, n) for n = ?”; unsigned int n; std::cin >> n; // definition and initialization: provides us with // Booleans crossed_out[0],..., crossed_out[n-1] array crossed_out (n); // constructor call ... return 0; } delete weglassen geht, aber dann entsteht ein Speicherleck

Eine Klasse für Felder: Sieb des Eratosthenes int main() { // input of n std::cout << “Compute prime numbers in [2, n) for n = ?”; unsigned int n; std::cin >> n; // definition and initialization: provides us with // Booleans crossed_out[0],..., crossed_out[n-1] array crossed_out (n); // constructor call ... return 0; } Diese Variable hat automatische Speicherdauer; dynamischer Speicher sollte mit der Variable automatisch “verschwinden”!

Eine Klasse für Felder: Der Destruktor spezielle Mitglieds-Funktion (Anti-Kon-struktor), die automatisch für jedes Klassen-Objekt aufgerufen wird, dessen Speicherdauer endet

Eine Klasse für Felder: Der Destruktor spezielle Mitglieds-Funktion (Anti-Kon-struktor), die automatisch für jedes Klassen-Objekt aufgerufen wird, dessen Speicherdauer endet // --- Destructor ------------------------------------- ~array () { delete[] ptr; } Destruktorname: ~T (keine Parameter)

Eine Klasse für Felder: Sieb des Eratosthenes int main() { // input of n std::cout << “Compute prime numbers in [2, n) for n = ?”; unsigned int n; std::cin >> n; // definition and initialization: provides us with // Booleans crossed_out[0],..., crossed_out[n-1] array crossed_out (n); // constructor call ... return 0; } Hier wird der Destruktor für die Klassenvariable crossed_out automatisch aufgerufen: das delete[] passiert “von selbst”!

Eine Klasse für Felder: Das Kopieren Spezieller Kopier-Konstruktor, der automatisch aufgerufen wird, wenn ein Wert der Klasse mit einem anderen Wert der Klasse initialisiert wird

Eine Klasse für Felder: Das Kopieren Spezieller Kopier-Konstruktor, der automatisch aufgerufen wird, wenn ein Wert der Klasse mit einem anderen Wert der Klasse initialisiert wird array a = b; vom Typ array

Eine Klasse für Felder: Der Copy-Konstruktor ...der Klasse T ist der eindeutige Konstruktor mit Deklaration T (const T& x);

Eine Klasse für Felder: Der Copy-Konstruktor ...der Klasse T ist der eindeutige Konstruktor mit Deklaration T (const T& x); wird automatisch aufgerufen, wenn Werte vom Typ T mit Werten vom Typ T initialisiert werden

Eine Klasse für Felder: Der Copy-Konstruktor ...der Klasse T ist der eindeutige Konstruktor mit Deklaration T (const T& x); wird automatisch aufgerufen, wenn Werte vom Typ T mit Werten vom Typ T initialisiert werden T x = t; // t vom Typ T

Eine Klasse für Felder: Der Copy-Konstruktor ...der Klasse T ist der eindeutige Konstruktor mit Deklaration T (const T& x); wird automatisch aufgerufen, wenn Werte vom Typ T mit Werten vom Typ T initialisiert werden T x (t); // t vom Typ T

Eine Klasse für Felder: Der Copy-Konstruktor ...der Klasse T ist der eindeutige Konstruktor mit Deklaration T (const T& x); wird automatisch aufgerufen, wenn Werte vom Typ T mit Werten vom Typ T initialisiert werden Initialisierung von formalen Funktions-Argumenten und Rückgabewerten

Eine Klasse für Felder: Der Copy-Konstruktor // --- Copy Constructor ------------------------------- // POST: *this is initialized from a array (const array& a) : ptr (new T[a.size]), size (a.size) { // now copy the elements of a into *this for (int i = 0; i < size; ++i) ptr[i] = a[i]; }

Eine Klasse für Felder: Der Copy-Konstruktor // --- Copy Constructor ------------------------------- // POST: *this is initialized from a array (const array& a) : ptr (new T[a.size]), size (a.size) { // now copy the elements of a into *this for (int i = 0; i < size; ++i) ptr[i] = a[i]; } Warum ist const array& a hier zwingend notwendig, während array a nicht geht ?

Eine Klasse für Felder: Der Copy-Konstruktor // --- Copy Constructor ------------------------------- // POST: *this is initialized from a array (const array& a) : ptr (new T[a.size]), size (a.size) { // now copy the elements of a into *this for (int i = 0; i < size; ++i) ptr[i] = a[i]; } Aufruf eines Copy-Konstruktors mit Deklaration array (array a); müsste den Copy-Konstruktor aufrufen (Initialisierung des formalen Arguments!); unendliche Rekursion!

Eine Klasse für Felder: Der Copy-Konstruktor Falls kein Copy-Konstruktor deklariert ist, so wird er automatisch erzeugt (und initialisiert mitgliedsweise)

Eine Klasse für Felder: Der Copy-Konstruktor Falls kein Copy-Konstruktor deklariert ist, so wird er automatisch erzeugt (und initialisiert mitgliedsweise) Das ist für unsere Klasse array nicht das, was wir wollen (es wird nur der Zeiger ptr kopiert, nicht jedoch das dahinterliegende Feld – wir erhalten Alias-Semantik)!

Eine Klasse für Felder: Der Copy-Konstruktor Nun können wir zum Beispiel schreiben: array a(3); a[0] = true; a[1] = false; a[2] = false; // a == {true, false, false} array b(a); // b == {true, false, false} b[2] = true; // b == {true, false, true}

Eine Klasse für Felder: Der Copy-Konstruktor Nun können wir zum Beispiel schreiben: array a(3); a[0] = true; a[1] = false; a[2] = false; // a == {true, false, false} array b(a); // b == {true, false, false} b[2] = true; // b == {true, false, true} Initialisierung von b durch a

Eine Klasse für Felder: Der Zuweisungsoperator Überladung von operator= als Mitglieds-Funktion

Eine Klasse für Felder: Der Zuweisungsoperator Überladung von operator= als Mitglieds-Funktion ähnlich wie Copy-Konstruktor ohne Initialisierer, aber zusätzlich Freigabe des Speichers für den “alten” Wert Vermeidung von Selbstzuweisungen

Eine Klasse für Felder: Der Zuweisungsoperator array& operator= (const array& a) { // avoid self-assignments if (this != &a) { // free old memory, and get new memory of // appropriate size delete[] ptr; ptr = new T[size = a.size]; // copy the elements of a into *this for (int i = 0; i < size; ++i) ptr[i] = a[i]; } return *this;

Eine Klasse für Felder: Der Zuweisungsoperator array& operator= (const array& a) { // avoid self-assignments if (this != &a) { // free old memory, and get new memory of // appropriate size delete[] ptr; ptr = new T[size = a.size]; // copy the elements of a into *this for (int i = 0; i < size; ++i) ptr[i] = a[i]; } return *this; Test auf Selbstzuweisung ist wichtig, um versehentliches Löschen des zuzuweisenden Wertes zu vermeiden.

Eine Klasse für Felder: Der Zuweisungsoperator Falls kein Zuweisungsoperator deklariert ist, so wird er automatisch erzeugt (und weist mitgliedsweise zu) Das ist für unsere Klasse array nicht das, was wir wollen (es wird nur der Zeiger ptr kopiert, nicht jedoch das dahinterliegende Feld – wir erhalten Alias-Semantik)!

Eine Klasse für Felder: Der Zuweisungsoperator Nun können wir zum Beispiel schreiben: array a(3); a[0] = true; a[1] = false; a[2] = false; // a == {true, false, false} array b(2); b = a; // b == {true, false, false} b[2] = true; // b == {true, false, true} Zuweisung von b an a

Dynamischer Datentyp Typ, der dynamischen Speicher verwaltet (z.B. unsere Klasse für Felder)

Dynamischer Datentyp Typ, der dynamischen Speicher verwaltet (z.B. unsere Klasse für Felder) andere typische Anwendungen: Listen Stapel Bäume Graphen

Dynamischer Datentyp sollte immer mindestens haben. Konstruktoren Destruktor Copy-Konstruktor Zuweisungsoperator haben.

Vektoren sind die Felder der Standardbibliothek

Vektoren sind die Felder der Standardbibliothek std::vector<T > für zugrundelie-genden Typ T #include<vector>

Vektoren sind die Felder der Standardbibliothek std::vector<T > für zugrundelie-genden Typ T können noch mehr, z.B: Elemente am Ende anhängen und löschen #include<vector>

Vektoren sind die Felder der Standardbibliothek std::vector<T > für zugrundelie-genden Typ T können noch mehr, z.B: Elemente am Ende anhängen und löschen #include<vector> können wir für unsere Klasse array auch machen (siehe Challenge 87)

Vektoren sind die Felder der Standardbibliothek std::vector<T > für zugrundelie-genden Typ T können noch mehr, z.B: Elemente am Ende anhängen und löschen repräsentieren damit die Menge T * aller endlichen Folgen über T #include<vector>

Das war’s! Was wir nicht gemacht haben: “Echte” dynamische Datentypen, wie zum Beispiel Bäume (Woche 14 fehlt)

Das war’s! Was wir nicht gemacht haben: “Echte” dynamische Datentypen, wie zum Beispiel Bäume (Woche 14 fehlt) Vererbung (Klassenhierarchien)

Das war’s! Was wir nicht gemacht haben: “Echte” dynamische Datentypen, wie zum Beispiel Bäume (Woche 14 fehlt) Vererbung (Klassenhierarchien) Templates (Generisches Programmieren)

Wie es weitergeht mit der Informatik Im zweiten Bachelor-Jahr (Mathematik): VL Algorithmen und Komplexität: Theorie der Algorithmen; wichtige Konzepte der Programmierung (Funktionen, Felder, Zeiger) werden vorausgesetzt

Wie es weitergeht mit der Informatik Im zweiten Bachelor-Jahr (Mathematik): VL Algorithmen und Komplexität: Theorie der Algorithmen; wichtige Konzepte der Programmierung (Funktionen, Felder, Zeiger) werden vorausgesetzt Für Physiker: leider kommt hier erstmal nichts mehr...