Informatik II Programmieren in C - Webserver - DVZ

Download Report

Transcript Informatik II Programmieren in C - Webserver - DVZ

Informatik II
Grundlagen der Programmierung
Programmieren in C
Grundlagen C 5
Hochschule Fulda – FB ET
Sommersemester 2010
http://www.rz.hs-fulda.de/et
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
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
/*
*
*
*
*/
segment.c
Adressen Text-/Datensegmente zei
klin, 05.05.2010
#include <stdio.h>
const int maxi = 123;
int glob;
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 Programms
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
8
Lebensdauer 2
• Beispiel: lifetime.c
/*
*
*
*
*/
lifetime.c
Lebensdauer von Variablen
klin, 05.05.2010
#include <stdio.h>
char *strcopy2(char s[])
{
char b[32];
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
/*
*
*
*
*/
scope.c
Sichtbarkeit von Variablen
klin, 05.05.2010
int bvar = 0;
/* global */
int main()
{
int avar;
/* Block 1 */
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
#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
(expr1)
#elif (expr2)
#else
#endif
• und
#ifdef (symbol)
#ifndef (symbol)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
23
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
24
C-Preprozessor 10
• Beispiel: cppdemo.h
/*
*
*
*
*/
cppdemo.h
CPP-Funktionen zeigen
klin, 05.05.2010
#include <stdio.h>
#define MSG1 "cppdemo: gestartet!"
#define MSG2(n) printf("cppdemo: in pro
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
25
C-Preprozessor 11
• Beispiel: cppdemo.c
/*
*
*
*
*/
cppdemo.c
CPP-Funktionen zeigen
klin, 05.05.2010
#include "cppdemo.h"
int main()
{
printf("%s\n", MSG1);
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
26
C-Preprozessor 12
• Beispiel: Nach CPP-Lauf Sun Solaris
void proc(int n)
{
int i;
for(i = 0; i < n; i++)
printf("cppdemo: in proc() %d\n", i
}
int main()
{
printf("%s\n", "cppdemo: gestartet!")
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
27
C-Preprozessor 13
• Beispiel: Nach CPP-Lauf Windows
void proc(int n)
{
int i;
for(i = 0; i < n; i++)
printf("cppdemo: in proc() %d\n", i
}
int main()
{
printf("%s\n", "cppdemo: gestartet!")
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
/*
*
*
*
*/
cpptrap.c
CPP Fallen
klin, 05.05.2010
#include <stdio.h>
#define min(a, b) (a < b ? a : b)
#define max(a, b) (a > b ? a : b)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
30
C-Preprozessor 16
• Beispiel: Nach CPP-Lauf  Nebeneffekte!!
int main()
{
int mi, ma;
int i, j;
i = 5, j = 3;
mi = (i < j ? i : j);
ma = (i > j ? i : j);
printf("i=%d j=%d min=%d max=%d\n", i
i = 5, j = 3;
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. m4 u.a.
• Includefile draw.inc
/* draw.inc - svg defines */
#define SVG_BEGIN(WIDTH, HEIGHT) \
<?xml version="1.0" encoding="ISO-8859<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 2
<svg width=#WIDTH height=#HEIGHT xmlns=
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
32
C-Preprozessor 18
• Grafikdatei draw.txt
/* draw.txt */
#include "draw.inc"
SVG_BEGIN(600, 400)
SVG_TITLE(SVG und CPP)
SVG_DESC(SVG + CPP)
SVG_COMMENT(hier gehts los)
SVG_LINE(10, 10, 500, 350, 4, green, 1.
SVG_LINE(0, 400, 600, 100, 8, gold, 1.0
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
33
C-Preprozessor 19
• Grafikausgabe draw.svg
nach Aufruf von cpp –P draw.txt draw.svg
<?xml version="1.0" encoding="ISO-8859<title>SVG und CPP</title>
<desc>SVG + CPP</desc>
<!-- hier gehts los -->
<line x1="10" y1="10" x2="500" y2="350"
<line x1="0" y1="400" x2="600" y2="100"
<circle cx="300" cy="200" r="180" strok
<rect x="100" y="100" width="300" heigh
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
34