Betriebssysteme / C - HS Fulda

Werbung
Betriebssysteme
Kurze Einführung in C
oder
Was man von C wissen muss 8-)
Hochschule Fulda – FB AI
Wintersemester 2016/17
http://bs.rz.hs-fulda.de
Peter Klingebiel, HS Fulda, FB AI
Der Alles-Markierer von Pia Valentin (AI - Digitale Medien – Danke an Pia für das Foto)
1. Platz im Fotowettbewerb „Zeig mir wie Du lernst“, HS Fulda 2014
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
2
Programmieren in C
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
3
Java – C 1
• Java ist objektorientiert
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
4
Java – C 2
• Objekte kapseln Daten (Attribute) und
Operationen auf den Daten (Methoden)
• Attribute = Daten in C
• Methoden = Funktionen in C
• Objekte kommunizieren durch Senden und
Emfangen von Nachrichten
• Objekte entstehen durch Instantiierung einer
Objektklasse
• Java aus C abgeleitet
• Daher einige Ähnlichkeiten von Java und C
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
5
Java – C 3
• C ist eine imperative strukturierte Sprache
• Daten werden durch die Mühle von Funktionen geschickt, um dann zu einem Resultat
(Ergebnisdaten) zu kommen
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
6
Java – C 4
• Beispiel Java:
public class HelloWorld {
public static void main(String args[])
{ // Ausgabe Hello World!
System.out.println("Hello World!");
}
}
• Beispiel C:
int main(int argc, char *argv[])
{
printf("Hello World!\n");
return(0);
}
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
7
Woher kommt C?
• 1971-73 Dennis Ritchie entwickelt bei den Bell
Laboratorien C für die Programmierung des neuen
UNIX-Betriebssystems
• 1973 Implementierung von UNIX in C
• Vorläufer: B (1969/70) und BCPL (1960er Jahre)
• 1978 Ritchie/Kernighan: „The C Programming Language“
(dt. „Programmieren in C“)
• 1989 Norm ANSI X3.159-1989 Programming Language C
• 1990 ISO Standard C90
• 1995 erweiterter ISO Standard C95
• 1999 ISO/IEC 9899:1999
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
8
Einsatzgebiete von C
•
•
•
•
•
•
•
•
•
•
CAD-, CAE-, Simulationssysteme
Text- und Grafikverarbeitungssysteme
Mathematik-, Numerische Systeme
Betriebssysteme (Unix, Linux, ...)
Systemprogramme (Unix, Linux, Windows, ...)
Sprachinterpreter, -compiler (GNU C++, CC)
Netz-, Webdienste (Apache Webserver, ...)
Steuerungs-, Regelungssysteme
Microcontrollerprogramme
Aber auch: Mathlab  C-Code
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
9
Wie wird ein C-Programm ausgeführt? 1
• Ausführung direkt auf dem Prozessor
–
–
–
–
z.B. Temperaturregelung in Kühltruhe
z.B. Arduino-Sketch
Programm in ROM, EPROM o.ä. gespeichert
alle Funktionalitäten müssen im Programm in
Maschinencode vorhanden sein
• Ausführung auf einem Betriebssystem
– Hardware ist durch das BS gekapselt
– Starten/Beenden des Programms über das BS
– Unterstützung durch BS bzw. BS-Funktionen,
z.B. IO, Dateien, Timer, Signale, Threads usw.
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
10
Wie wird ein C-Programm ausgeführt? 2
• Betriebssystem
Anwendungsprogramm
Funktionsbibliotheken
Systemcalls / Systemaufrufe
Hardware / Prozessor
• Mikrocontroller
Anwendungsprogramm
(incl. aller Funktionen)
Hardware / Prozessor
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
11
Wie ist ein C-Programm aufgebaut?
• Beispiel hallo.c
/*
*
*/
hallo.c
#include <stdio.h>
int main(void)
{
char *text = "Hallo, Welt! ";
printf("%s\n", text);
return(0);
}
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
12
Grafik von Prof. Dr. U. Werner, ET
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
13
C-Preprozessor 1
• C-Preprozessor bearbeitet C-Quelltexte
vor dem eigentlichen Compilerlauf
•  rein textueller Eingriff in den Quelltext
• CPP hat eigene Syntax
• # leitet CPP-Anweisungen ein
• CPP-Anweisungen nicht mit ; terminiert!
• Wichtige Direktiven von CPP:
– #include
– Dateien einfügen
– #define
– Makros definieren
– #if / #ifdef – Bedingte Compilierung
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
14
C-Preprozessor 2
• #include – fügt den Inhalt anderer Dateien
(sog. Headerfiles) in den Quelltext ein
• Includedateien enthalten i.w.
–
–
–
–
–
–
–
Deklarationen von Funktionen (prototypes)
Deklarationen von Datentypen
Deklarationen von externen/globalen Variablen
Definitionen von Konstanten (const)
Definitionen von Konstanten als CPP-Makro
Definitionen von CPP-Makros
Bedingte Compilierung
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
15
C-Preprozessor 3
• #define – definiert ein Makro
 Textersatz
