Felder fester Länge (1)

Ähnliche Dokumente
Dynamischer Speicher

2. Programmierung in C

2. Programmierung in C

Datenstrukturen, Listen und Bäume

7. Dynamischer Speicher und Datenstrukturen

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

C- Kurs 08 Zeiger. Dipl.- Inf. Jörn Hoffmann leipzig.de. Universität Leipzig Ins?tut für Informa?k Technische Informa?

Dynamische Speicherverwaltung

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

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

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

2. Programmierung in C

2. Programmierung in C

Algorithmen und Datenstrukturen

7. Organisation von Informationen

U8 7. Übung U8 7. Übung

Das folgende Programm demonstriert, wie man Speicheradressen von Variablen ermittelt.

Datenstrukturen sind neben Algorithmen weitere wichtige Bausteine in der Informatik

Speicherverwaltung in C

Inhalt. Peter Sobe 63. Felder in C

Strukturen in C. Strukturen stellen eine Zusammenfassung von Datenelementen unterschiedlichen Typs unter einem Namen dar.

Felder in C. Felder stellen eine Reihung von Elementen gleichen Typs dar. Man spricht auch von Vektoren oder Arrays.

F Zeiger, Felder und Strukturen in C

Dynamisches Speichermanagement

C/C++-Programmierung

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

2. Programmierung in C

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

Dynamische Speicherverwaltung

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

Vorlesung Datenstrukturen

K Ergänzungen zur Einführung in C

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

Programmierung mit C Zeiger

+ C - Array (Vektoren, Felder)

Dynamischer Speicher

2. Programmierung in C

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

Zeiger (engl. Pointer)

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

Zeiger (1) Allgemeines

U4-1 Aufgabe 3: einfache malloc-implementierung

Einstieg in die Informatik mit Java

Software Entwicklung 1

Teil 6: Strukturen und Unionen Gliederung

Teil 6: Strukturen und Unionen Gliederung

1 Statische Felder. Hinweise zur Speicherung von Feldern in C++ und C

Advanced Programming in C

Theoretische Informatik 1 WS 2007/2008. Prof. Dr. Rainer Lütticke

Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften

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

Dr. Monika Meiler. Inhalt

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

Zeiger und dynamischer Speicher

Programmieren in C/C++ und MATLAB

Mazura. h 2. Vertiefung

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Vorkurs C++ Programmierung

Felder (Arrays) und Zeiger (Pointers) - Teil I

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

Programmierkurs C++ Datenstrukturen Seite 1

2. Programmierung in C

Probeklausur Name: (c)

C- Kurs 07 Höhere Datentypen

Dynamische Speicherverwaltung

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

9. Vektoren. (auch Felder/array)

Crashkurs C++ - Teil 1

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

U3-1 Organisatorisches

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

Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung

Felder (1) Allgemeines

Reihungen. Prof. Dr. Christian Böhm. In Zusammenarbeit mit Gefei Zhang. WS 07/08

Felder (1) Felder (Arrays) speichern viele Datenelemente des gleichen Typs. Auf einzelne Elemente kann über einen Index zugegriffen werden

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

5.5 Prioritätswarteschlangen

Reihungen. Martin Wirsing. in Zusammenarbeit mit Michael Barth, Fabian Birzele und Gefei Zhang

Teil 8: Dynamische Speicherverwaltung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

C- Kurs 09 Dynamische Datenstrukturen

GI Vektoren

Vorlesung Programmieren

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

8 Elementare Datenstrukturen

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Wertebereich und Genauigkeit der Zahlendarstellung

Praxis der Programmierung

Dr. Monika Meiler. Inhalt

Fallstudie: Online-Statistik

Teilprüfung Software- und Internettechnologie Programmierkurs 2 Wintersemester 2004/2005

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

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

Praxis der Programmierung

Transkript:

Felder fester Länge (1) Felder: Aneinanderreihung von mehreren Variablen gleichen Typs Ursprünglich als 1-dimensionale Organisationsform gedacht, aber auch zwei- und höherdimensional (Matrizen u.ä.) Benutzung Felder: für Vektoren und Matrizen (im mathematischen Sinne) zur Speicherung einer Menge gleichartiger Daten, zum Beispiel mehrere aufgenommene Messwerte mehrere Elemente in einer zu modellierenden Anordnung Peter Sobe 1

Felder fester Länge (2) Vorgehensweise: Deklaration einer oder mehrerer Feldvariablen mit einer festgelegten Elementanzahl Elementanzahl muß konstant sein, für die maximale Anzahl benutzter Feldelemente Die tatsächlich benutzte Anzahl von Elementen muss in einer weiteren int-variable (auch unsigned int) gespeichert werden. Beispiel: #define MAX_ANZ_BUCHST 26 char Buchstaben[MAX_ANZ_BUCHST]; int anz_buchstaben = 0; Peter Sobe 2

Felder fester Länge (3) Das Feld wird mit aufsteigendem Index mit Elementen gefüllt. Die Elemente sollen hier nicht sortiert werden. Operationen mit Feldern: Einfügen eines Elements Finden eines Elements und ggf. Zugriff auf weitere Informationen Löschen eines Elements Rückgabe der Anzahl aller Elemente Peter Sobe 3

Felder fester Länge (4) Einfügen eines Elements: die aktuelle Elementanzahl kann als Index auf das erste freie Element benutz werden wenn dieser Index noch innerhalb des deklarierten Feldes liegt, dann kann noch weiter eingefügt werden; sonst nicht. erstes freie Element mit einzufügendem Inhalt beschreiben (Zuweisung oder Kopieren) Anzahl tatsächlich benutzter Elemente um Eins erhöhen Peter Sobe 4

Einfügen eines Elements: Felder fester Länge (5) // Buchstabe b soll eingefügt werden if ( anz_buchstaben < MAX_ANZ_BUCHST) { buchstaben[anz_buchstaben]=b; anz_buchstaben = anz_buchstaben + 1; } else { // nicht einfügen } Bislang können gleiche Buchstaben auch mehrfach eingefügt werden. Falls jeder Buchstabe nur einmal eingefügt werden soll, so ist das Feld vorab zu durchsuchen. Peter Sobe 5

Finden eines Elements im Feld: Felder fester Länge (6) // Buchstabe b soll gefunden werden char gefunden = 0; int i; int position = -1; // -1 als Wert für eine uninitialisierte Position for (i=0; i< anz_buchstaben &&!gefunden; i=i+1) if (buchstaben[i]==b) { gefunden = 1; position = i; } // weitere Anweisungen in Abhängigkeit, ob b gefunden wurde Wenn die Elemente Strukturen sind, dann können hier weitere Daten bereitgestellt werden. Peter Sobe 6

Löschen eines Elements im Feld: Felder fester Länge (8) // Buchstabe b soll gelöscht werden, Aufbauend auf Finden von b char gefunden = 0; int i, position = -1; for (i=0; i< anz_buchstaben &&!gefunden; i=i+1) if (buchstaben[i]==b) { gefunden = 1; position = i; } if (gefunden) // Feldelemente um eine Position nach links setzen { for (i=position+1; i< anz_buchstaben; i=i+1) buchstaben[i-1] = buchstaben[i]; anz_buchstaben = anz_buchstaben -1; } Peter Sobe 7

Felder fester Länge (9) Vor dem Programmieren der Feld-Operationen sollte immer entschieden werden: Sollen Elemente nur einmal im Feld vorhanden sein oder auch mehrfach? Auswirkung auf Operationen Einfügen, Finden und Löschen Sollen Elemente in der Reihenfolge des Einfügens gespeichert werden, oder soll eine Sortierung stattfinden? Bei sortierter Speicherung kann sich die Zeit für das Finden und das Löschen von Elementen verkürzen, was bei großen Datenmengen nützlich ist. Neben (linearen) Feldern (sortiert oder unsortiert) gibt es noch eine Reihe weiterer und besserer Datenstrukturen. Näheres dazu in einem noch folgenden Abschnitt. Peter Sobe 8

Felder fester Länge (10) Nachteile: Durch Deklaration mit einer maximal möglichen Elementanzahl wird u.u. Speicherplatz vergeudet. Wenn die durch den Programmierer festgelegte Elementanzahl erreicht wurde, kann das Programm keine weiteren Daten mehr aufnehmen und verarbeiten. Peter Sobe 9

Dynamische Speichertechnik (1) Unter dynamischer Speichertechnik versteht man die Bildung neuer Speicherplätze auf der Basis von Standarddatentypen und deklarierten Strukturen zur Laufzeit. Es wird Speicherplatz zur Laufzeit bereitgestellt und darauf ein oder mehrere neue Elemente einer Datenstruktur platziert. Ein neues Element wird mit bereits vorhandenen Elementen in der Datenstruktur in Beziehung gesetzt. Ebenso können auch zur Laufzeit Elemente aus der Datenstruktur herausgelöst werden und deren Speicherplatz wieder freigegeben werden. Im Gegensatz werden die bisher benutzen Variablen und Felder als statische Datenstrukturen angesehen. Die Sichtbarkeit und der belegte Speicherplatz wird durch ihre Deklaration im globalen Kontext des Programms oder innerhalb Funktionen bestimmt. Peter Sobe 10

Dynamische Speichertechnik (2) Zur Realisierung solcher dynamischer Strukturen werden zwei Techniken benötigt: 1. Die dynamische Speicherallokation und freigabe 2. Die Verwendung der Zeigertechnik zum dynamischen Herstellen und Lösen von Verbindungen von Elementen innerhalb der Datenstruktur Die vom Programmierer geschaffene Organisation der Daten (also wo welches Element im Speicher steht und wie es mit den anderen Elementen in Beziehung gesetzt wird) wird durch Datenstrukturen beschrieben. Peter Sobe 11

