Forum: Mikrocontroller und Digitale Elektronik Globale Variablen/ array


von Mark (Gast)


Lesenswert?

Hi,
Da ich verschiedene Dateien habe und Funktionen habe, die die selbe 
variable benötigen, habe ich sie global deklariert. Dies funktioniert 
auch bis auf den array.
global.h
1
EXTERN unsigned int State_array[4];
2
EXTERN unsigned int State_array_Counter;

hauptcode
1
void init_variables(void){
2
  State_array[4] = {0x02, 0x03, 0x06, 0x07};
3
  State_array_Counter = 0;
4
}

Jedoch unterstreicht er mir bei dem State_array das gleichzeichen und 
die geschweifte Klammer zu mit der Fehlermeldung
unexpected Tocen: =
bzw.
unexpected Tocen: }

bei dem State_array_Counter gibt es keinen Fehler. Muss ich bei einem 
array noch etwas besonderes berücksichtigen?

Mark

von Ulrich F. (Gast)


Lesenswert?

1
unsigned int State_array[4] = {0x02, 0x03, 0x06, 0x07};
2
unsigned int State_array_Counter = 0;
3
4
void init_variables(void){
5
}

Mark schrieb:
> Jedoch unterstreicht er mir bei dem State_array das gleichzeichen und
> die geschweifte Klammer
Wenn du versuchst 4 Werte gleichzeitig in die 5te Arrayzelle zu 
schreiben,  und das bei einem Array, welches nur 4 Zellen hat....
Naja, als Compiler wäre ich da auch stinkig.

von Noch einer (Gast)


Lesenswert?

Diese Schreibweise mit dem {} klappt nur, wenn er Compiler das Array 
initialisiert (wie in Ulrichs Beispiel). Nicht wenn dein Programm die 
Werte zuweist.

In deiner Funktion musst du das anders machen. Z.B die 4 int einzeln 
zuweisen.

von Mark (Gast)


Lesenswert?

slap in my facd :(

ah ja, da hast du recht, das würde mich auch ankotzen.
Das war auch der Fehler.

Dadurch, dass diese Variable immer gleich bleibt habe ich sie direkt in 
globa.h beschrieben mit
static unsigned int State_array[4] = {0x02, 0x03, 0x06, 0x07};

von Ulrich F. (Gast)


Lesenswert?

Mark schrieb:
> static

Huch...
Eben noch extern und global, jetzt static?

von Mark (Gast)


Lesenswert?

ja, dadurch, dass diese global ist und immer gleich bleibt, habe ich 
diese in global.h geschrieben. da ich in mehreren dateien global.h 
aufrufe, wird diese so nur einmal beschrieben. ansonsten habe ich immer 
die Fehlermeldung 'multiple declaration of state_array' bekommen.

für mich bedeutet static, dass diese nur einmal deklariert wird. Ist 
dies nicht so?

von Ulrich F. (Gast)


Lesenswert?

Erstmal:
Einfach irgendwas auszuprobieren, nur damit Fehlermeldungen 
verschwinden, ist selten eine gute Idee!


So wie ich das static da verstehe:

Mark schrieb:
> da ich in mehreren dateien global.h
> aufrufe
Wird diese Variable in jedem dieser Gültigkeitsbereiche erstellt.
Du hast also nicht eine einzige globalen sondern etliche.
Für jede C/C++ Datei eine.

von ??? (Gast)


Lesenswert?

Setz deine .h Files immer in #ifdef clauses:

#ifndef MY_H_FILE
#define MY_H_FILE

....
....
....


#endif

Dann bekommst du keine mehrfache Inkludierung

von Rolf M. (rmagnus)


Lesenswert?

Mark schrieb:
> für mich bedeutet static, dass diese nur einmal deklariert wird. Ist
> dies nicht so?

Nein. Es bedeutet, daß es nur in dem C-File, in dem es definiert ist 
(bzw. in dem der Header inkludiert ist), sichtbar ist. Wenn du den 
Header in 10 C-Files einbindest, bekommst du auch 10 Instanzen der 
Variable, die aber jeweils nur im dazugehörigen File sichtbar sind. 
Deshalb verschwindet die Fehlermeldung.
Generell haben Variablendefinitionen in Headerfiles nichts verloren. 
Dort werden sie nur extern deklariert.

von Ulrich F. (Gast)


Lesenswert?

??? schrieb:
> Dann bekommst du keine mehrfache Inkludierung

Das ist so nicht richtig!
Das #ifndef verhindert, dass diese Datei mehrfach in EINEN 
Gültigkeitsbereich eingebunden wird.

jede c/c++ hat ihren eigenen Gültigketeits- Scihtbarkeitsbereich.
jede dieser Dateien wird einzeln kompliert.
Jedes mal die *.h mit kompiliert.



??? schrieb:
> Setz deine .h Files immer in #ifdef clauses:
Das ist allerdings wirklich eine gute Empfehlung.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Was du wahrscheinlich möchtest, ist das:

global.h:
1
#ifndef GLOBAL_H
2
#define GLOBAL_H
3
4
extern unsigned int State_array[4]; // Deklaration des Arrays
5
6
#endif

hauptcode.c:
1
#include <global.h>
2
3
unsigned int State_array[4] = { // Definition und Initialisierung des Arrays
4
  0x02, 0x03, 0x06, 0x07
5
};

Merke: Ins Header-File kommen üblicherweise nur Deklarationen, also
nichts, was Speicher belegt. Globale Variablen mit "extern" sind reine
Deklarationen, welche im Header-File verwendet werden können. GLobale
Variablen ohne "extern" hingegen sind Definitionen, sagen also dem
Compiler, dass der für diese Variable Speicher reservieren soll. So eine
Variablendefinition sollten in genau einem .c-File auftauchen.

Damit belegt State_array nur einmal Speicher, es kann aber von jedem
Programmmodul darauf zugegriffen werden, das global.h includet.

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.