#define makroname
#define makroname ersatztext
#undef makroname
• Beispiele:
– #define UNIX - Makro UNIX definiert, z.B. zur
Verwendung bei bedingter Compilierung
– #define EOF (-1) - Makro EOF wird durch
Ersatztext (-1) ersetzt  wie Konstante
– #undef TEST - Makro TEST nicht definiert
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
16
C-Preprozessor 4
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
17
C-Preprozessor 5
• Bedingte Compilierung  Verändern des
Quelltextes abhängig von CPP-Makros
• Syntax
#if
(expr1)
#elif (expr2)
#else
#endif
• und
#ifdef (symbol)
#ifndef (symbol)
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
18
Reservierte Worte in C
• C kennt nur 33 reservierte Worte
auto
const
double
float
if
return
static
union
while
break
continue
else
for
int
short
struct
unsigned
case
default
enum
goto
long
signed
switch
void
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
char
do
extern
inline
register
sizeof
typedef
volatile
19
Anweisung / Ausdruck 1
• C kennt keine Anweisungen (statements),
sondern nur Ausdrücke (expressions)
• Ausdruck hat einen Wert (wie in Assembler!)
• Beispiel: Zuweisung in C
int i;
i = 4711;
• Zuweisung kann auch ausgewertet werden:
int a, b, c, i, j;
a = b = c = 3;
if(i = 4711)
...
while(j = 1)
...
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
20
Anweisung / Ausdruck 2
• Ausdruck  Gültige Kombination von
Konstanten, Variablen, Operatoren, Funktionen
• Reihenfolge der Auswertung
– Vorrangregeln der Operatoren legen Reihenfolge
der Auswertung implizit fest
– Klammern ( ) legen Vorrangregeln explizit fest
– Sind Vorrangregeln nicht eindeutig
 Reihenfolge der Auswertung nicht definiert