Dynamische Speichertechnik (3) Die dynamische Speicherallokation und freigabe wird in C mit den Funktionen void *malloc(size_t size); // gibt die Anfangsadresse des // allokierten Bereichs zurück void free(void *addresse); durchgeführt, die in <stdlib.h> zu finden sind. Es werden size Bytes allokiert und die Adresse dieses Speicherbereiches zurückgegeben. Ist der Rückkehrwert NULL, ist nicht genügend Speicher vorhanden. Ist die Größe in Bytes bekannt, kann diese direkt als Argument übergeben werden, sonst empfiehlt sich die Verwendung von sizeof(x), welche die notwendige Größe in Bytes für das Element x ermittelt. Bei der Speicherfreigabe mit free ist nur die Adresse des Speicherbereichs anzugeben. Peter Sobe 12

Dynamische lineare Datenstrukturen eindimensionale lineare Datenstruktur Feld variabler Länge: Wie Feld fester Länge aber mit Längenfestlegung zur Laufzeit Elemente werden wie gewohnt durch Zahlenindex angesprochen Dynamisches Feld: Wie Feld variabler Länge Feld kann wachsen und schrumpfen durch dynamische Speichertechnik Lineare Liste: Liste kann wachsen und schrumpfen Effizientes Einfügen neuer Elemente und Löschen (kein Zahlenindex zum Zugriff) Weitere lineare Datenstrukturen: Warteschlange, Stapel (hier nicht ausgeführt) Peter Sobe 13

Feld variabler Länge Bei manchen Anwendungen ist die Anzahl der zu verarbeitenden Elemente nicht bekannt und kann je nach Einsatzzweck des Programms stark variieren. Felder mit einer maximalen Anzahl von Elementen sind dann ungünstig. Lösung: Ein Feld, das eine zur Laufzeit ermittelte Anzahl an Elementen besitzt int n_max, n_elements=0; /* n_max wird durch das Programm berechnet, oder durch den Nutzer eingegeben, oder ergibt sich aus der Größe der Eingabedaten */ elem_typ* feld = (elem_typ*) malloc(sizeof(elem_typ)* n_max); /* feld[0] bis feld[n_max-1] benutzbar */ free(feld); Peter Sobe 14

Dynamisches Feld (1) Bei manchen Anwendungen variiert die Anzahl genutzter Elemente stark über die Laufzeit und ist auch zum Programmstart noch nicht bekannt. Lösung: Ein dynamisches Feld, das sich mit Mitteln der dynamischen Speicherverwaltung (malloc, realloc, free) der benötigten Anzahl von Elementen anpasst. Startzustand, mit 3 Elementen als Reserve, Noch kein Element benutzt Elemente Zustand, nach Einfügen von 2 Elementen Elemente Zustand, nach Einfügen von 3 weiteren Elementen Zustand, nach Austragen Elemente von 4 Elementen Elemente Peter Sobe 15

Dynamisches Feld (2) Konstanten und Variablen zur Verwaltung: #define N_START 3 #define N_DELTA 5 unsigned int n_allocated=0, n_elements=0; elem_typ* feld; Anfang: Allokieren von N_START Elementen Setzen von n_allocated = N_START feld = (elem_typ*) malloc(sizeof(elem_typ)* N_START); if (feld==null) { /* Fehlerbehandlung */} n_allocated = N_START; Peter Sobe 16

Dynamisches Feld (3) Einfügen eines neuen Elements am Ende: Prüfen, ob ausreichend Speicher allokiert ist ggf. dynamisches Vergrößern des Feldes und Anpassen der Variable n_allocated Einfügen des Elements in feld[n_elements] Erhöhen von n_elements um 1 if (n_elements+1 > n_allocated) { feld = realloc(feld, sizeof(element_typ) * (n_allocated + N_DELTA)); if (feld==null) { /* Fehlerbehandlung */ } n_allocated = n_allocated + N_DELTA; } feld[n_elements] = neues_element; n_elements = n_elements+1; Peter Sobe 17

Dynamisches Feld (4) Ausgliedern eines Elements an Position p (0 p<n_elements): Verschieben der Feldelemente ab Position p+1 um eine Stelle nach links (kleinerer Index) Verringern von n_elements um 1 Prüfen, ob n_elements < n_acclocated N_DELTA, wenn ja, dann Verkleinern des Feldes mittels realloc() for (i=p+1;i<n_elements; i++) feld[i-1] = feld[i]; n_elements = n_elements 1; if (n_elements < n_allocated N_DELTA) { feld = realloc(feld, sizeof(element_typ) * (n_allocated - N_DELTA)); n_allocated = n_allocated N_DELTA; } Peter Sobe 18