Programmieren in C Grundlagen C 5 Hochschule Fulda


































- Slides: 34
Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Wintersemester 2014/15 http: //c-ai. rz. hs-fulda. de Peter Klingebiel, HS Fulda, DVZ
Speichersegmentierung 1 • Programmcode und Programmdaten eines Programms werden von Betriebssystem in unterschiedliche Speichersegmente geladen • Programmcode Textsegment • globale / statische Datensegmente – Konstanten – initialisierte Daten – nicht initialisierte Daten • automatische Daten Stacksegment – Daten werden erst bei Eintritt in Block erzeugt Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
Speichersegmentierung 2 • Beispiel (Sun Solaris) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3
Speichersegmentierung 3 • Diskussion – Warum? Welche Vorteile hat das? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4
Speichersegmentierung 4 • Beispiel: segment. c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5
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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6
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! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7
Lebensdauer 1 • 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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8
Lebensdauer 2 • Beispiel: lifetime. c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9
Lebensdauer 3 • Diskussion – Welche Ausgaben erzeugt lifetime? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10
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 sichtbar Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12
Sichtbarkeit 3 • Beispiel: 2 Module / Quelldateien Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13
Sichtbarkeit 4 • Beispiel: scope. c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14
Sichtbarkeit 5 • Diskussion – Welche Ausgaben erzeugt scope? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15
C-Preprozessor 1 • C-Preprozessor bearbeitet C-Quelltexte vor dem eigentlichen Compilerlauf • reiner textueller Eingriff in den Quelltext • CPP hat eigene Syntax • # leitet CPP-Anweisungen ein • CPP-Anweisungen nicht mit ; terminiert! • Wichtige Funktionen von CPP: – #include – Dateien einfügen – #define – Makros definieren – #if / #ifdef – Bedingte Compilierung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16
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 • CPP kann auch autonom verwendet werden Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17
C-Preprozessor 3 • Syntax: #include <filename. h> #include "filename. h" • <filename. h> - fügt Headerdatei aus Standardinclude- und Systemverzeichnissen ein, z. B. /usr/include, die i. d. R. mit dem Compiler oder dem System mitgeliefert werden • "filename. h" – fügt Headerdatei aus Benutzer-/Projektverzeichnissen ein, z. B. aus dem aktuellen Verzeichnis Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18
C-Preprozessor 4 • Beispiel: myincl. h puts("hallo"); • mydemo. c int main(void) { #include "myincl. h" } • nach CPP-Lauf: int main(void) { puts("hallo"); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19
C-Preprozessor 5 • #define – definiert ein Makro Textersatz #define makroname ersatztext #undef makroname • Beispiele: – #define UNIX - Makroname UNIX kann z. B. bei bedingter Compilierung verwendet werden – #define EOF (-1) - Makroname EOF wird durch Ersatztext (-1) ersetzt wie Konstante Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
C-Preprozessor 6 • Beispiel: mydefs. h #define PI 3. 141 • myprog. c #include "mydefs. h" int main(void) { double p = PI; } • nach CPP-Lauf: int main(void) { double p = 3. 141; } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21
C-Preprozessor 7 • Parametrisierte Makros • Makroparameter werden in Ersatztext ersetzt • Beispiel: #define min(a, b) (a < b ? a : b) • Quelltext int i = 2, j = 3, m; m = min(i, j); • Nach CPP-Lauf: int i = 2, j = 3, m; m = (i < j ? i : j); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22
C-Preprozessor 8 • Bedingte Compilierung Verändern des Quelltextes abhängig von CPP-Makros • Syntax #if (expr 1) #elif (expr 2) #else #endif • und #ifdef (symbol) #ifndef (symbol) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23
C-Preprozessor 9 • Beispiel: proc 1(); #ifdef DEBUG puts("nach proc 1"); #endif proc 2(); • Nach Aufruf von cpp: proc 1(); proc 2(); • Nach Aufruf von cpp –DDEBUG: proc 1(); puts("nach proc 1"); proc 2(); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24
C-Preprozessor 10 • Beispiel: cppdemo. h Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25
C-Preprozessor 11 • Beispiel: cppdemo. c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
C-Preprozessor 12 • Beispiel: Nach CPP-Lauf Sun Solaris Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
C-Preprozessor 13 • Beispiel: Nach CPP-Lauf Windows Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28
C-Preprozessor 14 • Diskussion – Sinnvolle Verwendung von CPP? – Verbesserungen? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29
C-Preprozessor 15 • Beispiel: cpptrap. c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30
C-Preprozessor 16 • Beispiel: Nach CPP-Lauf Nebeneffekte!! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31
C-Preprozessor 17 • Beispiel: Nutzung von CPP als reiner Textbzw. Makroprozessor • Geht, doch CPP ist dafür nicht vorgesehen, Alternativen sind z. B. m 4 u. a. • Includefile draw. inc Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32
C-Preprozessor 18 • Grafikdatei draw. txt Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33
C-Preprozessor 19 • Grafikausgabe draw. svg nach Aufruf von cpp –P draw. txt draw. svg Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34


































