Array mit Structs

OP #3412629
Lesenswert?

Hallo zusammen,

in meinem Header-File, dass überall includiert ist, möchte ich folgenden 
Aufruf machen.
1
typedef struct
2
{
3
  unsigned char test123;
4
} Test;
5

6
//danach initialisierung 
7

8
extern StructArr[10];

Leider kann ich so nicht aus den C-Files drauf zugreifen. Gibt es 
hierfür eine geeignete Lösung?
1
StructArr[0].test123 = 100;
der Compiler meldet: unresolved symbols: 1

Besten Dank im Voraus.
#3412641
Lesenswert?

'extern' teilt dem Compiler zur gefälligen Kenntnisnahme mit:

Es gibt eine Variable dieses Namens. Kümmere dich nicht darum wo genau, 
geh einfach davon aus, dass es sie irgendwo gibt und dass sie von diesem 
und jenem Datentyp ist.

Tja, aber wie Peter II schon sagte: Irgendwo muss es dieses Array dann 
aber auch tatsächlich geben.

Header, zb myKomponent.h
1
typedef struct
2
{
3
  unsigned char test123;
4
} Test;
5

6
extern Test StructArr[10];    // irgendwo existiert das

C-File, zb myKomponent.c
1
#include "myKomponent.h"
2

3
Test StructArr[10];           // <---- naemlich hier. Hier existiert das Array


anderes C-File
1
#include "myKomponent.h"   // im Header steht: gibts irgendwo
2

3
int foo()
4
{
5
  StructArr[0].test123 = 100;  // daher ist das kein Tippfehler. So ein
6
                               // Array gibts wirklich irgendwo im System
7
}
#3412642
Lesenswert?

Pascal E. schrieb:
> Dann wird dieses doch nochmal neu initialisiert?

PS:
Deine Vorstellung davon, was eine Initialisierung ist, ist fehlerhaft.

Eine Initialisierung ist jene Stelle, an der eine Variable ihren ersten 
definierten Wert bekommt.
Mit Lebensdauer, oder Existenz hat das überhaupt nichts zu tun. Bei 
Initialisierung geht es um die Fragestellung: was steht denn in der 
Variablen drinnen, wenn sie zur Welt kommt?
OP #3412649
Lesenswert?

Ok, verstanden.

Wenn ich es ja nun nicht mehr Extern definiere, dann initialisiert der 
Compiler ja jedes mal, wenn das .h File gelinkt ist eine neue Instanz 
(er Probiert es zumindest).

Wollte dies mit
1
#ifndef StructArr
2
Test StructArr[10];
3
#endif

verhindern, jedoch ohne Erfolg.
1
StructArr multiply defined in:
#3412657
Lesenswert?

Pascal E. schrieb:
> Ok, verstanden.
>
> Wenn ich es ja nun nicht mehr Extern definiere, dann initialisiert der
> Compiler ja jedes mal, wenn das .h File gelinkt ist eine neue Instanz
> (er Probiert es zumindest).
>
> Wollte dies mit
>
>
1
> #ifndef StructArr
2
> Test StructArr[10];
3
> #endif
4
>
>
> verhindern, jedoch ohne Erfolg.
>
>
1
> StructArr multiply defined in:
2
>


Warum hältst du dich nicht einfach an das Schema, dass ich dir gezeigt 
habe?

Im Header File steht es mit extern, und im zum Header gehörenden C-File 
steht es ohne.

Ja!!!! das kommt 2 mal vor.
Ist aber kein Problem. Deswegen includiert ja das C-File sein eigenes 
Header File, damit der COmpiler prüfen kann, ob das auch alles 
zusammenstimmt.
#3412663
Lesenswert?

Pascal E. schrieb:
> Besten Dank Karl Heinz,
>
> deine Erklärung muss ich mir jetzt erstmals verinnerlichen.

Die Erklärung ist eigentlich recht banal.

Du kannst in der Programmierung nicht wie eine Horde Politiker agieren, 
die einfach nur Behauptungen rausblasen. Irgenwann muss man auch mal 
Nägel mit Köpfen machen.

Das 'extern' ist die Behauptung: 'Irgendwo gibt es ....'

Aber das ist zu wenig. Wenn etwas behauptet wird, dann muss es auch dann 
tatsächlich irgendwo sein! Es muss also 1 Stelle, UND NUR EINE STELLE, 
geben an der die Variable dann ohne 'extern' auftaucht. Denn dort wird 
dann tatsächlich der Speicher für die Variable reserviert.
Gast #3412883
Lesenswert?

Karl Heinz schrieb:
> Du kannst in der Programmierung nicht wie eine Horde Politiker agieren,
> die einfach nur Behauptungen rausblasen. Irgenwann muss man auch mal
> Nägel mit Köpfen machen.
>
PRUUUUST
So Karl Heinz nun schuldest Du mir einen Monitorreiniger samt 
Tastaturabputzer :-P
Fußbodenwisch
Neuetassebrauch
Bauchhalt
Und dann mach ich mir mal eine Dose Fisch auf :-D

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren