Institut für Informatik C-Propädeutikum Funktionen Dipl.-Inf. Stefan Freitag [email protected] Universitätsrechenzentrum Universitätsbibliothek Universität Leipzig basiert auf den Originalfolien von Jörn Hoffmann Wiederholung Institut für Informatik C-Programm Präprozessor Direktiven Globale Deklarationen Typ Funktion(...) { [lokale Deklarationen] [Anweisungsfolge] } ... int main(...) { [lokale Deklarationen] [Anweisungsfolge] } Stefan Freitag C-Propädeutikum 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 Stefan Freitag int pow(); int pow(int a) {return a*a;} pow(2); pow( pow(2) ); return a*a; C-Propädeutikum 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 Stefan Freitag C-Propädeutikum 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); Stefan Freitag C-Propädeutikum 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 Stefan Freitag C-Propädeutikum 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 Stefan Freitag C-Propädeutikum 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 Stefan Freitag C-Propädeutikum 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; } int main(int argc, char *argv[]) { for(int i=0; i < argc; i++) printf("Argument %d: %s\n", i, argv[i]); return 0; } Stefan Freitag C-Propädeutikum Folie 9 Unterprogramme Institut für Informatik Reale Welt Stefan Freitag Modellierung C-Propädeutikum Folie 10 Unterprogramme Institut für Informatik push(ADR_1+1) push(ADR_2+1) pop ADR_1 + 1 push(ADR_3+1) pop ADR_2 + 1 ADR_1 pop ADR_3 + 1 ADR_2 ADR_1 + 1 Stapelspeicher Stefan Freitag Stapelspeicher C-Propädeutikum Stapelspeicher Stapelspeicher Folie 11 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 Stefan Freitag C-Propädeutikum Folie 12 Bibliotheken Übersicht Institut für Informatik I . Editieren: Quelldatei modul.c I I . Übersetzen: Präprozessor Compiler Assembler Objektdatei Bibliothek modul.o I I I . Binden: ausführbares Programm a.out Stefan Freitag C-Propädeutikum Folie 13 Bibliotheken Deklarationen Institut für Informatik Header (.h) • Zusammenfassung der Funktionsdeklarationen einer Bibliothek • Einbindung mit • #include <stdio.h> (Systemvz. /usr/include) • #include “name.h“ (Aktuelles Verzeichnis) 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 Stefan Freitag C-Propädeutikum 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 Stefan Freitag C-Propädeutikum Folie 16 Bibliotheken Erstellen Institut für Informatik Bibliothek Erstellen • Objektdatei erzeugen : gcc -c bool.c • Objektarchiv erzeugen : ar crs libbool.a bool.o • Index erzeugen : ranlib libbool.a I . Editieren: Quelldatei modul.c I I . Übersetzen: Präprozessor Compiler Assembler Objektdatei Bibliothek modul.o I I I . Binden: ausführbares Programm a.out Stefan Freitag C-Propädeutikum 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 Stefan Freitag C-Propädeutikum Folie 18