Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Wintersemester 2013/14 http://c.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 Daten 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
Speichersegmentierung 2 Beispiel (Sun Solaris) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Speichersegmentierung 3 Diskussion Warum? Welche Vorteile hat das? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Speichersegmentierung 4 Beispiel: segment.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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 Variablen können innerhalb von Blöcken, d.h. lokal oder automatisch definiert werden Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Speicherklassen 2 auto static extern register 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
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 Programms Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Lebensdauer 2 Beispiel: lifetime.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Lebensdauer 3 Diskussion Welche Ausgaben erzeugt lifetime? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
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
Sichtbarkeit 3 Beispiel: 2 Module / Quelldateien Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sichtbarkeit 4 Beispiel: scope.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sichtbarkeit 5 Diskussion Welche Ausgaben erzeugt scope? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
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
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
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
C-Preprozessor 5 #define – definiert ein Makro Textersatz #define makroname #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
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
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
C-Preprozessor 8 Bedingte Compilierung Verändern des Quelltextes abhängig von CPP-Makros Syntax #if (expr1) #elif (expr2) #else #endif und #ifdef (symbol) #ifndef (symbol) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
C-Preprozessor 9 Beispiel: proc1(); #ifdef DEBUG puts("nach proc1"); #endif proc2(); Nach Aufruf von cpp: proc1(); proc2(); Nach Aufruf von cpp –DDEBUG: proc1(); puts("nach proc1"); proc2(); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
C-Preprozessor 10 Beispiel: cppdemo.h Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
C-Preprozessor 11 Beispiel: cppdemo.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
C-Preprozessor 12 Beispiel: Nach CPP-Lauf Sun Solaris Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
C-Preprozessor 13 Beispiel: Nach CPP-Lauf Windows Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
C-Preprozessor 14 Diskussion Sinnvolle Verwendung von CPP? Verbesserungen? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
C-Preprozessor 15 Beispiel: cpptrap.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
C-Preprozessor 16 Beispiel: Nach CPP-Lauf Nebeneffekte!! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
C-Preprozessor 17 Beispiel: Nutzung von CPP als reiner Text- bzw. Makroprozessor Geht, doch CPP ist dafür nicht vorgesehen, Alternativen sind z.B. m4 u.a. Includefile draw.inc Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
C-Preprozessor 18 Grafikdatei draw.txt Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
C-Preprozessor 19 Grafikausgabe draw.svg nach Aufruf von cpp –P draw.txt draw.svg Programmieren in C - Peter Klingebiel - HS Fulda - DVZ