Programmieren in C. Zeiger auf void und ihre Anwendungen. Prof. Dr. Nikolaus Wulff

Ähnliche Dokumente
7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Programmieren in C. Zeiger auf Funktionen. Prof. Dr. Nikolaus Wulff

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

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

einlesen n > 0? Ausgabe Negative Zahl

Programmieren in C. Funktionen mit Zeigern und Adressen. Prof. Dr. Nikolaus Wulff

F Zeiger, Felder und Strukturen in C

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

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

Klausur. 2. Aufgabe (3 Punkte) Ergänzen Sie die leeren Zellen derart, dass sich in einer Zeile die selben Zahlenwerte ergeben.

Elementare Datentypen in C++

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

Zeiger (engl. Pointer)

C-Probeklausur (Informatik 1; Umfang: C, Teil 1; SS07)

Ein kleiner Blick auf die generische Programmierung

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

2. Programmierung in C

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Institut für Informatik

2. Aufgabe (3 Punkte) Ergänzen Sie die leeren Zellen derart, dass sich in einer Zeile die selben Zahlenwerte ergeben.

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue

4.2 Programmiersprache C

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Beispiel. Problem: mehrteilige Nachnamen (von Goethe, Mac Donald, Di Caprio)

Arrays (Felder/Vektoren)

RO-Tutorien 3 / 6 / 12

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

Integer Integer Integer (Voreinstellung) Integer Gleitkomma Gleitkomma leer/unbestimmt Integer ohne Vorzeichen Integer (explizit) mit Vorzeichen

Einführung in C. EDV1-04C-Einführung 1

Einführung in die Programmierung WS 2009/10. Übungsblatt 5: Typen, Variablen und einfache Methoden in Java

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

Musterlösung. Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

Programmieren in C / C++ Grundlagen C 2

Grundlagen der Informatik Ergänzungen WS 2007/2008 Prof. Dr. Rainer Lütticke

Der Datentyp String. Stringvariable und -vergleiche

Welche Informatik-Kenntnisse bringen Sie mit?

Einleitung. Informationsquellen: - Webseite zur Vorlesung, Abschnitt Informationen zu C und C++ Kurzeinführung in C/C++

Einstieg in die Informatik mit Java

Kapitel 4: Zeiger. Inhalt. Zeiger Zeigerarithmetik

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

RO-Tutorien 17 und 18

Programmierung mit C Zeiger

U8 7. Übung U8 7. Übung

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

Deklarationen in C. Prof. Dr. Margarita Esponda

RO-Tutorien 15 und 16

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08

Zusammenfassung des Handzettels für Programmieren in C

Advanced Programming in C

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

OCP Java SE 8. Lambda

Programmieren in C. Zeiger und Zeichenketten. Prof. Dr. Nikolaus Wulff

Zeiger, Arrays und Strings in C und C++

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

Objekttypen. Referenzen, Objekte, Gleichheit, Wrapper, Arrays, mehr-dimensionale Arrays, Bildbearbeitung, krumme Arrays

3.2 Datentypen und Methoden

Programmierkurs C++ Variablen und Datentypen

Klausur Fachprüfung Wirtschaftsinformatik. Name:

Grundkurs C++ IDE Klassenhierarchien

3.8 Objekttypen und Arrays. Wir werden uns in diesem Kapitel näher mit den Objekttypen in Java beschäftigen.

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

HSR Rapperswil 2001 Markus Rigling. Programmieren: Templates Auflage

Grundlagen der Informatik 9. Funktionen II

Physische Datenstrukturen

Kurzeinführung in C/C++ Informationsquellen: - Webseite zur Vorlesung, Abschnitt Informationen zu C und C++ Einleitung

Programmierpraktikum

Moderne C-Programmierung

Klausur Fachprüfung Wirtschaftsinformatik Dauer: 2 Stunden. Name:

1. Teilklausur Gruppe A. Bitte in Druckschrift leserlich ausfüllen!

Programmiertechnik Erweiterungen in Java 5

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

Klausur Programmiertechnik (Probeklausur 1)

FH Ravensburg-Weingarten Schriftlich Prüfung Programmieren

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C

Tutorium Rechnerorganisation

Dynamische Speicherverwaltung

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

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Klausur in Programmieren

S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Crashkurs C++ - Teil 1

C-Programmierung: Ausdrücke und Operatoren#Division.2F

Arrays. Einleitung. Deklarieren einer Array Variablen

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

Programmieren in C++ Templates

Einführung in die Programmiersprache C

Aufgabe Punkte

Einführung in die C-Programmierung

Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten

Praxis der Programmierung

Programmieren in C. Strukturen und Zeiger. Prof. Dr. Nikolaus Wulff

Grundkurs C++ IDE Klassenhierarchien

Methoden und Wrapperklassen

Tag 4 Repetitorium Informatik (Java)

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

7. Organisation von Informationen

Transkript:

Programmieren in C Zeiger auf void und ihre Anwendungen Prof. Dr. Nikolaus Wulff

