U8 7. Übung U8 7. Übung

Ähnliche Dokumente
Ein-Ausgabefunktionen in C (letzter Abschnitt Vorlesungsstoff ab C.110)

1 wsort - Datenstrukturen (1. Möglichkeit)

Dynamische Speicherverwaltung

Dynamische Speicherverwaltung

U4-1 Aufgabe 3: einfache malloc-implementierung

Betriebssysteme. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

Betriebssysteme. Agenda. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

Dynamisches Speichermanagement

C/C++-Programmierung

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Dynamischer Speicher

Speicherverwaltung in C

F Zeiger, Felder und Strukturen in C

Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften

Betriebssysteme, Rechnernetze und verteilte Systeme 1. Crashkurs C (2)

float *point(float a, float b); // Funktionsdeklaration Zeiger als Funktionswert // point liefert als Wert die Adresse seines Ergebnisses

Übersicht. Speichertypen. Speicherverwaltung und -nutzung. Programmieren in C

4. Speicherverwaltung

4. Speicherverwaltung

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

Felder fester Länge (1)

Betriebssysteme. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

U3-1 Organisatorisches

Lösungshinweise/-vorschläge zum Übungsblatt 12: Software-Entwicklung 1 (WS 2017/18)

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

1 Fehler in Bibliotheksfunktionen. 1 Überblick. 2 Ziele der Aufgabe. Besprechung der 1. Aufgabe

Übungen zu Systemprogrammierung 1 (SP1)

Zeiger in C und C++ Zeiger in Java und C/C++

Dynamischer Speicher

Probeklausur Name: (c)

Arrays,Strings&Pointer in C/C++

Dynamische Speicherverwaltung

Software Entwicklung 1

Programmierung mit C Speicherverwaltung

Übungen zu Systemprogrammierung 1

Datei: svn/ckurs/trunk/c_texte/c_arrptr.txt, Datum: 30. Juni Felder und Zeiger

Tafelübung zu BS 4. Speicherverwaltung

Zeichenketten (1) Literale von Zeichenketten werden in doppelte Anführungszeichen gesetzt

Einführung in die Programmiersprache C

U3 3. Übung U3-1 Fehlerbehandlung U3 3. Übung U3-1 Fehlerbehandlung malloc(3) open(2) qsort(3) erkennt Fehler angebrachte Behandlung

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

Propädeutikum. Dipl.-Inf. Frank Güttler

ESP Tutorium. Studienassistent: Ewald Moitzi. Gruppe 1

C++ Teil 6. Sven Groß. 23. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 15

Übungen zu Softwaresysteme I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2004 E-Uebung3.fm

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

Übungen zur Systemprogrammierung 1 Michael Golm, Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4,

Kapitel 6: Dynamische Speicherverwaltung

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin

einlesen n > 0? Ausgabe Negative Zahl

Tafelübung zu BSRvS 1 4. Speicherverwaltung

Übungen zu Softwaresysteme I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2004 D-Uebung2.fm

Tafelübung zu BS 4. Speicherverwaltung

Teil 6: Strukturen und Unionen Gliederung

Funktionen, Zeiger und Arrays in C Software Entwicklung 1

Einführung in die Programmierung zusammengesetzte Datentypen, dynamischer Speicher

U3 3. Übung U3 3. Übung. Systemnahe Programmierung in C Übungen Moritz Strübe Universität Erlangen-Nürnberg Informatik 4, 2009 U3.fm

Besprechung Aufgabe 1. Pointer. Register und Ports. SPiC - Ü U3.1

Informatik 1 ( ) D-MAVT F2010. Pointer, Structs, Sortieren. Yves Brise Übungsstunde 6

Grundlagen der Programmierung in C++ Arrays und Strings, Teil 1

Programmieren in C. Rekursive Strukturen. Prof. Dr. Nikolaus Wulff

Teil 6: Strukturen und Unionen Gliederung

