C-‐Kurs 05 Funkºonen

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