Forum: Mikrocontroller und Digitale Elektronik Array mit Structs


von Pascal E. (nimmzwei)


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.

von Peter II (Gast)


Lesenswert?

du musst das Array auch in einem C file anlegen. Es kann ja wohl nicht 
überall extern sein.

von Pascal E. (nimmzwei)


Lesenswert?

Dann wird dieses doch nochmal neu initialisiert?

Alle C-Files sollten auf den gleichen Inhalt Zugriff haben.

von Peter II (Gast)


Lesenswert?

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

nein, es muss ja irgendwo "zu Hause" sein. Das ist bei dir aber nicht 
der Fall weil du überall extern sagt. Es gibt also niemand der Speicher 
dafür anlegt.

von Karl H. (kbuchegg)


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
}

: Bearbeitet durch User
von Karl H. (kbuchegg)


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?

von Pascal E. (nimmzwei)


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:

von Peter II (Gast)


Lesenswert?

Pascal E. schrieb:
> verhindern, jedoch ohne Erfolg.

du musst es einer C Datei ohne extern schreiben (sinnvollerweise heißt 
die meist genauso wie die Headerdatei). Das kann man nicht in einer 
Header Datei machen.

von Pascal E. (nimmzwei)


Lesenswert?

Besten Dank Karl Heinz,

deine Erklärung muss ich mir jetzt erstmals verinnerlichen.

Versuche da weiter zu kommen.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von kopfkratzer (Gast)


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

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.