Fallstudie: minmax.h #ifndef _MINMAX_H_ #define _MINMAX_H_ /** find minimal element in array */ char cmin(int length, char array[]); int imin(int length, int array[]); short smin(int length, short array[]); long lmin(int length, long array[]); float fmin(int length, float array[]); double dmin(int length, double array[]); /** find maximal element in array */ char cmax(int length, char array[]); int imax(int length, int array[]); short smax(int length, short array[]); long lmax(int length, long array[]); float fmax(int length, float array[]); double dmax(int length, double array[]); #endif /* _MINMAX_H_ */ Es ist eine Bibliothek zu entwickeln, die minimale und maximale Werte eines Feldes liefert. minmax.h zeigt die Funktionsprototypen. Prof. Dr. Nikolaus Wulff Programmieren in C 2

Motivation für void Zeiger long lmin(int length, long array[]) { long min = array[0]; if (array[i] < min) { min = array[i]; float fmin(int length, float array[]) { float min = array[0]; if (array[i] < min) { min = array[i]; double dmin(int length, double array[]) { double min = array[0]; if (array[i] < min) { min = array[i]; Lediglich die Signaturen der Funktionen sind unterschiedlich: int, long, float, double,... Code wird unnötig dupliziert. Gibt es eine Möglichkeit eine universelle Routine zu schreiben? Prof. Dr. Nikolaus Wulff Programmieren in C 3

C void Zeiger Alle C Datentypen lassen sich auch per Zeiger verund bearbeiten. Ein solche universelle Routine müsste daher mit einem universellen Zeiger arbeiten, der nicht streng auf die Typisierung int *, float * etc. besteht. C kennt den Datentyp void. Dieser wird z.b. von Funktionen ohne Rückgabewert zurückgeliefert. void (engl. leer) steht dort für Nichts. Ein void * ist jedoch kein NullPointer oder Zeiger auf Nichts, sondern auf eine Speicherstelle von unbestimmten Typ... Prof. Dr. Nikolaus Wulff Programmieren in C 4

Arbeiten mit dem void * Zeiger Ein solcher unbestimmter Zeiger ist genau der richtige Kandidat für eine generische Routine. Diese kann dann mit Zeigern von beliebigen Typen arbeiten, sofern sie nur universell genug codiert ist. Die Transformation der minimum Routine geschieht in mehreren Schritten: Feld-Arithmetik gegen Zeiger-Arithmetik austauschen. Kleiner-Vergleichsoperation generalisieren. Typsichere void Zeiger Arithmetik einbauen. Prof. Dr. Nikolaus Wulff Programmieren in C 5

1. Schritt Feld -> Zeiger int imin(int length, int array[]) { int i,min; min = array[0]; if (array[i] < min) { min = array[i]; Die Indizierung per Feld ist leicht zu eliminieren. array[i] (array + i) int imin(int length, int *array) { int i,min,*ptr; min = *array; ptr = array + i; if (*(ptr) < min) { min = *(ptr); Der Compiler sorgt dafür, das ptr richtig berechnet wird. Die Variable min muss auch void* werden... Prof. Dr. Nikolaus Wulff Programmieren in C 6

2. Schritt Vergleich per Fkt. int icmp(void *px, void *py) { int x = *(int *)px; int y = *(int *)py; return x < y; int imin(int length, int *array) { int i, *ptr,*min; min = array; ptr = array + i; if (icmp(ptr,min)) { min = ptr; return *min; icmp verallgemeinert den Vergleich als Funktion mit void *. (int *) px ist ein Zeiger auf ein int. *(int *) px ist dessen int Wert. array, ptr und min sind Zeiger, allerdings noch vom falschen Typ int * und nicht void *. Prof. Dr. Nikolaus Wulff Programmieren in C 7

3. Schritt Zeiger-Arithmetik int imin(int length, void *array) { void *ptr, *min; min = array; ptr = array + i*sizeof(int); if ( icmp(ptr,min) ) { min = ptr; return *(int *)min; Diese Version arbeitet vollständig mit Zeigern. Da void keine Größe besitzt muss mit sizeof die richtige Inkrementierung berechnet werden. Jetzt müssen nur noch der Rückgabewert, die explizite Schrittweite und die Vergleichsoperation zur Verallgemeinerung entfernt werden... Prof. Dr. Nikolaus Wulff Programmieren in C 8

4. Schritt Generische Funktion void* vmin(int length, void *array, int typesize, int (* cmp)(void *,void *)) { void *ptr, *min; min = array; ptr = array + i*typesize; if ( cmp(ptr,min) ) { min = ptr; Diese letzte generische Funktion erhält zwei zusätzliche Parameter: Die Inkrementierungsgröße typesize wird explizit übergeben, so dass sizeof(int) entfällt. Ein Zeiger (*cmp) auf die Vergleichsfunktion. Prof. Dr. Nikolaus Wulff Programmieren in C 9