Tag,
1 | typedef struct { |
2 | unsigned state0:1; |
3 | } x; |
4 | x.state0=1; |
wird im Atmel Studio 6 mit:
1 | expected '=', ',', ';', 'asm' or '__attribute__' before '.' token |
quittiert. Warum?
|
|
Forum: Compiler & IDEs Struktur wir nicht kompiliert?Tag,
wird im Atmel Studio 6 mit:
quittiert. Warum? Einer Variablen kannst du etwas zuweisen, einer Typdefinition nicht. Weil du keine Variable x angelegt hast, sondern einen Typ x der eine Struktur ist. Entweder du lässt das typedef weg, oder du machst:
das habe ich alles schon probiert - es will nicht gehen:
ist gleich mit dem beispiel oben... 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: > unamed structs oder anonymous structs gehen erst mit cx11, also > entweder mit -std=c11 kompilieren Code wie
gibts seit Anbeginn von C. 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. Danke, dafür. Ich hab in's Buch geschaut. Und es ging nicht wie beschrieben. Deswegen die Frage hier... Und es geht auch nicht mit:
Zumal mir AtmelStudio beim tippen von 'y.' das Member 'state0' anbietet 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 mh, dacht ich ja auch... Jetzt habe ich mein Projekt gesclossen und ein neues erstellt. Und nur eine Struktur -wie im Buch!- angelegt:
ergiebt:
Wozu gibt es dann solche Bücher? 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:
Wichtig: die vollständige Typbezeichnung lautet "struct meinTyp". Das "struct" kann man nicht weglassen! 2. Möglichkeit:
3. Möglichkeit:
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:
Hier wird nun ein neuer Datentyp angelegt. Erst dieses erlaubt es Dir, das "struct" wegzulassen. 5. Möglichkeit:
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". A. K. schrieb: > oder es ist ein C++ Buch. In C++ geht das nämlich. Reusper! ja, isses.... Aber: Sogar hier aus dem Forum: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Bitfelder ergiebt: 'x' does not name a type 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. mike schrieb: > 'x' does not name a type Du hast meinen Beitrag nicht gelesen, oder?
Es gibt in Deinem Beispiel keinen Datentyp "Wertepaar". Du verwendest "Wertepaar" aber als Datentyp! Bronco schrieb: > Du hast meinen Beitrag nicht gelesen, oder? > >
Und nochmals: das ist C++. In C muss man es so schreiben:
oder, wer sich die Welt mit dem typedef einmal mehr um die Ecke biegen will, damit er das “struct” dann weglassen kann:
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:
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. Das kann doch nicht so schwer sein?! Das ist doch jetzt so für C richtig, oder nicht? Test.c
Compileraufruf: "avr-gcc.exe" -funsigned-char -funsigned-bitfields -O1 -fpack-struct -fshort-enums -g2 -Wall -c -std=gnu99 -MD -MP -MF "Test.d" -MT"Test.d" -MT"Test.o" -mmcu=atmega328p -o"Test.o" ".././Test.c" Ergebnis: Error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token mike schrieb: > Ergebnis: > Error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token wenn soll den code ausgeführt werden der in keiner funktion steht? versuch mal, dass du die zeile: x.wer1=1; ins main verschiebst ...
mh, geht! und wieso das jetzt? 'andere' Variablen lassen sie doch auch ausserhalb von main deklarieren? 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 };
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.
|
|