– Compiler kann Ausdrücke / Teilausdrücke in
effizient auswerten / optimieren
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
21
Typumwandlung in Ausdrücken
• Implizite (automatische) Typumwandlung
• Explizite Typumwandlung durch Type Casting:
double x; int i = 3, j = 10;
x = (double) i / (double) j;
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
22
Datentypen 1
• Vordefinierte Grunddatentypen
char
int
Zeichen (ASCII-Kode, 8 Bit)
Ganzzahl (maschinenabhängig,
meist 16 oder 32 Bit)
float Gleitkommazahl (32 Bit, IEEE,
etwa auf 6 Stellen genau)
double doppelt genaue Gleitkommazahl
(64 Bit, IEEE, etwa auf
12 Stellen genau)
void
ohne Wert (z.B. Zeiger)
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
23
Datentypen 2
• Type-Modifier spezifizieren Grunddatentypen
• short int, long int, long long
– legen Länge der Ganzzahl
– maschinenabhängig, 16 Bit, 32 Bit
– int kann auch fehlen
• long double
– Gleitkommazahl, erw. Genauigkeit
– oft 96 oder 128 Bit, IEEE
• signed, unsigned
– char/int mit/ohne Vorzeichen
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
24
Konstanten
• Konstanten haben einen festgelegten und
damit unveränderbaren Wert
• explizite Definition, z.B.
const float pi = 3.141;
• implizite Definition, z.B.
u = 2 * r * 3.141;
• mittels CPP textuelle implizite Ersetzung
#define PI 3.141
...
u = 2 * PI * r;
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
25
Variablen 1
• Variable sind Platzhalter für Daten
• haben einen festgelegten Speicherort,
an dem der aktuelle Wert gespeichert wird
• der aktuelle Wert (an seinem Speicherort)
ist veränderbar
• Eigenschaften von Variablen:
–
–
–
–
–
Datentyp
Namen (Bezeichner, Identifier)
Lebensdauer / Speicherklasse
evtl. initialer Wert
Sichtbarkeit (Scope)
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
26
Variablen 2
• Variablen-Definitionen
typ name und evtl. Initialisierung , z.B.
double u;
short int i, tab = 5;
char *hallo = "Hallo, Welt!";
• Position im Programm:
– außerhalb von Funktionen
– in einem Block, also zwischen {
}
• Wert ist veränderbar (Zuweisung, Operation)
• Programmstruktur  Lebensdauer / Scope
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
27
Wie speichert C?
• Programmstart und Aufruf von main()
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
28
Zeiger 1
• Jede Variable hat einen Speicherort,
d.h. eine Adresse im Hauptspeicher
• Zeiger (Pointer) sind Variable, die auf eine
andere Variable verweisen, oder
exakter: den Speicherort bzw. die Adresse
dieser Variablen als Wert haben
• Pointerdefinition:
int *ip;
int i = 5;
• Adresszuweisung: ip = &i;
• Zugriff auf Wert:
*ip = *ip + *ip;
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
29
Zeiger 2
• Zuweisung ip = &i;
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
30
Funktionsaufruf und Parameter
• Parameterübergabe als Werte (call by value),
z.B. bei printf()
• Variable werden als Werte in den
Adressraum der Funktion kopiert
• Parameterübergabe als Adresse (call by
reference), z.B. bei scanf()
• Adressen der Variablen werden in den
Adressraum der Funktion kopiert
• In Funktion sind die Parameter  Zeiger
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
31
Call by value
• Kopie des Parameters an Funktion
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
32
Call by reference
• Kopie der Adresse an Funktion
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
33
Felder 1
• ein Feld (array) ist die Zusammenfassung
von Daten gleichen Typs in einer Variablen
• Felder haben eine oder auch mehrere
Dimensionen (Vektoren, Matrizen, …)
• Definition von Feldern:
char sbuf[128];
int arr[] = { 1, 8, 7, -1, 2 };
short mat[2][2] = { 11, 12, 21, 22};
• mit der Felddefinition wird der benötigte
Speicherplatz für die Variable reserviert
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
34
Felder 2
• Zugriff auf Feldelemente mit Index in []:
char c;
c = sbuf[32];
sbuf[0] = 'A';
• die Feldindizierung beginnt immer mit 0!
short s, mat[3][3];
s = mat[0][0];
• Felder werden elementweise und Zeile für
Zeile hintereinander gespeichert
• es gibt beim Zugriff keinerlei Überprüfungen
auf Bereichsgrenzen von Feldern!
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
35
Felder 3
• Feldvariable sind eigentlich Pointer, sie
zeigen auf das erste Element im Feld
int i, *ip, ia[4] = {11, 22, 33, 44};
ip = ia;
i = *++ip;
• Felder werden mit Adresse an Funktionen
übergeben (wie Pointer)
• Feldindizes sind eigentlich Offsets und geben
den Abstand zum Feldanfang an
Bsp: ia[3]  *(&ia[0] + 3 * sizeof(int))
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
36
Felder und Zeiger
• Felder reservieren bei der Definition den
benötigten Speicherplatz
• Zeiger erhalten den Speicherplatz erst bei der
Zuweisung des Objekts, auf das sie zeigen,
oder bei dynamischer Speicherallokation
• Ähnlichkeit von Feldern und Zeigern
 mächtige Pointerarithmetik möglich
