14
Prof. Dr. Nikolaus Wulff Programmieren in C Programmieren in C Macros, Funktionen und modulare Programmstruktur

Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

  • Upload
    vudat

  • View
    217

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

Prof. Dr. Nikolaus Wulff

Programmieren in CProgrammieren in C

Macros, Funktionen und modulare Programmstruktur

Page 2: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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

Page 3: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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

Page 4: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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.

Page 5: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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>);

Page 6: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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.

Page 7: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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.

Page 8: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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:

Page 9: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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.

Page 10: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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

Page 11: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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!

Page 12: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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.

Page 13: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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;}

Page 14: Programmieren in C Funktionen - · PDF fileProf. Dr. Nikolaus Wulff Programmieren in C 5 Funktionen deklarieren • Eine Funktion wird deklariert durch Angabe des Namens, des Rückgabewertes

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