globale Variablen in C

Gast #4289708
Hallo,

einfaches Beispiel:
1
under.c
2
unsigned char hilf = 0;
3

4

5
void func1()
6
{
7
   hilf = 1;
8
}
9

10
under.h
11
extern unsigned char hilf;
12
void func1();
13

14

15
int main() {
16

17
// ...
18
hilf = 1 // dies funktioniert natürlich
19
func1(); // setzt hilf eben nicht gleich 1
20
}

Warum funktioniert func1() in diesem Fall nicht? Ich habe 8 Bit Variable 
hilf doch als globale Variable definiert.

Wie macht man es richtig?
Gast
C easy schrieb:
> unsigned char hilf = 0;

Ich hasse sowas. Wer sowas schreibt, verläßt sich ganz und gar auf den 
Startupcode.

Besser ist es, so zu schreiben:
under.h
extern unsigned char hilf;
extern void func1();

under.c

unsigned char hilf;

void main (xyz...)
{ ..
  hilf = 0;

und dann weiter mit dem, was du tun willst.

Merke: es ist IMMER ratsam, Variablen, die man zu benutzen gedenkt, auch 
selbst (mittels einer dedizierten Zuweisung) zu initialisieren - es sei 
denn, daß man es ausdrücklich darauf ablegt, aus dem im Blickfeld dieser 
Quelle uninitialisierten Inhalt der Variablen eine Erkenntnis zu ziehen, 
dei auf Dinge außerhalb der Quelle hinweisen. Beispiel: 
Boolean-Variable in einem Low-Power RTC-Teil des µC, die einem anzeigt, 
ob es zuvor eine Unterschreitung der zulässigen Batteriespannung gegeben 
hat.

W.S.
Gast
W.S. schrieb:
> Ich hasse sowas. Wer sowas schreibt, verläßt sich ganz und gar auf den
> Startupcode.

das ist doch Unsinn. C ist definiert Und das gehört die Initialisierung 
von Globalen Variablen dazu.

Warum sollte man extra Speicher für die Zuweisung Verwenden?
W.S. schrieb:

> Ich hasse sowas. Wer sowas schreibt, verläßt sich ganz und gar auf den
> Startupcode.

Das ist der Normalfall.
Wenn man einen Compiler benutzt, bei dem man diese 
Default-Initialisierung abschalten kann, dann sollte man das 
dokumentieren (und selbst die Zuweisungen durchführen). Aber das ist 
dann die Ausnahme. Den Normalfall muss man nicht dokumentieren oder 
dafür Vorsorge treffen.
W.S. schrieb:
> Ich hasse sowas. Wer sowas schreibt, verläßt sich ganz und gar auf den
> Startupcode.

Da dessen Verhalten in dieser Frage völlig klar und eindeutig durch den 
C Standard vorgegeben ist spricht nichts gegen eine Initialisierung im 
Rahmen der Definition globaler oder statischer Variablen.

Eine explizite Initialisierung globaler oder statischer Daten mit 0 kann 
man sich aus dem gleichen Grund sparen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.