Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger...

83
Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 http://c-et.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ

Transcript of Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger...

Page 1: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Informatik IIGrundlagen der Programmierung

Programmieren in C

Funktionen, Adressen, Zeiger

Hochschule Fulda – FB ET

Sommersemester 2014

http://c-et.rz.hs-fulda.de

Peter Klingebiel, HS Fulda, DVZ

Page 2: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2

Was können wir jetzt? 1

Page 3: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3

Was können wir jetzt? 2

Page 4: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4

Was können wir jetzt? 3

• einfache Programme bestehend aus main()– und einigen/mehreren/vielen Zeilen C-Code …– mit überschaubaren Aufgabenstellungen …– und überschaubarer Komplexität …– auch wenn schon komplexere Programme hier

und dort schon einmal gezeigt wurden

• doch meist sind die Aufgabenstellungen und damit auch die erforderlichen Programme sehr viel größer und sehr viel komplexer

Page 5: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5

Was ist erforderlich? 1

• hohe Komplexität Komplexität reduzieren

• große Programme / Aufgaben in kleinere Programmteile / Teilaufgaben zerlegen

• oft gleiche / ähnliche Aufgabenstellung Wiederverwendbarkeit von Programm- teilen ermöglichen

Konzept von Unterprogrammen / Sub- routinen / Prozeduren / Funktionen

Page 6: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6

Was ist erforderlich? 2

• Beispiel: Hausbau in Fertigbauweise

Page 7: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7

Was ist erforderlich? 3

• C bietet das Konzept von Funktionen• eine Funktion realisiert eine fest umrissene

Aufgabe bzw. Teilaufgabe• Das hat viele Vorteile: kleinere Teile

– sind einfacher zu verstehen/zu programmieren– können einfacher verändert werden– können einfacher überprüft/getestet werden– sind parallel erstellbar– sind wiederverwendbar– erfüllen eine klar definierte Aufgabe („Funktion“)

Page 8: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8

Was ist erforderlich? 4

• größeres Problem in kleinere Teile zerlegt• Erinnerung: Adam Ries123 * 45 123 * 4 * 10 + 123 * 5aus komplexer Multiplikation wird einfache Multiplikation und einfache Addition

• Wir kennen und verwenden Funktionen– main(), printf(), scanf(), sqrt(), …

• sind nicht Teil der Sprache, sondern definiert in der C-Standardbibliothek

• wir können eigene Funktionen schreiben

Page 9: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9

Funktionen 1

• Funktionen sind Programmteile (Blöcke) mit einem Typ, einem Namen, ggfs. Parametern (Eingangsdaten) und ggfs. Rückgabewert (Ausgangsdaten)

• elementare Bausteine für Programme– gliedern umfangreiche Aufgaben in kleinere

Komponenten

– reduzieren Komplexität

– Wiederverwendung von Komponenten

– verbergen Details der Implementierung vor anderen Programmteilen (black box)

Page 10: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Funktionen 2

Page 11: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Funktionen 3

Page 12: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Funktionen 4

• C-Programm Daten werden durch die Mühlen von Funktionen geschoben

Page 13: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Funktionen 5

Page 14: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14

Funktionen 6

• dienen der Abstraktion• Name und Parameter abstrahieren

– vom tatsächlichen Programmstück– von Darstellung und Verwendung der Daten

• Wiederverwendung– mehrfach benötigte Programmstücke werden

einmal erstellt und können durch Angabe des Funktionsnamens aufgerufen werden

– schrittweise Abstraktion möglichEntwurf top-down oder bottom-up

Page 15: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15

Funktionen 7

• Beispiel: Summenbildung summe(a:b)int summe(int a, int b){ int sum; int i; for(sum = 0, i = a; i <= b; i++) sum = sum + i; return(sum);}

• Beliebig immer wieder verwendbar:s1 = summe(20, 50);s2 = summe(2, 120);

Page 16: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16

Funktionsdefinition 1

• Schnittstelle (Typ, Name, Parameterliste)• Typ

– Datentyp, der von Funktion zurückgeliefert wird

– kann ein beliebiger Datentyp sein– void kein Rückgabewert ( Prozedur)

• Name – Bezeichner kann nach den Regeln für Identifier

beliebig gewählt sein, insb. keine Schlüsselworte

• Parameterliste– Typ und Name der Parameter

– kann leer sein, dann () oder (void)

Page 17: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17

