Jens schrieb:
> So habe ich leider immer noch die fehlermeldung:
Du bist auf etwas herein gefallen.
Nämlich das es in C erlaubt ist einen namenlosen struct zu erzeugen.
Das hier
>
1 | > extern volatile struct U_Bat;
|
2 | >
|
geht so nicht.
Denn das U_Bat steht hier syntaktisch an einer Stelle an der der Name
der struct erwartet wird und nicht der Name einer Variablen.
Hier aber
1 | struct
|
2 | {
|
3 | uint16_t ist;
|
4 | uint16_t soll;
|
5 | uint16_t max;
|
6 | } U_Bat;
|
steht das U_Bat syntaktisch an der Stelle an der der Name eines
Variablen vergeben werden kann, die vom vorangegangenen Datentyp ist.
Das ist also so zu lesen
1 | struct // so sieht die Struktur aus
|
2 | { // das ist die Beschreibung
|
3 | uint16_t ist; // ihres Aufbaus
|
4 | uint16_t soll;
|
5 | uint16_t max;
|
6 | }
|
7 |
|
8 | U_Bat; // und hier wird eine Variable definiert
|
9 | // die genau diese Aufbau hat
|
Aber: Die struct selber, also die Beschreibung des Aufbaus hat bei dir
keinen Namen. Und da sie keinen Namen hat, kannst du dich klarerweise an
anderer Stelle auch nicht darauf beziehen. Es gibt einfach nichts worauf
du dich beziehen könntest.
1 | struct U_Bat_t
|
2 | {
|
3 | uint16_t ist;
|
4 | uint16_t soll;
|
5 | uint16_t max;
|
6 | } U_Bat;
|
Jetzt hat die Strukturbeschreibung selber einen Namen. Und zusätzlich
wird auch gleich noch eine Variable davon definiert. Vorstehends ist
bedeutungsmässig identisch zu
1 | struct U_Bat_t // so soll eine Variable aussehen
|
2 | { // die vom Datentyp struct U_BAt_t ist
|
3 | uint16_t ist;
|
4 | uint16_t soll;
|
5 | uint16_t max;
|
6 | };
|
7 |
|
8 |
|
9 | struct U_Bat_t U_Bat; // und hier ist so eine Varable
|
und dann kann ich mich klarerweise auch von woanders auf diese Variable
mittels extern beziehen, weil ich den Datentyp davon benennen kann:
1 | extern struct U_Bat_t U_Bat;
|
ob du die Variablen selbst dann auch noch volatile machst oder nicht,
ist ein Detail, welches die Variablen betrifft, aber nicht die
Strukturbeschreibung an sich.
1 | struct U_Bat_t // so soll eine Variable aussehen
|
2 | { // die vom Datentyp struct U_BAt_t ist
|
3 | uint16_t ist;
|
4 | uint16_t soll;
|
5 | uint16_t max;
|
6 | };
|
7 |
|
8 |
|
9 | volatile struct U_Bat_t U_Bat; // und hier ist so eine Varable
|
1 | extern volatile struct U_Bat_t U_Bat;
|
Solange dir hier die syntaktischen Feinheiten noch nicht klar sind, rate
ich dir, die Kurzfassung 'Strukturbeschriebung und Variablendefinition
in einem Aufwasch' zu meiden und lieber die explizite Form zu
bevorzugen:
Also nicht so
1 | struct U_Bat_t
|
2 | {
|
3 | uint16_t ist;
|
4 | uint16_t soll;
|
5 | uint16_t max;
|
6 | } U_Bat;
|
sondern so
1 | struct U_Bat_t // so soll eine Variable aussehen
|
2 | { // die vom Datentyp struct U_BAt_t ist
|
3 | uint16_t ist;
|
4 | uint16_t soll;
|
5 | uint16_t max;
|
6 | };
|
7 |
|
8 |
|
9 | struct U_Bat_t U_Bat; // und hier ist so eine Varable
|
Dann hast du hier eine klarere Trennung zwischen der
Sturkturbeschreibung an sich (dem Bauplan) und den Variablen (dem Haus,
welches nach diesem Plan gebaut wird)