Struktur wir nicht kompiliert?

#3132712
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.
Gast #3132722
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
Gast #3132755
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?
Gast #3132768
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;
Moderator Persönliche Seite #3132834
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.
Gast #3132966
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren