Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5...
Transcript of Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5...
Prof. Dr. Nikolaus Wulff
Programmieren in CProgrammieren in C
Macros, Funktionen und modulare Programmstruktur
Prof. Dr. Nikolaus Wulff Programmieren in C 2
Der C Präprozessor
• Vor einem Compile Lauf werden alle Präprozessor Kommandos/Makros ausgewertet. Diese sind am # Zeichen erkennbar.
• Wichtige Kommandos sind:– #include: Einfügen einer Definitionsdatei *.h– #define und #undef: (Un)Definieren eines Ausdrucks– #if, #elif, #else und #endif: Bedingte Übersetzung
• Zum Ersatz von Symbolen und zur Erzeugung von Zeichenketten dienen die Operatoren # und ##:
– #: Umwandlung eines Symbol in eine Zeichenkette– ##: Verkettung zweier Symbole zu Einem
Prof. Dr. Nikolaus Wulff Programmieren in C 3
Präprozessor Beispiele
#define TABSIZE 10int array[TABSIZE];
#define square(x) (x)*(x)
#if OS == WINDOWS #define NL "\n" #elif OS == UNIX #define NL "\n\r"#else #error "Unkown OS"#endif
double x = square(5);
Konstante definierenund verwendenMacrofunktion definierenBedingte Übersetzung
Fehlermeldung
Macrofunktion verwenden
Prof. Dr. Nikolaus Wulff Programmieren in C 4
Funktionen deklarieren
• C kennt das Konzept der Trennung von Deklaration und Implementierung.
• Methoden werden in *.h Dateien deklariert.• Die eigentliche Implementierung erfolgt dann in einer
getrennten *.c Datei.• So ist z.B. die Funktion printf in stdio.h deklariert, die
Implementierung erfolgt jedoch an anderer Stelle. • Ebenso ist es möglich eigene Funktionen zu definieren
und getrennt zu implementieren.• Dies erleichtert eine sauber strukturierte, modulare
Programmierung.
Prof. Dr. Nikolaus Wulff Programmieren in C 5
Funktionen deklarieren
• Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes und der möglichen Argumente:
• Das Ganze macht die Signatur der Methode aus. • Mit dieser obigen Schreibweise ist es möglich eine
Funktion abstrakt zu deklarieren, ohne diese an der selben Stelle direkt auszuimplementieren.
• Es geht darum was die Methode macht und nicht darum wie sie es macht.
<returnValue> <fctName>(<arg1>,...,<arg
N>);
Prof. Dr. Nikolaus Wulff Programmieren in C 6
Modulares Programmieren
• Eine solche Funktionendeklaration erfolgt i. A. in einer *.h Datei.
• In einer zugehörigen *.c Datei befindet sich dann die Implementierung der Funktion. Diese muss die selbe Signatur wie die Deklaration besitzen.
• Funktionen mit Rückgabewert, müssen das Resultat mit return an die aufrufende Methode zurückliefern.
• Funktionen ohne Rückgabewert werden durch die Bezeichnung void kenntlich gemacht.
• Es ist möglich Funktionen / Methoden ohne Parameter zu deklarieren.
Prof. Dr. Nikolaus Wulff Programmieren in C 7
Module
• Die Fahrenheit-Celsius Konvertierung wird als eigenständiges Modul entwickelt.
• Die Deklaration erfolgt in einer Datei f2c.h:
#ifndef __F2C_H_#define __F2C_H_ /** * calulate celsius as fct of fahrenheit */float f2c(double f);/** * calulate fahrenheit as fct of celsius */float c2f(double c);#endif /* __F2C_H_ defined */
Die #ifndef und #define Anweisungen verhindern,dass f2c.h rekursiv inkludiertwerden kann.
Prof. Dr. Nikolaus Wulff Programmieren in C 8
Eigene Funktionen implementieren
/** two constants for f2c and c2f calculus */#define SHIFT 32.0#define SCALE (9.0/5.0)/** calulate celsius as fct of fahrenheit */float f2c(double f) { double c = (f - SHIFT)/SCALE; return (float) c;}/** calulate fahrenheit as fct of celsius */float c2f(double c) { double f = c*SCALE + SHIFT; return (float) f;}
• Die eigentliche Implementierung geschieht in der Datei f2c.c:
Prof. Dr. Nikolaus Wulff Programmieren in C 9
Verwendung von Funktionen
• Die main Methode in der Datei Main.c ist nun sehr einfach, kurz und aufgeräumt:
• Main.c muss lediglich f2c.h (nicht f2c.c!)inkludieren, damit die Funktion c2f bekannt ist.
• Der Linker bindet die entsprechenden Methoden.
#include <stdio.h>#include "f2c.h"
int main() { float c; for (c =0; c <= 100; c +=10) { printf("%5.1f °C sind %5.1f °F\n", c, c2f(c)); } return 1;}
<xxx.h> im include-Pfad des Compilers."xxx.h" lokale Header Datei des Projekts.
Prof. Dr. Nikolaus Wulff Programmieren in C 10
Modularer Aufbau
• Die in einer xxx.h Datei deklarierten Methoden werden meist in einer xxx.c Datei implementiert.
• Dies macht im Fehlerfall das Suchen der zugehörigen Implementierung einfacher.
f2c.h
f2c.c Main.c
#includeimplements
Application
f2c.o
Main.o
Prof. Dr. Nikolaus Wulff Programmieren in C 11
Weitere Beispiele von Funktionenlong ggT(long a, long b) { long r; do { r = a % b; a = b; b = r; } while( r != 0); return a;}
Berechnung des größtengemeinsamen Teilers.
long factorial(int x) { int i; long prod = 1; for(i=2; i<=x; i++) { prod *=i; } return prod;}
Berechnung derFakultät x!
Prof. Dr. Nikolaus Wulff Programmieren in C 12
C Aufruf Konvention
• Die Parameter einer C Funktion werden i.A. als Werte übergeben.
• Die aufgerufene Funktion erhält eine Kopie der Werte des Aufrufers.
• Die Funktion kann lokal die Parameterwerte verändern, ohne dass dies die Werte des Aufrufers verändert.
• Diese Konvention gilt für alle primitiven Basisdatentypen wie char, int, long, double etc.
• Bei Feldern wird die Adresse des ersten Felds übergeben, d. h. eine Referenz.
Prof. Dr. Nikolaus Wulff Programmieren in C 13
Verwendung der Parameter
• Die Fakultät Funktion darf daher das übergebene Argument x gefahrlos modifizieren, ohne Seiteneffekte für den Aufrufer...
• Anstatt einer for-Schleife funktioniert ebenso die while-Schleife. (Zu Hause ausprobieren...!)
long factorial(int x) { long prod = x--; for(; x > 1; x--) { prod *=x; } return prod;}
long factorial(int x) { int i; long prod = 1; for(i=2; i<=x; i++) { prod *=i; } return prod;}
Prof. Dr. Nikolaus Wulff Programmieren in C 14
• Makros und Funktionen werden in Header Dateien (*.h) deklariert.
• Nur diese werden in eigenen Implementierung per #include eingebunden!
• Durch die Trennung von *.h und *.c Dateien lässt sich die Deklaration der Funktionssignaturen von der Implementierung trennen.
• Der Quellcode wird dadurch modular und aufge-räumt und ermöglicht die Verwendung von exter-nen Bibliotheken, ohne das deren Implementier-ung mit ausgeliefert werden muss. Lediglich die *.h Dateien sind im Quelltext notwendig.
Zusammenfassung