Institut für Informatik C-­‐Kurs 05 Funk-onen Dipl.-­‐Inf. Jörn Hoffmann jhoff[email protected]­‐leipzig.de Universität Leipzig Ins-tut für Informa-k Technische Informa-k Wiederholung Institut für Informatik C-Programm Präprozessor Direktiven Globale Deklarationen Typ Funktion(...) { [lokale Deklarationen] [Anweisungsfolge] } ... int main(...) { [lokale Deklarationen] [Anweisungsfolge] } Jörn Hoffmann C-Kurs Folie 2 Überblick Funktionen Institut für Informatik Funktionen • Bilden Unterprogramme • Dienen der Strukturierung • Erlauben Wiederverwendung von Codeteilen Inhalt 1. Vereinbarung 2. Festlegung 3. Aufruf 4. Unterprogrammtechnik 5. Rücksprung Jörn Hoffmann int pow(); int pow(int a) {return a*a;} pow(2); pow( pow(2) ); return a*a; C-Kurs Folie 3 Funktionsvereinbarung (Funktionsdeklaration) Institut für Informatik 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 Funktionsvereinbarung (Funktionsdeklaration) Institut für Informatik 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 Funktionsfestlegung (Funktionsfefinition) Institut für Informatik 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 Funktionsaufruf Institut für Informatik 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 Funktionsaufruf Institut für Informatik 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 Hauptfunktion Institut für Informatik 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! int main()! { ! !return 0;! }! Jörn Hoffmann int main(int argc, char *argv[]) ! {! for(int i=0; i < argc; i++)! printf("Argument %d: %s\n", i, argv[i]);! ! return 0;! }! C-Kurs Folie 9 Universität Leipzig Institut für Informatik Dr. Monika Meiler Unterprogramme Institut für Informatik 6 Funktionen 6.1 Reale Welt Unterprogrammtechnik Problem Teilproblem A Teilproblem B Teilproblem A top-down-Analyse Modellierung Hauptprogramm Aufruf UP A Aufruf UP B Aufruf UP A Unterprogramm A Unterprogramm B Modularisierung Mittels top-down-Analyse zerlegt man ein komplexes Problem solange in kleinere Teilprobleme bis diese überschaubar werden. Diese Teilprobleme kann man zunächst Jörn Hoffmann C-Kurs Folie 10als Unterprogramme realisieren und auch einzeln testen, ehe man sie zu einem Ganzen 1. 2. der Ausgliederung wiederkehrender Berechnungen und der Zerlegung komplexer Probleme in kleinere. Unterprogramme Verarbeitung von Unterprogrammen im Compiler Institut für Informatik HP: UP1: ADR_1: 1 UP1-Aufruf UP2: ADR_2: 6 Rücksprung 2 UP2-Aufruf ADR_3: 3 UP3-Aufruf 5 4 Rücksprung Kellerung push(ADR_1+1) UP3: Rücksprung push(ADR_2+1) Rücksprung push(ADR_3+1) Tiefe 1 2 leer 1 ADR_1 + 1 2 pop ADR_2 + 1 ADR_1 + 1 ADR_1 + 1 3 ADR_3 + 1 pop 4 ADR_2 + 1 ADR_2 + 1 ADR_1 ADR_2 + 1 pop 5 ADR_1 + 1 ADR_3 + 1 ADR_2 ADR_1 + 1 ADR_1 + 1 3 ADR_1 + 1 Unterprogramme: Unterprogrammaufruf Stapelspeicher Stapelspeicher Stapelspeicher Stapelspeicher Unterprogrammvereinbarung (Deklaration und Definition) Jörn Hoffmann C-Kurs Folie 11 Unterprogrammrücksprung 6 Funktionsrücksprung Institut für Informatik 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 Universität Leipzig Institut für Informatik Dr. Monika Meiler Bibliotheken Übersicht Institut für Informatik I. Editieren: Quelldatei modul.c II. Übersetzen: Präprozessor Compiler Assembler Objektdatei Bibliothek modul.o III. Binden: ausführbares Programm a.out Jörn Hoffmann C-Kurs Folie 13 6.5 Bibliotheken Bibliotheken Header - Deklarationen von Bibliotheksfunktionen Deklarationen Zahlreiche Funktionen stehen in Bibliotheken zur Verfügung. Ihre Daklarationen sind in Institut für Informatik 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 Header (.h) /usr/include. • • Zusammenfassung der Funktionsdeklarationen einer Bibliothek Die Deklarationen aus einer Headerdatei werden im Präprozessorlauf anstelle #Einbindung include < *.h > mit (festgelegter Suchpfad für Headerdateien /usr/include) # include " *.h " (Suchpfad: aktuelles Verzeichnis) • #include <stdio.h> (Systemvz. /usr/include) als globale Deklarationen in das Programm gesetzt. • #include “name.h“ (Aktuelles Verzeichnis) Übersicht über die wichtigsten Header der Standardbibliothek <assert.h> <ctype.h> <errno.h> <float.h> <limits.h> <local.h> <math.h> <setjmp.h> <signal.h> <stdarg.h> <stddef.h> <stdio.h> <stdlib.h> <string.h> <time.h> Testhilfen Zeichenverarbeitung isdigit,... Fehlernummern Interne Datenformate (Gleitkommatypen) FLT_MAX,... Interne Datenformate (Ganzzahlige Typen) INT_MAX,... Länderspezifische Darstellung von Zahlen Mathematische Funktionen sin, cos,... Sprünge zwischen Funktionen Behandlung von Signalen Behandlung von Funktionen mit variabler Parameterzahl Elementare Typen size_t, NULL,... Ein-/ Ausgabe printf, scanf,... Diverse Hilfsroutinen malloc,... Stringverarbeitung strcpy, strcat,... Termine und Zeiten time Bibliotheken Definitionen Institut für Informatik 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 Bibliotheken Anzeigen Institut für Informatik 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 Bibliotheken Erstellen Institut für Informatik Bibliothek Erstellen • Objektdatei erzeugen : gcc -c bool.c Universität Leipzig • Objektarchiv erzeugen : ar crs libbool.a bool.o • Index erzeugen : ranlib libbool.a Institut für Infor Dr. Monika M I. Editieren: Quelldatei modul.c II. Übersetzen: Präprozessor Compiler Assembler Objektdatei Bibliothek modul.o III. Binden: ausführbares Programm a.out Jörn Hoffmann C-Kurs Folie 17 Bibliotheken Binder Institut für Informatik 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