file:///h:/dokumente/_fh/ ws /etinfoii/vorlesung/infoi...

Tafelübung zu BS 4. Speicherverwaltung

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

Programmierung mit C Zeiger

Übungen zu Systemprogrammierung 1 (SP1)

Aufgaben zur C-Programmierung für die Praktikumsperiode des 1.Semesters

U1-1 Allgemeines zum Übungsbetrieb. U1-2 Nachtrag zur Benutzerumgebung. 1 Anlaufstellen. 2 Bearbeitung und Abgabe der Aufgaben

Versionsverwaltung mit Subversion / SP-Abgabesystem

Programmieren in C SS Vorlesung 4, Dienstag 14. Mai (Strings, Zeiger, Allokation, Strukturen)

ModProg 15-16, Vorl. 8

Übungen zu Systemprogrammierung 1 (SP1)

Elementare Datentypen

Vorlesung Programmieren

K Ergänzungen zur Einführung in C

Arrays (Felder/Vektoren)

Programmiertechnik 1. Unit 9: Programmiersprache C Zeiger und Felder. Andreas Polze 1

Modellierung und Programmierung

Algorithmen und Datenstrukturen

U1 1. Übung U1 1. Übung. Versionsverwaltung mit Subversion / SP-Abgabesystem

Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung

Zeiger in C und C++ Zeiger in Java und C/C++

Pointer. Variablen. Pointer. Ein elementares Beispiel. Pointer in C

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17

Die C++ Standard Template Library Andreas Obrist

Software Entwicklung 1

Dynamische Speicherverwaltung 178

6. Zeiger Allgemeines Definition eines Zeigers

Relationen-Algebra und Persistenz Teil I

Technische Infor matik 2 C/C++-Kurs. Pointer und Arrays (Teil 2) Referenzen AG Rechner netze 3.1

Zeiger (1) Allgemeines

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

Informatik. Wiederholung Felder (Arrays), string. Vorlesung

Programmieren in C. Speicher anfordern, Unions und Bitfelder. Prof. Dr. Nikolaus Wulff

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

Tafelübung zu BS 4. Speicherverwaltung

Transkript:

U8 7. Übung U8 7. Übung Dynamische Speicherverwaltung Generisches Sortieren Aufgabe 7 U8.1

U8-1 Dynamische Speicherverwaltung U8-1 Dynamische Speicherverwaltung Erzeugen von Feldern der Länge n: mittels: void *malloc(size_t size) struct person *personen; personen = (struct person *)malloc(sizeof(struct person)*n); if(personen == NULL)... mittels: void *calloc(size_t nelem, size_t elsize) struct person *personen; personen = (struct person *)calloc(n, sizeof(struct person)); if(personen == NULL)... calloc initialisiert den Speicher mit 0 malloc initialisiert den Speicher nicht Freigeben von Speicher void free(void *ptr); nur Speicher, der mit einer der alloc-funktionen zuvor angefordert wurde, darf mit free freigegeben werden! U8.2

U8-1 Dynamische Speicherverwaltung U8-1 Dynamische Speicherverwaltung Längenänderung von dynamisch allokierten Feldern: void *realloc(void *ptr, size_t size) Die Position im Speicher kann sich hierbei evtl. ändern An das Feld angrenzender Speicher ist bereits belegt realloc sucht einen neuen, ausreichend großen Speicherbereich und kopiert das ursprüngliche Feld an dessen Anfang realloc liefert einen Zeiger auf die neue Position zurück Beispiel: Erweiterung des allokierten Felds um 10 weitere Strukturen neu = (struct person *)realloc(personen, (n+10) * sizeof(struct person)); if(neu == NULL)... Wenn realloc keinen ausreichend großen Bereich findet, wird NULL zurückgegeben und der ursprüngliche Bereich bleibt erhalten. U8.3

