programmieren in c grundlagen c 5 hochschule fulda – fb ai wintersemester 2013/14 peter...
TRANSCRIPT
Programmieren in C
Grundlagen C 5
Hochschule Fulda – FB AI
Wintersemester 2013/14
http://c.rz.hs-fulda.de
Peter Klingebiel, HS Fulda, DVZ
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
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 3
Speichersegmentierung 2
• Beispiel (Sun Solaris)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4
Speichersegmentierung 3
• Diskussion– Warum? Welche Vorteile hat das?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5
Speichersegmentierung 4
• Beispiel: segment.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6
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 7
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 8
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 9
Lebensdauer 2
• Beispiel: lifetime.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10
Lebensdauer 3
• Diskussion– Welche Ausgaben erzeugt lifetime?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
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 12
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 13
Sichtbarkeit 3
• Beispiel: 2 Module / Quelldateien
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14
Sichtbarkeit 4
• Beispiel: scope.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15
Sichtbarkeit 5
• Diskussion– Welche Ausgaben erzeugt scope?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16
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 17
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 18
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 19
C-Preprozessor 4
• Beispiel: myincl.hputs("hallo");
• mydemo.cint main(void){#include "myincl.h" }
• nach CPP-Lauf:int main(void){puts("hallo");}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
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 21
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 22
C-Preprozessor 7
• Parametrisierte Makros• Makroparameter werden in Ersatztext ersetzt • Beispiel:#define min(a, b) (a < b ? a : b)
• Quelltextint 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 23
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 24
C-Preprozessor 9
• Beispiel:proc1();#ifdef DEBUGputs("nach proc1");#endifproc2();
• Nach Aufruf von cpp:proc1();proc2();
• Nach Aufruf von cpp –DDEBUG:proc1();puts("nach proc1");proc2();
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25
C-Preprozessor 10
• Beispiel: cppdemo.h
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
C-Preprozessor 11
• Beispiel: cppdemo.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
C-Preprozessor 12
• Beispiel: Nach CPP-Lauf Sun Solaris
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28
C-Preprozessor 13
• Beispiel: Nach CPP-Lauf Windows
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29
C-Preprozessor 14
• Diskussion– Sinnvolle Verwendung von CPP?– Verbesserungen?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30
C-Preprozessor 15
• Beispiel: cpptrap.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31
C-Preprozessor 16
• Beispiel: Nach CPP-Lauf Nebeneffekte!!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32
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 33
C-Preprozessor 18
• Grafikdatei draw.txt
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34
C-Preprozessor 19
• Grafikausgabe draw.svgnach Aufruf von cpp –P draw.txt draw.svg