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