Forum: Mikrocontroller und Digitale Elektronik globale Variablen in C


von C easy (Gast)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

C easy schrieb:
> Warum funktioniert func1() in diesem Fall nicht? Ich habe 8 Bit Variable
> hilf doch als globale Variable definiert.
>
> Wie macht man es richtig?

sollte so funktionieren.

von ... (Gast)


Lesenswert?

Setz mal volatile vor "unsigned char hilf = 0;"

von Ulrich F. (Gast)


Lesenswert?

3 Dateien....?
Ich kann sie nicht unterscheiden.


Und: Natürlich funktioniert das!

von Peter II (Gast)


Lesenswert?

... schrieb:
> Setz mal volatile vor "unsigned char hilf = 0;"

da hier keine rede von Interrupts ist, macht das wenig sinn. Außer das 
man damit dem Optimierer das leben schwer macht.

von C easy (Gast)


Lesenswert?

Danke sehr, Fehler war woanders, aber mindestens genauso unnötig :)

von EinGast (Gast)


Lesenswert?

Nett. Dann beschreib doch fuer diejenigen, die in naher/ferner Zukunft 
beim googlen auf diesen Thread stossen, wo der Fehler liegt. :-)

von Carl D. (jcw2)


Lesenswert?

Falls main() tatsächlich in under.h steht, dann gibt es mindestens noch 
einen weiteren Fehler, der aber im Moment noch auf seinen großen 
Auftritt wartet.

von W.S. (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

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

Wenn der Startup-Code diese Initilalisierung nicht macht, ist er Murks 
und gehört repariert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.