34
Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014 http://c-ai.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ

Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014 Peter Klingebiel, HS Fulda, DVZ

Embed Size (px)

Citation preview

Page 1: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C

Grundlagen C 5

Hochschule Fulda – FB AI

Sommersemester 2014

http://c-ai.rz.hs-fulda.de

Peter Klingebiel, HS Fulda, DVZ

Page 2: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  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

Page 3: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3

Speichersegmentierung 2

• Beispiel (Sun Solaris)

Page 4: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4

Speichersegmentierung 3

• Diskussion– Warum? Welche Vorteile hat das?

Page 5: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5

Speichersegmentierung 4

• Beispiel: segment.c

Page 6: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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

Page 7: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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!

Page 8: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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

Page 9: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9

Lebensdauer 2

• Beispiel: lifetime.c

Page 10: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10

Lebensdauer 3

• Diskussion– Welche Ausgaben erzeugt lifetime?

Page 11: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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

Page 12: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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

Page 13: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13

Sichtbarkeit 3

• Beispiel: 2 Module / Quelldateien

Page 14: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14

Sichtbarkeit 4

• Beispiel: scope.c

Page 15: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15

Sichtbarkeit 5

• Diskussion– Welche Ausgaben erzeugt scope?

Page 16: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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

Page 17: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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

Page 18: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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

Page 19: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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");}

Page 20: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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

Page 21: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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;}

Page 22: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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);

Page 23: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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)

Page 24: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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();

Page 25: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25

C-Preprozessor 10

• Beispiel: cppdemo.h

Page 26: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26

C-Preprozessor 11

• Beispiel: cppdemo.c

Page 27: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27

C-Preprozessor 12

• Beispiel: Nach CPP-Lauf Sun Solaris

Page 28: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28

C-Preprozessor 13

• Beispiel: Nach CPP-Lauf Windows

Page 29: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29

C-Preprozessor 14

• Diskussion– Sinnvolle Verwendung von CPP?– Verbesserungen?

Page 30: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30

C-Preprozessor 15

• Beispiel: cpptrap.c

Page 31: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31

C-Preprozessor 16

• Beispiel: Nach CPP-Lauf Nebeneffekte!!

Page 32: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

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

Page 33: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33

C-Preprozessor 18

• Grafikdatei draw.txt

Page 34: Programmieren in C Grundlagen C 5 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34

C-Preprozessor 19

• Grafikausgabe draw.svgnach Aufruf von cpp –P draw.txt draw.svg