Globale Variablen

Werbung
Globale Variablen
Diverses
Globale Variablen
Globale Variablen
Globale Variablen
Diverses
Wdh: Variablen in Funktionen
Globale Variablen
lokale Variablen
Variablen bisher nur am Anfang von Funktionen
auch erlaubt: am Anfang innerer Codeblöcke
(innerhalb geschweifter Klammern)
in C99 und als gcc-Erweiterung:
an beliebiger Stelle innerhalb einer Funktion
Globale Variablen
Globale Variablen
Diverses
Wdh: Variablen in Funktionen
Globale Variablen
Sichtbarkeit und Lebensdauer von lokalen Variablen
lokale Variablen können benutzt werden von Punkt ihrer
Deklaration an bis zum Ende des Blocks, in dem sie deklariert
wurden
lokale Variablen existieren, bis der Block, in dem sie deklariert
wurden, verlassen wird
im Falle eines rekursiven Funktionsaufrufes existieren sie
mehrmals, nur die aktuell gültigen können verändert werden
Globale Variablen
Globale Variablen
Diverses
Wdh: Variablen in Funktionen
Globale Variablen
so nicht!
int *somevector( void )
{
int v[10];
/* irgendwas mit v */
return v;
/* falsch! */
}
Nach dem Verlassen der Funktion ist der für v angelegte Speicher
wieder freigegeben und wird anderweitig benutzt.
Hier muss malloc o.ä. verwendet werden.
Globale Variablen
Globale Variablen
Diverses
Wdh: Variablen in Funktionen
Globale Variablen
Globale Variablen
Variablen können auch außerhalb von Funktionen (deshalb auch:
externe Variablen) deklariert werden.
Für diese gilt:
Sie sind global sichtbar (in jeder Funktion sichtbar, sofern dort
nicht eine Variable mit demselben Namen deklariert wird,
wodurch die globale Variable überdeckt wird)
Sie existieren während des gesamten Programmablaufes genau
einmal
falls keine andere Definition stattfindet, erhalten sie den
Anfangswert Null
Globale Variablen
Globale Variablen
Diverses
Wdh: Variablen in Funktionen
Globale Variablen
Gegenüberstellung
/* lokal */
void inc(int *c)
{
(*c)++;
}
int main( void )
{
int a=0;
...
inc(&a);
...
}
/* global */
int a;
void inc(void)
{
a++;
}
int main(void)
{
...
inc();
...
}
Globale Variablen
Globale Variablen
Diverses
Wdh: Variablen in Funktionen
Globale Variablen
Gegenüberstellung
/* lokal */
void inc(int *c)
{
(*c)++;
}
int main( void )
{
int a=0;
...
inc(&a);
...
}
/* global */
int a;
void inc(void)
{
a++;
}
int main(void)
{
...
inc();
...
}
Globale Variablen
Globale Variablen
Diverses
Wdh: Variablen in Funktionen
Globale Variablen
Globale Sichtbarkeit - Segen und Fluch
, Globale Variablen vereinfachen Funktionsaufrufe, da sie dort
nicht mit angegeben werden müssen.
/ Andrerseits wird der Datenfluss verdeckt, da man dem
Funktionsaufruf nicht mehr ansieht, dass ein Wert verändert
werden kann.
/ Zudem sind Funktionen, die mit globalen Variablen arbeiten,
weniger flexibel.
Globale Variablen sollten sparsam eingesetzt werden.
Sinnvoll sind sie vor allem für Daten, mit denen das ganze
Programm arbeiten muss.
Globale Variablen
Globale Variablen
Diverses
Wdh: Variablen in Funktionen
Globale Variablen
Statische Variablen
Einen Kompromiss stellen statische Variablen dar. Sie werden
innerhalb einer Funktion mit dem Schlüsselwort static definiert.
Ihre Sichtbarkeit ist wie die von lokalen Variablen, ihre
Lebensdauer und Initialisierung wie die von globalen Variablen.
Eine Funktion, die zurückgibt, wie oft sie aufgerufen wurde:
/* global */
/* statisch */
int counter;
int count( void )
{
static int counter;
return ++counter;
}
int count( void )
{
return ++counter;
}
Globale Variablen
Globale Variablen
Diverses
Wdh: Variablen in Funktionen
Globale Variablen
Statische Variablen
Einen Kompromiss stellen statische Variablen dar. Sie werden
innerhalb einer Funktion mit dem Schlüsselwort static definiert.
Ihre Sichtbarkeit ist wie die von lokalen Variablen, ihre
Lebensdauer und Initialisierung wie die von globalen Variablen.
Eine Funktion, die zurückgibt, wie oft sie aufgerufen wurde:
/* global */
/* statisch */
int counter;
int count( void )
{
static int counter;
return ++counter;
}
int count( void )
{
return ++counter;
}
Globale Variablen
Globale Variablen
Diverses
Wdh: Variablen in Funktionen
Globale Variablen
Statische Variablen
Einen Kompromiss stellen statische Variablen dar. Sie werden
innerhalb einer Funktion mit dem Schlüsselwort static definiert.
Ihre Sichtbarkeit ist wie die von lokalen Variablen, ihre
Lebensdauer und Initialisierung wie die von globalen Variablen.
Eine Funktion, die zurückgibt, wie oft sie aufgerufen wurde:
/* global */
/* statisch */
int counter;
int count( void )
{
static int counter;
return ++counter;
}
int count( void )
{
return ++counter;
}
Globale Variablen
Globale Variablen
Diverses
Makros als Konstanten
Leere Anweisung
Konstanten
Anstatt eine Zahl mehrere Male im Programm stehen zu haben, ist
es sinnvoller, dafür einmal eine Konstante zu definieren.
Eine Möglichkeit dafür sind Makros.
#define SIZE 10
int a[10];
...
for(i=0; i<10; i++)
...
int a[SIZE];
...
for(i=0; i<SIZE; i++)
...
Globale Variablen
Globale Variablen
Diverses
Makros als Konstanten
Leere Anweisung
Konstanten
Anstatt eine Zahl mehrere Male im Programm stehen zu haben, ist
es sinnvoller, dafür einmal eine Konstante zu definieren.
Eine Möglichkeit dafür sind Makros.
#define SIZE 10
int a[10];
...
for(i=0; i<10; i++)
...
int a[SIZE];
...
for(i=0; i<SIZE; i++)
...
Globale Variablen
Globale Variablen
Diverses
Makros als Konstanten
Leere Anweisung
Hinweise zu Makros für Konstanten
Syntax: #define <Name> <Wert>
Konvention: Name in Großbuchstaben
Kein Semikolon am Ende
auch sinnvoll, wenn die Konstante nur einmal im Programm
auftaucht
(Auch EOF und NULL sind als Makros definiert.)
Globale Variablen
Globale Variablen
Diverses
Makros als Konstanten
Leere Anweisung
Leere Anweisung
Gelegentlich braucht man, um den Syntaxregeln von C zu
entsprechen, eine Anweisung, wo man gar nichts machen will.
Dann kann man die leere Anweisung benutzen. Sie besteht einfach
nur aus einem Semikolon. Es wird meist in einer eigenen Zeile
geschrieben.
while (s[len] != ’\0’)
len++;
while (s[len++] != ’\0’)
;
Globale Variablen
Globale Variablen
Diverses
Makros als Konstanten
Leere Anweisung
Leere Anweisung
Gelegentlich braucht man, um den Syntaxregeln von C zu
entsprechen, eine Anweisung, wo man gar nichts machen will.
Dann kann man die leere Anweisung benutzen. Sie besteht einfach
nur aus einem Semikolon. Es wird meist in einer eigenen Zeile
geschrieben.
while (s[len] != ’\0’)
len++;
while (s[len++] != ’\0’)
;
Globale Variablen
Herunterladen