C-Propädeutikum Funktionen - informatik.uni-leipzig.de

Werbung
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
Herunterladen