• Manchmal ein wenig unverständlich!
• Pointer essentiell bei Zeichenketten (strings)
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
37
Zeichenketten 1
• Zeichenketten (strings) sind eine Folge von
Einzelzeichen char
• String ist terminiert mit '\0'
•  Speicherbedarf: Länge + 1 Byte
• Beispiel:
char *s;
char *hallo = "Hallo, Welt!";
• String  Pointer auf Feld von Elementen vom
Typ char
• Nullstring  NULL (definiert in stdio.h)
• Leerstring  char *leerstr = "";
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
38
Zeichenketten 2
• Beispiel:
char buffer[128];
char *bp = buffer;
• Stringpointer bp  erstes Zeichen im Feld
buffer
•  Ähnlichkeit von Feldern und Pointern!
• Beispiel: String kopieren und ausgeben
char buffer[64], *bp;
strcpy(buffer, "Hallo, Welt");
bp = buffer;
while(*bp)
putchar(*bp++);
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
39
Kommandozeilenparameter
• Jedes C-Programm startet mit einer mainFunktion
• main-Funktion ist vom Typ int und hat drei
Parameter:
• int argc
Anzahl von Kommandozeilenparametern
• char *argv[]
Feld von Strings  Kommandozeilenparameter
• char *envv[]
Feld von Strings  Umgebungsparameter
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
40
Aufzählungsdatentyp
• Aufzählungsdatentyp enum
• Für Datentypen mit diskreten konstanten
Werten
• Beispiel:
enum color { rot, gruen, blau } c;
enum boolean { FALSE, TRUE } b;
b = FALSE;
c = blau;
• Darstellung als int beginnend mit 0,
wenn nicht explizit angegeben:
enum boolean { TRUE=1, FALSE=0 } b;
b = TRUE;
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
41
Zusammengesetzte Datentypen 1
• Zusammenfassung von zusammengehörigen
Daten in eigenen Datentyp struct
• Beispiel: einfaches EA-Gerät mit 8-Bit
Steuerregister cr und 16-Bit Datenregister dr:
struct { char cr; int dr; } ea1;
struct _ea { char cr; int dr; } ea2;
• Zugriff durch Selektor .
if(ea1.cr & 0x01)
ea2.dr = 4711;
• bei Pointern durch Selektor ->
if(ea1->cr & 0x01)
ea2->dr = 4711;
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
42
Zusammengesetzte Datentypen 2
• Beispiel: Datentyp struct circle für
Objekt Kreis in einem Zeichenprogramm
notwendig  Mittelpunkt (x,y) und Radius r
/* Kreis: Typ */
struct circle {
int x; /* Mittelpunktkoordinate x */
int y; /* Mittelpunktkoordinate y */
int r; /* Radius */
};
struct circle c;
c.x = 100; c.y = 100; c.r = 50;
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
43
Zusammengesetzte Datentypen 3
• union - spezielle Art von struct
• anderer Name: varianter Rekord
• Speichern der Elemente in union nicht
nacheinander, sondern übereinander
• union-Elemente teilen sich Speicherplatz
• sinnvoll bei gleichartigen Objekten, die aber
verschiedenen Typs sein können
union {
char c;
short s;
int i;
} u;
/* Union:
/*
char
/*
short
/*
int
/* teilen sich Platz
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
*/
*/
*/
*/
*/
44
Zusammengesetzte Datentypen 4
• union meist Element in einem struct
• Typ des Elements in union muss definiert
sein  eigenes Typelement im struct
• Beispiel
struct number {
byte typ;
union {
byte b;
short s;
int i;
} u;
};
/* Struct Zahl
/* Typ union-Element
/* Union:
/*
byte
/*
short
/*
int
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
*/
*/
*/
*/
*/
*/
45
Typdefinitionen
• Oft sinnvoll, eigene Typen oder Untertypen
zu definieren typedef
• Beispiel:
typedef unsigned char byte;
• Beispiel:
typedef struct _ea {
byte cr;
int dr;
} ea;
ea ea1, ea2;
• eigentlich nur ein neuer Name für den Typ
 besser lesbar, bessere Dokumentation!
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
46
Ausdrücke
• Ausdrücke
– Definitionen, Zuweisungen, …
– arithmetische, logische, … Operationen, …
• bei Zuweisungen zu beachten:
gültiger l-value und r-value
– l-value (left, location) Variable mit Speicherplatz
– r-value (right, read) auswertbarer Ausdruck
– Beispiel:
int i, j;
i = 9 / 3;
45 = j;
/* gültiger l-value
*/
/* ungültiger l-value */
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
47
Blöcke 1
•
•
•
•
Zusammenfassung mehrerer Anweisungen
Geklammert mit { }
v.a. bei Funktionen, Kontrollstrukturen
aber auch lokale Blöcke (Unterblöcke)
z.B. zur Definition von lokalen Variablen,
insbesondere Hilfsvariablen
• legt Lebensdauer von Variablen fest
• legt Sichtbarkeit (Scope) von Variablen fest
• bei Namensgleichheit ist Variable des
innersten Blocks sichtbar
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
48
Blöcke 2
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
49
Kontrollstrukturen
• Kontrolle des Programmablaufs abhängig
von Ergebnis von Ausdrücken
• Selektionen / bedingte Anweisungen
– Einfache Alternative if … else
– Mehrfache Alternative if … else if … else
– Fallunterscheidung switch
• Iterationen / Schleifen
– Abweisende Schleife while
– Laufanweisung for
– Annehmende Schleife do … while
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
50
Selektionen 1
• Bedingte Anweisung if
• Syntax:
if (ausdruck)
anweisung
• Bedingte Anweisung if … else
• Syntax:
if (ausdruck)
anweisung
else
anweisung
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
51
Selektionen 2
• Mehrfache Alternative if…else if…else
if (ausdruck_1)
anweisung_1
else if(ausdruck_2)
anweisung_2
else if(ausdruck_3)
anweisung_3
else if (ausdruck_n)
anweisung_n
...
...
else
/* kann auch fehlen */
anweisung_else
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
52
Selektionen 3
• Mehrfachauswahl oder Fallunterscheidung
bei konstanten Alternativen
switch
switch(ausdruck){
case k1:
// k1  Konstante
anweisung_1;
break;
case k2:
// k2  Konstante
anweisung_2;
break;
. . .
default:
anweisung_default;
}
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
53
Iterationen 1
• Abweisende Schleife while, manchmal auch
kopfgesteuerte Schleife genannt
• Syntax
while (ausdruck)
anweisung
• Bedingung ausdruck wird vor Ausführung
vom Schleifenkörper anweisung geprüft
• Schleifenkörper wird nur ausgeführt, wenn
Bedingung ausdruck wahr ist
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
54
Iterationen 2
• Laufanweisung oder abweisende Schleife mit
for
• Syntax
for(ausdruck1; ausdruck2; ausdruck3)
anweisung
• Kann durch while-Schleife ersetzt werden:
ausdruck1;
while(ausdruck2) {
anweisung;
ausdruck3;
}
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
55
Iterationen 3
• Nicht-annehmende Schleife do while,
machmal auch: fußgesteuerte Schleife
• Syntax
do
anweisung
while (ausdruck)
• Bedingung ausdruck wird erst am Ende des
Schleifenkörperts geprüft
•  Schleife wird mindestens einmal
durchlaufen
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
56
Iterationen 4
• Schleifensteuerung
• break
– bricht die Ausführung der aktuellen Schleife bzw.
switch-Anweisung ab und verlässt diese
• continue
– bricht den aktuellen Schleifendurchlauf ab
– setzt mit Ausführung des Schleifenkopfes fort
• Endlosschleife
while(1) ...
for(;;) ...
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
57
Funktionen 1
• Funktionen sind Programmteile (Blöcke) mit
Namen, ggfs. Parametern und ggfs. einem
Rückgabewert
• elementare Bausteine für Programme
– gliedern umfangreiche Aufgaben in kleinere
Komponenten
– reduzieren Komplexität
– Wiederverwendung von Komponenten
– verbergen Details der Implementierung vor
anderen Programmteilen (black box)
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
58
Funktionen 2
• Funktionsdefinition
typ name(parameter)
• Typ
– Datentyp, der von Funktion zurückgeliefert wird
– void  kein Rückgabewert (Prozedur)
• Name
– Bezeichner kann beliebig gewählt sein
– Regeln für Identifier, keine Schlüsselworte
• Parameter
– Liste von typ name der Parameter in Klammern
– keine Parameter: () oder (void)
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
59
Funktionen 3
• Body  Block mit {} geklammert
• zusätzliche Anweisung return(ausdruck)
 Rückkehr aus der Funktion