1 Funktion qsort(3) Prototyp aus stdlib.h: void qsort(void *base, size_t nel, size_t width, int (*compare) (const void *, const void *)); Bedeutung der Parameter: base : Zeiger auf das erste Element des Feldes, dessen Elemente sortiert werden sollen nel : Anzahl der Elemente im zu sortierenden Feld width: Größe eines Elements compare: Vergleichsfunktion Sortiert ein Feld von beliebigen Elementen U8.4

2 Arbeitsweise von qsort(3) qsort vergleicht je zwei Elemente mit Hilfe der Vergleichsfunktion compare sind die Elemente zu vertauschen, dann werden die entsprechenden Felder komplett ausgetauscht, z.b.: base compare(a,b)-> 1 k k a p u t t \n a p t u t \n U8.5

3 Vergleichsfunktion Die Vergleichsfunktion erhält Zeiger auf Feldelemente, d.h. die übergebenen Zeiger haben denselben Typ wie das Feld Die Funktion vergleicht die beiden Elemente und liefert: <0, falls Element 1 kleiner bewertet wird als Element 2 0, falls Element 1 und Element 2 gleich gewertet werden >0, falls Element 1 größer bewertet wird als Element 2 Beispiel z, a 1 1, 5-1 5,5 0 "foo", "bar" 1 U8.6

4 Beispiel: Strings sortieren Strings: \0 -terminierte Zeichenfolgen beliebiger (unbekannter) Länge qsort sortiert Elemente fester Länge direkte Sortierung mit qsort daher nicht möglich Ein Feld aus Zeigern auf die Strings sortieren die Zeiger haben alle die gleiche feste Länge Feldelemente haben den Typ char * tesst.c\0 dat1\0 tesst.o\0 file11 \0 hallo.c\0 char **strings = malloc(n * sizeof(char *)); U8.7

4 Sortieren des Zeigerfeldes mit qsort Funktion qsort aufrufen void qsort(void *base, size_t nel, size_t width, int (*compare) (const void *, const void *)); Bedeutung der Parameter: base : Zeiger auf erstes Element des zu sortierenden Feldes (Zeiger auf den Zeiger auf ersten String) nel : Anzahl der Elemente im zu sortierenden Feld (Zahl der Zeiger/Strings) width: Größe eines Elements (Größe eines char-zeigers - sizeof) compare: Zeiger auf Vergleichsfunktion U8.8

4 Beispiel: Compare Funktion Lösung für die compare-funktion: qsort übergibt der compare-funktion Zeiger auf Elemente compare wird also mit Zeigern auf char * aufgerufen char ** strcmp(3) wird verwendet, um die Strings zu vergleichen int compare(const char **a, const char **b) { return strcmp( *a, *b ); } Aufruf von qsort (nel=5) im Beispiel qsort(strings, nel, sizeof(char *), (int (*) (const void *, const void *)) compare); Funktionstyp der compare-funktion ist generisch (mit void *) Typ der compare-funktion muss für den qsort-aufruf gecastet werden U8.9

4 Resultat nach dem Aufruf von qsort tesst.c\0 dat1\0 tesst.o\0 file11 \0 hallo.c\0 die Strings stehen unverändert, nur die Zeiger im Feld wurden sortiert U8.10

U8-3 Aufgabe 7 U8-3 Aufgabe 7 Einfaches Sortierprogramm Wörter zeichenweise von der Standardeingabe einlesen ein Wort pro Zeile (Wörter können auch Leer-/Sonderzeichen enthalten) maximale Zahl der Zeichen unbekannt jede Zeile endet mit einem Newline Zeichen ( \n ) Speicher muss dynamisch allokiert und nachgefordert werden (womit?) Dabei die Zahl der Wörter zählen und gültige C-String erzeugen (wie?) Array für Zeiger auf jedes Wort allokieren (wie gross?) Zeigerarray mit Zeigern auf die einzelnen Wörter füllen Zeigerarray mit qsort(3) und strcmp(3) sortieren Wörter ausgeben, ein Wort pro Zeile U8.11