360 likes | 583 Views
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
E N D
Programmieren in CGrundlagen 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 • 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
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
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.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
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 PI3.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) • 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
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 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
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.svgnach Aufruf von cpp –P draw.txt draw.svg Programmieren in C - Peter Klingebiel - HS Fulda - DVZ