• Bei void-Funktion: nur return
• nach Rückkehr aus Funktion  Programm
wird nach Funktionsaufruf fortgesetzt
• Typ von Ausdruck und Funktion müssen
übereinstimmen
• Klammern bei return können entfallen
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
60
Funktionen 4
• Die Ausdrücke in der Parameterliste werden
vor dem Sprung in die Funktion ausgewertet
 aktuelle Parameter
• Anzahl und Typen der Ausdrücke der
aktuellen Parameter müssen mit denen der
formalen Parameter in der Definition der
Funktion übereinstimmen
• Die Auswertungsreihenfolge der Parameterausdrücke ist nicht festgelegt
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
61
Funktionen 5
• Funktionen werden global definiert
 keine lokalen Funktionen möglich
• static beschränkt Funktion auf Modul
• main() ist normale Funktion, die aber beim
Programmstart automatisch aufgerufen wird
• Rekursion ist möglich:
int fak(int n)
{
if(n == 1) return(1);
else return(n * fak(n-1));
}
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
62
Funktionen 6
• Funktionen müssen deklariert sein, bevor sie
aufgerufen werden können
• Name, Rückgabetyp und Parametertypen
müssen dem Compiler bekannt sein
• Funktionsdefinition  Funktion ist
automatisch deklariert und bekannt
• sonst Prototype, z.B. in Headerdatei
typ name ( liste der parametertypen );
• Beispiele:
double sin(double);
double cos(double x);
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
63
Funktionen 7
• Parameterübergabe an Funktionen
• call by value
– aktuelle Parameter werden in Speicherbereich der
Funktion kopiert
– in Funktion: Änderungen nur lokal in Funktion
• call by reference
– In C nur über Zeiger realisierbar
– Adresse der Parameter werden in Funktion kopiert
– Änderungen an Parametern  Änderungen an
den originalen Variablen
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
64
Speicherklassen 1
• Funktionen können nur global, d.h.
ausserhalb von Blöcken definiert werden
– Sichtbarkeit global
– static  Sichtbarkeit im Quelldateikontext
• Variablen können ausserhalb von Blöcken,
d.h. global definiert werden
– Sichtbarkeit global
– static  Sichtbarkeit im Quelldateikontext
• Variablen können innerhalb von Blöcken,
d.h. lokal oder automatisch definiert werden
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
65
Speicherklassen 2
• auto
– nur innerhalb eines Blocks, Standardklasse
– Variable existiert / ist sichtbar nur im Block
• static
– in Block: Variable erhält ihren Wert
– sonst: Variable/Funktion nur in C-Quelle sichtbar
• extern
– Variable ist in anderer C-Quelle definiert
• register
– Variable  CPU-Register, hat keine Adresse!
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
66
Lebensdauer
• Lebensdauer einer Variablen ist die Zeit,
in der diese Variable Speicherplatz belegt
• lokale / automatische Variable
– „lebt“, d.h. hat einen Speicherort vom Anfang bis
zum Ende des Blocks, in dem sie definiert ist
– Speicherplatz wird bei Verlassen des Blocks
wieder freigegeben  Variable ist ungültig!
– Zugriff darauf ist dann undefiniert
• globale oder statische Variable
– „lebt“ vom Anfang bis zum Ende des Programms
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
67
Sichtbarkeit 1
• der Sichtbarkeitsbereich (Scope) einer
Variablen  Programmabschnitt, in dem die
Variable sichtbar / nutzbar / gültig ist
• der Scope wird durch den Ort der Definition
bzw. Deklaration der Variablen festgelegt
– innerhalb eines Blocks  sichtbar von der Stelle der
Definition bis zum Blockende
– ausserhalb  sichtbar von Stelle der Definition bzw.
Deklaration bis zum Ende der Quelldatei
– mit static definierte Variablen sind nur im Modul
(= C-Quelldatei) sichtbar
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
68
Sichtbarkeit 2
• globale Variable müssen ausserhalb von
Blöcken definiert sein
• Variablen aus anderen Modulen (globale
Variable) müssen explizit als extern
deklariert werden
• Scope einer Funktion: Bereich auf Ebene des
Programms, in der die Funktion nutzbar ist
– global
– sollte dann vor Nutzung bekannt sein (Prototype)
– lokal nur im Modul bei Definition als static
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
69
Module
• um größere Programmprojekte überschaubar
und sicherer zu machen, wird die Aufgabe in
kleinere Teilaufgaben (= Module) zerlegt
–
–
–
–
 Reduktion der Komplexität
 separates Entwickeln und Testen
 Wiederverwendbarkeit von Programmteilen
 Erstellen von Programmbibliotheken
