unamed structs oder anonymous structs gehen erst mit cx11, also
entweder mit -std=c11 kompilieren, oder die obigen Tipps befolgen.
http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html
Ich weiß aber nicht ob der Compiler beim Atmel Studio das schon kann.
Gleichzeitig links und rechts abzubiegen führt mindestens zu
Blechschaden.
Also entweder mit einem Typ arbeiten, oder mit einer Variablen. "x"
ist nun eine Variable und "x y" folglich Käse.
Das Forum ist kein C Einführungskurs für völlig Ahnungslose. Bücher
können das besser.
tare schrieb:> der typedef muss weg
Hat er ja gemacht und das war auch wieder falsch. Weil er beide sich
ausschliessenden Tipps von Stephan gleichzeitig verfolgte.
Allmählich hast du bei "Versuch und Irrtum" alle falschen Varianten
durch, irgendwann muss einfach die richtige folgen. ;-)
Strukturnamen sind genauso wenig Variablen wie Typdefinitionen
Mache Dir den Unterschied klar zwischen
1. Einer Strukturdefinition
2. Einem Datentyp
3. Einer Instanz
Erst eine Instanz ist das, was im RAM (oder ROM) liegt.
1. Möglichkeit:
1
structmeineStruct{...};// 1. Struct definieren
2
structmeineStructeineInstanzMeinerStruct;// 2. Eine Instanz der Struct erstellen
3
eineInstanzMeinerStruct.state0=1;
Wichtig: die vollständige Typbezeichnung lautet "struct meinTyp". Das
"struct" kann man nicht weglassen!
2. Möglichkeit:
1
structmeineStruct{...}eineInstanzMeinerStruct;
2
// Struct definieren und gleichzeitig eine Instanz der Struct erstellen
3
eineInstanzMeinerStruct.state0=1;
3. Möglichkeit:
1
struct{...}eineInstanzMeinerStruct;
2
// Struct definieren und gleichzeitig eine Instanz der Struct erstellen
3
eineInstanzMeinerStruct.state0=1;
Falls man die Definition nicht an anderer Stelle benötigt (z.B. weil man
noch eine Instanz anlegen will, oder weil man den Pointertyp benötigt),
kann man den Namen der Struct (nicht der Instanz!) der Einfachheit
halber weglassen.
4. Möglichkeit:
1
structmeineStruct{...};// 1. Struct definieren
2
typedefstructmeineStructmeinTyp;// 2. einen neuen Datentyp erzeugen
3
meinTypeineInstanzMeinesTypes;// 3. Eine Instanz des Datentyps erstellen
4
eineInstanzMeinesTypes.state0=1;
Hier wird nun ein neuer Datentyp angelegt.
Erst dieses erlaubt es Dir, das "struct" wegzulassen.
5. Möglichkeit:
1
typedefstruct{...}meinTyp;// 1. Struct definieren und gleich einen neuen Datentyp erzeugen
2
meinTypeineInstanzMeinesTypes;// 3. Eine Instanz des Datentyps erstellen
mike schrieb:> Wozu gibt es dann solche Bücher?
Entweder taugt das Buch nur als Unterlage, oder es steht dort etwas
anders drin - oder es ist ein C++ Buch. In C++ geht das nämlich.
Bronco schrieb:> Erst eine Instanz ist das, was im RAM (oder ROM) liegt.
Noch ein Tipp:
In der vor-objektorientierten Zeit sagte man statt "Instanz" auch
"Variable".
mike schrieb:> ich mach Pause, meine Frau will Schuhe kaufen - ich geh mit!
Mein Beileid. ;-)
>> oder es ist ein C++ Buch. In C++ geht das nämlich.> Reusper! ja, isses....
Dann sag das dem Compiler. Sonst meint er, es sei C.
> 'x' does not name a type
Das hast du garantiert nicht genau so gemacht, wie es dort steht.
Bronco schrieb:> Du hast meinen Beitrag nicht gelesen, oder?>>
1
>structWertepaar{
2
>intwert1;
3
>intwert2;
4
>};
5
>Wertepaarpaar1;
6
>
Und nochmals: das ist C++.
In C muss man es so schreiben:
1
structWertepaar{
2
intwert1;
3
intwert2;
4
};
5
6
structWertepaarpaar1;
oder, wer sich die Welt mit dem typedef einmal mehr um die Ecke
biegen will, damit er das “struct” dann weglassen kann:
1
typedefstruct{
2
intwert1;
3
intwert2;
4
}Wertepaar;
5
6
Wertepaarpaar1;
Im ersteren Fall bildet „struct Wertepaar“ den Typnamen, im zweiten
Fall dagegen „Wertepaar“, welches ein typedef für eine (ansonsten
anonyme) Struktur ist.
Wer's unbedingt will:
1
typedefstructWertepaar{
2
intwert1;
3
intwert2;
4
}Wertepaar;
5
6
Wertepaarpaar1;
Damit wird sowohl im struct namespace als auch im regulären
namespace der Name „Wertepaar“ etabliert. Das ist sogar in C++
zulässig, obwohl es ja dort den Namen „Wertepaar“ theoretisch doppelt
definiert.
mike schrieb:> Ergebnis:> Error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token
wenn soll den code ausgeführt werden der in keiner funktion steht?
Dein x.wert1=1; ist aber weder Deklaration noch Initialisierung, sondern
eine Zuweisung. Und die passt nur in eine Funktion. Auch in C++.
Eine Initialisierung wärs mit
struct test x = { 1, 2 };