Funktionsdefinition 2

• Syntaxdiagramm

• Beispielint summe(int a, int b){ int sum; ... return(sum);}

Page 18: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18

Funktionsdefinition 3

• Formale Parameter

• beliebiger Typ, beliebiger Bezeichner• formale Parameter Platzhalter für aktuelle

an Funktion übergebene Parameter• in Funktion wie vorbelegte lokale Variable

Page 19: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19

Funktionsdefinition 4

• Beliebiger Block mit {} geklammert• Zusätzliche Anweisung return(ausdruck)

Rückkehr aus der Funktion• Klammern bei return können entfallen• Bei void-Funktion: nur return• Nach Rückkehr aus Funktion Programm

wird direkt nach Funktionsaufruf fortgesetzt• Typ von Ausdruck und Funktion müssen

übereinstimmen

Page 20: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20

Funktionsdefinition 5

• Beispiel: Funktion summe()• Funktionskopf: Typ, Name, Parameter

int summe(int a, int b)

• Funktionskörper (body), Block{ int sum; // lokale Variable int i; // lokale Variable for(sum = 0, i = a; i <= b; i++) sum = sum + i; return(sum);}

• Rückgabe int sum return(sum);

Page 21: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21

Funktionsaufruf 1

• Funktionen werden aufgerufen• im Programm steht

– Name der Funktion

– Parameter (Variable/Ausdrücke) in Klammern

– ggfs. eine Zuweisung des Funktionswerts

• von aufrufender Stelle: Sprung in Funktion • Beispiel:

int s1, s2;...s1 = summe(20, 50);s2 = summe(2, 120);

Page 22: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22

Funktionsaufruf 2

• Syntaxdiagramm:

– jeder Funktionsaufruf ist ein Ausdruck– void-Funktionen können keine Teilausdrücke

sein wie Prozedur in anderen Sprachen

Page 23: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23

Funktionsaufruf 3

• die Ausdrücke in der Parameterliste werden vor dem Eintritt / Sprung in die Funktion ausgewertet aktuelle Parameter

• Anzahl und Typen der Ausdrücke der aktuellen Parameter müssen mit denen der formalen Parameter in der Definition der Funktion übereinstimmen

• die Auswertungsreihenfolge der Parameter-ausdrücke ist nicht festgelegt

Page 24: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24

Funktionsaufruf 4

• Beispiel

Page 25: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25

Funktionsaufruf 5

• vor Programmstart

Page 26: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26

Funktionsaufruf 6

• Programmstart: Speicherreservierung

Page 27: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27

Funktionsaufruf 7

• Kopieren des aktuellen Parameters a

Page 28: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28

Funktionsaufruf 8

• Aufruf der Funktion quadrat()

Page 29: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29

Funktionsaufruf 9

• In Funktion quadrat(): berechnen

Page 30: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30

Funktionsaufruf 10

• Returnwert liefern in a kopieren

Page 31: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31

Funktionsaufruf 11

• Rückkehr aus quadrat() nach main()

Page 32: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32

Funktionsaufruf 12

• Nach Rückkehr

Page 33: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33

Funktionsaufruf 13

Page 34: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34

Funktionsaufruf 14

Page 35: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35

Funktionsaufruf 15

Page 36: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36

Funktionsaufruf 16

Page 37: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37

Exkurs: Adressen / Pointer 1

• Noch einmal:a = quadrat(a);

• Wert des aktuellen Parameters a wird vor Aufruf von quadrat(a) in den Speicherraum der Funktion quadrat kopiert

• In der Funktion quadrat(int b) erhält der formale Parameter b den Wert von a und kann damit rechnen und ihn verändern

• der Wert von a bzw. a bleibt unverändert• erst die Zuweisung a = quadrat(a); verändert

im Beispiel den Wert von a

Page 38: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38

Exkurs: Adressen / Pointer 2

• Frage: Wie kann der Wert eines Funktions-parameters verändert werden?

• Beispiel: void swap(int i, int j){ int t; // temporaere Variable t = i; // i zwischenspeichern i = j; // j auf i zuweisen j = t; // t auf j zuweisen}

• verändert der Aufruf swap(a, b) tatsächlich

den Wert der aktuellen Parameter a und b ?

Page 39: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39

Exkurs: Adressen / Pointer 3

• NEIN, da die aktuellen Parameter a und b mit ihrem Wert in die Funktion kopiert werden

• Veränderungen des Werts innerhalb einer Funktion haben keine Auswirkungen auf den Wert von aktuellen Parametern!

Page 40: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40

Exkurs: Adressen / Pointer 4

• Die Lösung: Pointer oder Zeiger void swap(int *i, int *j){ int t; // temporaere Variable t = *i; // *i zwischenspeichern *i = *j; // *j auf *i zuweisen *j = t; // t auf *j zuweisen}

• Aufruf: swap(&a, &b);

Page 41: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41

Exkurs: Adressen / Pointer 5

• Das kennen wir schon!• Beispiel: Einlesen von Werten mit scanf()scanf(%d, &zahl);

• Parameter werden mit dem Adressoperator & versehen übergeben: &zahl

• in der Funktion: Pointer *z enthält Adresse / Speicherort des Parameters und kann so den Wert des Parameters zahl verändern

Call by value oder Call by reference

Page 42: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42

Exkurs: Adressen / Pointer 6

• Kennen wir auch schon: Wie C speichert

Page 43: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 43

Exkurs: Adressen / Pointer 7

• Speicherplatz von a, b,c Orte im Speicher

Page 44: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 44

Exkurs: Adressen / Pointer 8

• Zuweisung a=4; Wert an Speicherstelle

Page 45: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 45

Exkurs: Adressen / Pointer 9

• Wdh: Jede Variable hat einen Speicherort,d.h. eine Adresse im Hauptspeicher

• Zeiger (Pointer) sind Variable, die auf eine andere Variable verweisen, oderexakter: den Speicherort bzw. die Adresse dieser Variablen als Wert haben

• Pointerdefinition: int *ip; int i = 5;

• Adresszuweisung: ip = &i;• Zugriff auf Wert: *ip = *ip + *ip;

Page 46: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 46

Exkurs: Adressen / Pointer 10

• Zugriff auf Variable mit Pointer

Page 47: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 47

Exkurs: Adressen / Pointer 11

• Vor Programmstart

Page 48: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 48

Exkurs: Adressen / Pointer 12

• Programmstart und Aufruf von main()

Page 49: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 49

Exkurs: Adressen / Pointer 13

• Zuweisung i = 5;

Page 50: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 50

Exkurs: Adressen / Pointer 14

• Zuweisung ip = &i;

Page 51: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 51

Exkurs: Adressen / Pointer 15

• Berechnung *ip + *ip;

Page 52: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 52

Exkurs: Adressen / Pointer 16

• Zuweisung *ip = *ip + *ip;

Page 53: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 53

Exkurs: Adressen / Pointer 17

• Danach

Page 54: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 54

Funktionsaufruf und Parameter

• Parameterübergabe als Werte (call by value), z.B. bei printf()

Variable werden als Werte in den Adress-raum der Funktion auf lokale Variable kopiert

• Parameterübergabe als Adresse (call by reference), z.B. bei scanf()

Adressen der Variablen werden in den Adressraum der Funktion kopiert

• in der Funktion: Parameter sind Pointer!

Page 55: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 55

Call by value 1

• Beispiel: Funktionsaufruf cbv

Page 56: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 56

Call by value 2

• Vor Programmstart

Page 57: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 57

Call by value 3

• Zuweisung a = 4;

Page 58: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 58

Call by value 4

• Kopie des Parameters a in Funktion

Page 59: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 59

Call by value 5

• Aufruf der Funktion

Page 60: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 60

Call by value 6

• Zuweisung b = b * 2;

Page 61: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 61

Call by value 7

• Rückkehr aus Funktion

Page 62: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 62

Call by value 8

• Variable a unverändert!!!

Page 63: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 63

Call by reference 1

• Beispiel: Funktionsaufruf cbr

Page 64: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 64

Call by reference 2

• Vor Programmstart

Page 65: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 65

Call by reference 3

• Wo ist der Unterschied cbv – cbr?

Page 66: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 66

Call by reference 4

• Aufruf: Adresse der Variablen: doit(&a)!!!

Page 67: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 67

Call by reference 5

• In Funktion: *b Zeiger auf Variable!!!

Page 68: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 68

Call by reference 6

• Zuweisung a = 4;

Page 69: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 69

Call by reference 7

• Kopie der Adresse in die Funktion

Page 70: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 70

Call by reference 8

• Aufruf der Funktion

Page 71: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 71

Call by reference 9

• Zuweisung *b = *b * 2;

Page 72: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 72

Call by reference 10

• Rückkehr aus Funktion

Page 73: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 73

Call by reference 11

• So soll es sein: Variable a verändert!!!

Page 74: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 74

Funktionsdeklaration 1

• vor dem Aufruf einer Funktion muss diese dem C-Compiler bekannt sein– Name der Funktion– Typ der Funktion / des Rückgabewerts– Anzahl und Typen der Parameter

• ist die Funktion vor ihrem Aufruf definiert, ist sie dem Compiler bekannt

• andernfalls muss sie bekannt gemacht oder deklariert werden

Prototype

Page 75: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 75

Funktionsdeklaration 2

• Beispiel:int power(int, int);oderint power(int b, int e);

• Deklaration erzeugt keinen Code!• Nach der Deklaration kann die Funktion

verwendet dann werden• Compiler kann Name, Typ und Parameter

prüfen erhöht Programmiersicherheit

Page 76: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 76

Funktionsdeklaration 3

• Funktionsdefinition (analog zu Variablen!)– erzeugt Code– macht Funktion (Typ, Name, Parameter) bekannt

• Funktionsdeklaration (analog zu Variablen)– macht Funktion (Typ, Name, Parameter) bekannt– vor Verwendung der Funktion

• Oft in Standard- (oder eigenen) Headerfiles– Konvention: Dateiname endet auf .h– #include <file.h> fügt Headerdatei textuell

in Quelltext ein deklarierte Funktionen bekannt

Page 77: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 77

Funktionsdeklaration 4

Page 78: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 78

Sichtbarkeit von Funktionen

• Eine C-Quelldatei stellt ein Modul dar (= Übersetzungseinheit)

• in einem Modul definierte Funktionen können in anderen Modulen verwendet werden

• sie sind damit extern sichtbar und werden durch Prototypes bekannt gemacht

• Soll Sichtbarkeit auf das Modul (= Quelldatei) beschränkt werden: static verwenden

• Beispiel: static int localfunc() {…}

Page 79: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 79

Gedächtnis von Funktionen

• lokale Variable werden beim Eintritt in die Funktion im Speicher angelegt und nach Verlassen der Funktion ungültig

• ihre Werte verschwinden!• Abhilfe:

– globale Variable– ungünstig, Nebeneffekte! Vermeiden!– statische Variable in Funktion– Wert bleibt erhalten, sichtbar nur in Funktion– Bsp: static int wert = 1;

Page 80: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 80

Optimierungen

• Rückgabewerte oft direkt als Parameter für Funktionsaufrufe verwendbar– ohne Zwischenspeicherung in Variablen– Beispiel: funa(funb(), func());

• Funktionsaufruf kostet Zeit und Speicherplatz• Funktion kann als inline definiert werden

– Bsp: inline void swap(int i, int j){…}– statt Funktionsaufruf wird Funktionscode eingefügt– nur Empfehlung an den Compiler– gcc setzt Inlining bei Optimierung um (gcc –O)

Page 81: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 81

Rekursion

• bei einem Funktionsaufruf wird ein eigener Speicherbereicht für lokale Variable (und damit auch für Parameter) angelegt

• damit ist möglich, dass eine Funktion sich selbst aufruft Rekursion

• Beispiel: Fakultätsfunktion n! = 1*2*…*nint fakultaet(int n) { if(n == 1) return(1); // Endebedingung else return(n * fakultaet(n – 1));}

elegante Lösungen möglich

Page 82: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 82

Hinweise 1

• zerteilen Sie eine größere Aufgabe in kleinere Teilaufgaben

• führen Sie Funktionen mit lokalen Variablen (einschl. Parametern) ein– vermeiden Sie globale Variable– wählen Sie aufschlussreiche Namen– klarer Zweck!– nicht zu groß! Besser aufteilen in Teilfunktionen!– nutzen Sie static-Funktionen– Deklaration von Prototypen

Page 83: Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 83

Hinweise 2

• Definition, Deklaration und Aufruf von Funktionen müssen übereinstimmen– Typ des Funktionswertes– Anzahl, Typ und Reihenfolge der Parameter

• Eine Funktion hat nur einen Rückgabewert• Bei Funktionen mit Rückgabewert immer return als letztes Statement

• Funktionsdefinition ohne Semikolon ;• Funktionsdeklaration/Prototyp mit ;