• Abstraktion von Daten und Funktionen
• Kapselung von Daten
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
70
Bibliotheken
• in der Programmiersprache C sind nur die
notwendigsten Grundfunktionalitäten definiert
– es fehlen z.B. Funktionen für Ein-/Ausgabe,
Funktionen für Dateihandling, Funktionen für
Stringhandling, höhere mathematische Funktionen
und vieles andere mehr
– erleichtert die Entwicklung eines C-Compilers
– leichtere Anpassung / Übertragung auf andere
Hardware oder Betriebssystem
• Viele der o.g. Funktionen sind in der sog.
Standardbibliothek definiert!
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
71
Bibliotheken und Module
• Projekt: Module und Bibliotheken
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
72
Dynamischer Speicher
• Oft: Größe von Objekten erst zur Laufzeit
bekannt  Bereitstellen des benötigten
Speicherplatzes dynamisch (Heapsegment)
• #include <stdlib.h>
• Anforderung von Speicher:
– void *malloc(size_t s)
– s Bytes allozieren
– void *calloc(size_t n, size_t s)
– s * n Bytes allozieren und mit 0 initialisieren
– return NULL bei Fehler, sonst Pointer auf Speicherbereich
• Freigabe von alloziertem Speicher
– void free(void *ptr)
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
73
Dynamische Datenstrukturen
• häufig ist die Anzahl der zu speichernden und
zu bearbeitenden Daten erst zur Laufzeit des
Programms bekannt
• Felder ungeeignet: müssen zur Compilezeit
oder in Blöcken dimensioniert werden
•  dynamische Datenstrukturen
–
–
–
–
einfach verkettete Listen
doppelt verkettete Listen
Bäume
usw.
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
74
Dynamische Listen 1
• Beispiel: einfach verkettete Liste
/* Datentyp f. einfach verkettete Liste */
typedef struct _slist {
int value;
/* Daten
*/
struct slist *next;
/* Nachfolger
*/
} slist;
• Beispiel: doppelt verkette Liste
/* Datentyp f.
typedef struct
int value;
struct dlist
struct dlist
} dlist;
doppelt verkettete Liste
_dlist {
/* Daten
*prev;
/* Vorgaenger
*next;
/* Nachfolger
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
*/
*/
*/
*/
75
Dynamische Listen 2
• Objekte der Listentypen werden zur Laufzeit
– alloziert
slist *insert(slist *llp, int value){
slist *nlp;
nlp = (slist *) malloc(sizeof(slist));
– besetzt bzw. initialisiert
nlp-> value = value;
nlp->next = NULL;
– und in die Liste eingehängt
if(llp)
llp->next = nlp;
return(nlp);
}
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
76
Dynamische Listen 3
• Einfache Liste: Erzeugung 1. Element
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
77
Dynamische Listen 4
• Einfache Liste: n. Element und Verkettung
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
78
Dynamische Listen 5
• erstes Element wird oft Wurzel, Anker oder
Kopf der Liste genannt
• Durchlaufen der Liste i.d.R. von der Wurzel
der Liste aus
slist *root, *slp;
for(slp = root; slp; slp = slp->next)
printf("%d\n", slp->value);
• wird das letzte Listenobjekt mit der Wurzel
verlinkt  Ringpuffer
• Sortieren bei Erzeugen der Liste möglich
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
79
Felder, Zeiger, Listen 1
• bekannt: Felder und Zeiger werden in C ganz
ähnlich behandelt
• Wesentlichster Unterschied:
– Felder sind dimensioniert  ihnen ist ein fester
Speicherort zugeordnet  für die zu speichernden
Objekte / Feldelemente ist Platz vorhanden
– Zeiger weisen erst nach Zuweisung oder dyn.
Allozierung auf den Speicherort ihrer Objekte
• Feldvariable  Adresse des 1. Elements
• Feldindizes  Offset im Feld
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
80
Felder, Zeiger, Listen 2
• Konstante Dimensionierung von Feldern
double df[100];
/* Feld mit 100 Elementen */
• Variable Dimensionierung von Feldern nur für
automatische Feldvariable zulässig
void fun(int n) {
double df[n]; /* Feld mit n Elementen */
...
}
• Grund: Feldgröße muss beim Anlegen / bei
Speicherzuweisung des Felds bekannt sein
– statisch / global  Compilezeit
– automatisch / lokal  Eintritt in Funktion / Block
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
81
Felder, Zeiger, Listen 3
• variable Dimensionierung von statischen und
globalen Feldern häufig benötigt
• Lösung  dynamische Feldallozierung
• Beispiel: double-Feld dynamisch duplizieren
double *dbldup(double d[], int n) {
double *df;
int i;
df = calloc(n, sizeof(double));
for(i = 0; i < n; i++)
df[i] = d[i];
return(df);
}
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
82
 … und nun: viel Erfolg mit C…
Betriebssysteme - Peter Klingebiel - HS Fulda - FB AI
83
Zugehörige Unterlagen
Herunterladen