Forum: Compiler & IDEs Struktur wir nicht kompiliert?


von mike (Gast)


Lesenswert?

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?

von Josef D. (jogedua)


Lesenswert?

Wenn du das typedef weg lässt, sollte es gehen.

von (prx) A. K. (prx)


Lesenswert?

Einer Variablen kannst du etwas zuweisen, einer Typdefinition nicht.

von Stephan V. (orca)


Lesenswert?

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:
1
typedef struct {...} x_t;
2
x_t x;  // Variable: x vom Typ: x_t
3
x.state0 = 1;

von mike (Gast)


Lesenswert?

das habe ich alles schon probiert - es will nicht gehen:
1
struct {
2
  unsigned state0:1;
3
} x;
4
x y;
5
y.state0=1;

ist gleich mit dem beispiel oben...

von tare (Gast)


Lesenswert?

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.
1
typedef struct x{
2
  unsigned state0:1;
3
};
4
x y;
5
y.state0=1;

von (prx) A. K. (prx)


Lesenswert?

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.

von tare (Gast)


Lesenswert?


von (prx) A. K. (prx)


Lesenswert?

tare schrieb:
> unamed structs oder anonymous structs gehen erst mit cx11, also
> entweder mit -std=c11 kompilieren

Code wie
1
struct {
2
  unsigned z;
3
} x;
gibts seit Anbeginn von C.

von (prx) A. K. (prx)


Lesenswert?

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.

von mike (Gast)


Lesenswert?

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:
1
typedef struct y {
2
  unsigned state0:1;
3
};
4
y.state0=1;

Zumal mir AtmelStudio beim tippen von 'y.' das Member 'state0' anbietet

von (prx) A. K. (prx)


Lesenswert?

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

von mike (Gast)


Lesenswert?

mh, dacht ich ja auch...

Jetzt habe ich mein Projekt gesclossen und ein neues erstellt.
Und nur eine Struktur -wie im Buch!- angelegt:
1
#include <avr/io.h>
2
struct Wertepaar{
3
  int wert1;
4
  int wert2;
5
};
6
Wertepaar paar1;
7
paar1.wert1=1;
ergiebt:
1
paar1 does not name a type

Wozu gibt es dann solche Bücher?

von Bronco (Gast)


Lesenswert?

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
struct meineStruct {...}; // 1. Struct definieren
2
struct meineStruct eineInstanzMeinerStruct; // 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
struct meineStruct {...} 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
struct meineStruct {...}; // 1. Struct definieren
2
typedef struct meineStruct meinTyp; // 2. einen neuen Datentyp erzeugen
3
meinTyp eineInstanzMeinesTypes; // 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
typedef struct {...} meinTyp; // 1. Struct definieren und gleich einen neuen Datentyp erzeugen
2
meinTyp eineInstanzMeinesTypes; // 3. Eine Instanz des Datentyps erstellen
3
eineInstanzMeinesTypes.state0=1;

von (prx) A. K. (prx)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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".

von mike (Gast)


Lesenswert?

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

von mike (Gast)


Lesenswert?

ich mach Pause, meine Frau will Schuhe kaufen - ich geh mit!

von (prx) A. K. (prx)


Lesenswert?

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.

von Bronco (Gast)


Lesenswert?

mike schrieb:
> 'x' does not name a type

Du hast meinen Beitrag nicht gelesen, oder?
1
struct Wertepaar{
2
  int wert1;
3
  int wert2;
4
};
5
Wertepaar paar1;

Es gibt in Deinem Beispiel keinen Datentyp "Wertepaar".
Du verwendest "Wertepaar" aber als Datentyp!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bronco schrieb:

> Du hast meinen Beitrag nicht gelesen, oder?
>
>
1
> struct Wertepaar{
2
>   int wert1;
3
>   int wert2;
4
> };
5
> Wertepaar paar1;
6
>

Und nochmals: das ist C++.

In C muss man es so schreiben:
1
struct Wertepaar {
2
  int wert1;
3
  int wert2;
4
};
5
6
struct Wertepaar paar1;

oder, wer sich die Welt mit dem typedef einmal mehr um die Ecke
biegen will, damit er das “struct” dann weglassen kann:
1
typedef struct {
2
  int wert1;
3
  int wert2;
4
} Wertepaar;
5
6
Wertepaar paar1;

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
typedef struct Wertepaar {
2
  int wert1;
3
  int wert2;
4
} Wertepaar;
5
6
Wertepaar paar1;

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.

von mike (Gast)


Lesenswert?

Das kann doch nicht so schwer sein?!
Das ist doch jetzt so für C richtig, oder nicht?

Test.c
1
#include <avr/io.h>
2
struct test{
3
  int wert1;
4
  int wert2;
5
};
6
struct test x;
7
x.wert1=1;
8
9
int main(void){
10
}

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

von Peter II (Gast)


Lesenswert?

mike schrieb:
> Ergebnis:
> Error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token

wenn soll den code ausgeführt werden der in keiner funktion steht?

von Peter P. (Gast)


Lesenswert?

versuch mal, dass du die zeile:

x.wer1=1;

ins main verschiebst ...

von Decius (Gast)


Lesenswert?

1
#include <avr/io.h>
2
3
struct test{
4
  int wert1;
5
  int wert2;
6
};
7
struct test x;
8
9
int main(void)
10
{
11
    x.wert1=1;
12
}

von mike (Gast)


Lesenswert?

mh, geht!

und wieso das jetzt? 'andere' Variablen lassen sie doch auch ausserhalb 
von main deklarieren?

von (prx) A. K. (prx)


Lesenswert?

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 };

von mike (Gast)


Lesenswert?

Verstanden!
Dank Euch allen...!

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.