18
Institut für Informatik CKurs 05 Funk-onen Dipl.Inf. Jörn Hoffmann jhoff[email protected] Universität Leipzig Ins-tut für Informa-k Technische Informa-k

CKurs 05’Funkonen’ - IfI: Startseite · Institut für Informatik Wiederholung C-Programm Präprozessor Direktiven Globale Deklarationen Typ Funktion(...) { [lokale Deklarationen]

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Institut für Informatik

C-­‐Kurs  05  Funk-onen  

Dipl.-­‐Inf.  Jörn  Hoffmann  [email protected]­‐leipzig.de  

 Universität  Leipzig  

Ins-tut  für  Informa-k  Technische  Informa-k  

Institut für Informatik

Wiederholung

C-Programm Präprozessor Direktiven Globale Deklarationen

Typ Funktion(...) { [lokale Deklarationen] [Anweisungsfolge] } ...

int main(...) { [lokale Deklarationen] [Anweisungsfolge] }

Jörn Hoffmann C-Kurs Folie 2

Institut für Informatik

Überblick Funktionen

Funktionen •  Bilden Unterprogramme •  Dienen der Strukturierung •  Erlauben Wiederverwendung von Codeteilen

Inhalt 1.  Vereinbarung int pow(); 2.  Festlegung int pow(int a) {return a*a;} 3.  Aufruf pow(2); 4.  Unterprogrammtechnik pow( pow(2) ); 5.  Rücksprung return a*a;

Jörn Hoffmann C-Kurs Folie 3

Institut für Informatik

Funktionsvereinbarung (Funktionsdeklaration)

Syntax Funktionstyp Funktionsname ([Parametertyp [Parametername], ...]);

Beschreibung

•  Funktionstyp •  gibt Wert der Funktion an •  „Rückgabetyp“

•  Parametertyp •  Falls Parameter, dann Typ angeben •  C-Funktionen benötigen stets eine Parameterliste

•  Parametername •  Bei Deklaration optional •  Für Verständnis hilfreich

Jörn Hoffmann C-Kurs Folie 4

Institut für Informatik

Funktionsvereinbarung (Funktionsdeklaration)

Wo? •  Globalen Deklarationsteil •  Headerdatei (.h)

•  Zusammenfassung mehrerer Deklarationen •  Wiederverwendung in unterschiedlichen Modulen (C-Dateien)

Beispiele

void halt(); int pow(int a); double _exp(double); long mul(int a, int b);

Jörn Hoffmann C-Kurs Folie 5

Institut für Informatik

Funktionsfestlegung (Funktionsfefinition)

Syntax Funktionstyp Funktionsname ([Parametertyp Parametername, ...]) { Anweisungen }

Hinweis

•  Parameternamen müssen angegeben werden da Platzhalter für Argumente

Semantik 1.  Call-by-Value

•  Werte werden als Kopie der Argumente übergeben •  Ursprünglichen Argument bleiben in Funktion unverändert

2.  Ausführung der Funktion

Jörn Hoffmann C-Kurs Folie 6

Institut für Informatik

Funktionsaufruf

Syntax Funktionsname ([Argument, ...]);

Beschreibung

•  Funktionsname ist symbolischer Bezeichner der Speicheradresse •  Argument

•  Argumentliste wird für Aufruf benötigt: f() •  Ohne Liste wird Speicheradresse ermittelt: f •  Anzahl und Typen durch Deklaration festgelegt •  Beliebiger, in Argumenttyp konvertierbarer Ausdruck

verwendbar •  Verschachtelte Funktionsaufrufe erlaubt

•  Aufruf kann als Operand verwendet werden

Jörn Hoffmann C-Kurs Folie 7

Institut für Informatik

Funktionsaufruf

Semantik 1.  Werte aus Argumenten berechnen, ggf. Typ konvertieren 2.  Werte als Kopie (call-by-value) übergeben 3.  Funktion ausführen 4.  Aufrufstelle wird mit Funktionswert ersetzen 5.  Programmausführung fortsetzen

Jörn Hoffmann C-Kurs Folie 8

Institut für Informatik

Hauptfunktion

int main() •  Muss existieren •  Darf manuell nicht aufgerufen werden •  Deklaration und Definition fällt zusammen •  Typ int

•  return Wert muss angegeben werden •  Vereinbarung: Rückgabewert 0 = korrekter Programmablauf

Beispiel!

Jörn Hoffmann C-Kurs Folie 9

int main()!{ !

!return 0;!}!

int main(int argc, char *argv[]) !{! for(int i=0; i < argc; i++)! printf("Argument %d: %s\n", i, argv[i]);! ! return 0;!}!

Institut für Informatik

Unterprogramme

Jörn Hoffmann C-Kurs Folie 10

Universität Leipzig Institut für Informatik Dr. Monika Meiler

Propädeutikum 6-2/13

6 Funktionen

6.1 Unterprogrammtechnik

Teilproblem A

Teilproblem B

Teilproblem A

Problem

Unterprogramm A

Unterprogramm B

top-down-Analyse Modularisierung

Aufruf UP A Aufruf UP B Aufruf UP A

Hauptprogramm

Mittels top-down-Analyse zerlegt man ein komplexes Problem solange in kleinere Teilprobleme bis diese überschaubar werden. Diese Teilprobleme kann man zunächst als Unterprogramme realisieren und auch einzeln testen, ehe man sie zu einem Ganzen zusammenfasst, um schließlich das komplexe Problem zu lösen. => Unterprogramme dienen der Strukturierung eines Programms,

1. der Ausgliederung wiederkehrender Berechnungen und 2. der Zerlegung komplexer Probleme in kleinere.

Verarbeitung von Unterprogrammen im Compiler

HP: UP1: UP2: UP3:

UP1-Aufruf UP2-Aufruf UP3-Aufruf

Rücksprung Rücksprung Rücksprung Rücksprung

1 2 3

6 5 4

ADR_1: ADR_2: ADR_3:

Kellerung

1 ADR_1 + 1 ADR_2 + 1 ADR_3 + 1 1 2 3

ADR_1 + 1 ADR_2 + 1

ADR_1 + 1

2

3

ADR_2 + 1 4

ADR_1 + 1

ADR_1 + 1 5

leer leer 6

Tiefe

Unterprogramme: Unterprogrammaufruf Unterprogrammvereinbarung (Deklaration und Definition) Unterprogrammrücksprung

Reale Welt Modellierung

Institut für Informatik

Unterprogramme

Jörn Hoffmann C-Kurs Folie 11

Universität Leipzig Institut für Informatik Dr. Monika Meiler

Propädeutikum 6-2/13

6 Funktionen

6.1 Unterprogrammtechnik

Teilproblem A

Teilproblem B

Teilproblem A

Problem

Unterprogramm A

Unterprogramm B

top-down-Analyse Modularisierung

Aufruf UP A Aufruf UP B Aufruf UP A

Hauptprogramm

Mittels top-down-Analyse zerlegt man ein komplexes Problem solange in kleinere Teilprobleme bis diese überschaubar werden. Diese Teilprobleme kann man zunächst als Unterprogramme realisieren und auch einzeln testen, ehe man sie zu einem Ganzen zusammenfasst, um schließlich das komplexe Problem zu lösen. => Unterprogramme dienen der Strukturierung eines Programms,

1. der Ausgliederung wiederkehrender Berechnungen und 2. der Zerlegung komplexer Probleme in kleinere.

Verarbeitung von Unterprogrammen im Compiler

HP: UP1: UP2: UP3:

UP1-Aufruf UP2-Aufruf UP3-Aufruf

Rücksprung Rücksprung Rücksprung Rücksprung

1 2 3

6 5 4

ADR_1: ADR_2: ADR_3:

Kellerung

1 ADR_1 + 1 ADR_2 + 1 ADR_3 + 1 1 2 3

ADR_1 + 1 ADR_2 + 1

ADR_1 + 1

2

3

ADR_2 + 1 4

ADR_1 + 1

ADR_1 + 1 5

leer leer 6

Tiefe

Unterprogramme: Unterprogrammaufruf Unterprogrammvereinbarung (Deklaration und Definition) Unterprogrammrücksprung

Stapelspeicher

ADR_1 + 1

Stapelspeicher

ADR_2 + 1 ADR_1 + 1

Stapelspeicher

ADR_3 + 1 ADR_2 + 1

ADR_1 + 1

Stapelspeicher

push(ADR_1+1)

pop

push(ADR_2+1) push(ADR_3+1)

pop pop

Institut für Informatik

Funktionsrücksprung

Rücksprung •  Implizit:

•  Nach Abarbeitung der letzten Anweisung •  Zufälliger Rückgabewert

•  Explizit (return) •  An beliebiger Stelle in Funktion •  Definierter Wert

Syntax

return [ Ausdruck ]; Semantik

1.  Ausdruckswert in Funktionstyp konvertieren 2.  Wert als Funktionswert zurückgeben 3.  Programm an Aufrufstelle fortsetzen 4.  I.d.R Auswertung des Rückgabewerts

Jörn Hoffmann C-Kurs Folie 12

Institut für Informatik

Bibliotheken Übersicht

Jörn Hoffmann C-Kurs Folie 13

Universität Leipzig Institut für Informatik Dr. Monika Meiler

Propädeutikum 6-13/13

I. Editieren: II. Übersetzen:

Präprozessor Compiler Assembler

III. Binden:

Quelldatei

modul.c

ausführbares Programm

a.out

Objektdatei

modul.o

Bibliothek

Institut für Informatik

Bibliotheken Deklarationen

Header (.h) •  Zusammenfassung der Funktionsdeklarationen einer Bibliothek •  Einbindung mit

•  #include <stdio.h> (Systemvz. /usr/include) •  #include “name.h“ (Aktuelles Verzeichnis)

Universität Leipzig Institut für Informatik Dr. Monika Meiler

Propädeutikum 6-11/13

6.5 Bibliotheken Header - Deklarationen von Bibliotheksfunktionen Zahlreiche Funktionen stehen in Bibliotheken zur Verfügung. Ihre Daklarationen sind in Headerdateien zusammengefasst und stehen damit für den globalen Deklarationsteil zur Verfügung, # include < * .h >. Die Headerdateien haben einen Namen mit dem Suffix .h, sind ASCII-Dateien und damit lesbar und befinden sich standardmäßig im Verzeichnis /usr/include. Die Deklarationen aus einer Headerdatei werden im Präprozessorlauf anstelle # include < *.h > (festgelegter Suchpfad für Headerdateien /usr/include) # include " *.h " (Suchpfad: aktuelles Verzeichnis) als globale Deklarationen in das Programm gesetzt. Übersicht über die wichtigsten Header der Standardbibliothek <assert.h> Testhilfen <ctype.h> Zeichenverarbeitung isdigit,... <errno.h> Fehlernummern <float.h> Interne Datenformate (Gleitkommatypen) FLT_MAX,... <limits.h> Interne Datenformate (Ganzzahlige Typen) INT_MAX,... <local.h> Länderspezifische Darstellung von Zahlen <math.h> Mathematische Funktionen sin, cos,... <setjmp.h> Sprünge zwischen Funktionen <signal.h> Behandlung von Signalen <stdarg.h> Behandlung von Funktionen mit variabler

Parameterzahl

<stddef.h> Elementare Typen size_t, NULL,... <stdio.h> Ein-/ Ausgabe printf, scanf,... <stdlib.h> Diverse Hilfsroutinen malloc,... <string.h> Stringverarbeitung strcpy, strcat,... <time.h> Termine und Zeiten time Bibliotheken - Definitionen von Bibliotheksfunktionen Die Definition der Funktionen stehen bereits übersetzt in Bibliotheken bereit. Dabei kann es zu einer Bibliothek mehrere Header geben. Die Bibliotheken selbst stehen in festgelegten Verzeichnissen /lib und /usr/lib. Ihr Name hat den Aufbau liblibery.a für statische und liblibery.so* für dynamische Bibliotheken. Alle Standard-C-Funktionen sind in der Bibliothek libc.a bzw. libc.so enthalten. Zu ihr gehören zum Beispiel die Header stdio.h, stdlib.h, string.h und weitere. Möchte man die Funktionen einer Bibliothek auflisten, so wechsele man in das Verzeichnis der Bibliothek und führe den folgenden Befehl aus: $ cd /lib $ nm Bibliotheksname

Institut für Informatik

Bibliotheken Definitionen

Bibliotheksarchive (.a, .so) •  Bereits übersetzte Definitionen •  Bibliothek kann unterschiedliche Header haben •  Namensgebung

•  Statische Bibliothek : libname.a •  Dynamische Bibliothek : libname.so*

•  Standartverzeichnisse /lib , /usr/lib Beispiel : C-Bibliothek

•  Header: stdio.h, stdlib.h, string.h, ... •  Archiv : libc.a

Jörn Hoffmann C-Kurs Folie 15

Institut für Informatik

Bibliotheken Anzeigen

Beispiele •  Bibliotheksfunktionen anzeigen (nm Bibliotheksname)

!! !$cd /lib!!! !$nm libm.so | less!

•  Erläuterungen anzeigen (man C-Funktionsname) •  Blättern: u, d •  Beenden: q

!! !$man sin!!! !$man printf!!! !!

Jörn Hoffmann C-Kurs Folie 16

Institut für Informatik

Bibliotheken Erstellen

Bibliothek Erstellen •  Objektdatei erzeugen : gcc -c bool.c •  Objektarchiv erzeugen : ar crs libbool.a bool.o •  Index erzeugen : ranlib libbool.a

Jörn Hoffmann C-Kurs Folie 17

Universität Leipzig Institut für Informatik Dr. Monika Meiler

Propädeutikum 6-13/13

I. Editieren: II. Übersetzen:

Präprozessor Compiler Assembler

III. Binden:

Quelldatei

modul.c

ausführbares Programm

a.out

Objektdatei

modul.o

Bibliothek

Institut für Informatik

Bibliotheken Binder

Binder •  engl. Linker •  Erzeugt ausführbares Programm •  Laden von Objektcode aus Objektdateien u. Archiven

•  Automatisch bei libc.a •  Manuell über Compileroption

•  Binderhinweis –l Name •  Suchverzeichnis –L Pfad

Beispiel : Bibliothek libm in /usr/lib

gcc wurzel.c –lm –o wurzel Beispiel : Bibliothek libbool in /home/prop01/lib

gcc impl.c –L/home/prop01/lib –lbool –o impl

Jörn Hoffmann C-Kurs Folie 18