Globale Variablen/ array

Gast #4267733
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
Gast #4267739
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.
Gast #4267749
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.
Gast #4267806
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};
Gast #4267853
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?
Gast #4267880
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.
#4267900
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.
Gast #4267934
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.
Moderator #4267954
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.