Forum: Mikrocontroller und Digitale Elektronik struct error - error: expected identifier or '(' before '.' token


von Mara (Gast)


Lesenswert?

hallo,
ich habe einen struct in einer header geschrieben
1
typedef struct
2
{
3
  unsigned int Max_Voltage;
4
  unsigned int Max_Current;
5
6
  unsigned int Set_Voltage;
7
  unsigned int Set_Current;
8
} CONFIG;

die header habe ich im sricpt hinzugefügt und möchte nun den struct 
beschreiben.
1
CONFIG.Max_Voltage = 240;

dann bekomme ich aber nur einen error mit der meldung
error: expected identifier or '(' before '.' token

aber eigentlich beschreibe ich doch so werte in einem struct oder nicht?

Mara

von Felix A. (madifaxle)


Lesenswert?

Ja, schon. Aber ohne den Rest vom Code kann man den Fehler nicht finden.

von Cyblord -. (cyblord)


Lesenswert?

Du musst eine Variable vom Typ des Struct erstellen und DARAUF dann 
zugreifen. Nicht auf die Struct-Definitions selbst.
1
CONFIG cfg;
2
3
cfg.Max_Voltage = 240;

von Klaus (Gast)


Lesenswert?

Das Problem, wäre ein wenig offensichtlicher, wenn Du Dich korrekt 
ausdrücken würdest.

Zunächst hast Du mit dem Code nicht, wie Du schreibst, "ich habe einen 
struct in einer header geschrieben"

Das fängt damit an, das es so etwas wie "eine header" nicht gibt. Du 
meinst eine Header-Datei.

Dann ist es sinnlos eine "struct in eine Datei zu schreiben". Vielmehr 
willst Du, was hier nicht eigentlich zutreffen würde, eine 
Strukturdeklaration in eine Header-Datei schreiben. Eine Struktur wäre 
das Bitmuster im Speicher, dass die Daten enthält, die in der 
Strukturdeklaration genannt sind.

Dann aber deklarierst Du nicht lediglich eine Struktur, sondern eine 
"anonyme Struktur". Eine Sonderform der Struktur was dann sinnvoll ist, 
wenn Du, wie hier, einen neuen Typ deklarierst.

Im Ergebnis hast Du einen Typ namens "CONFIG" deklariert, dessen Name 
eine anonymen Struktur identifiziert.

Schauen wir uns also mal die Fehlermeldung an:

Das steht sinngemäß, dass vor dem Punkt (unter anderem) ein 
Identifizierer erwartet wird. Und zwar, dass ist nicht aus der 
Fehlermeldung allein erkennbar, sondern nur nach Studium eines C-Buches, 
der Identifizierer einer 'Variablen'. Das sollte aber klar sein, denn 
ein L-Wert kann nur eine Variable sein. Du schreibst aber einen Typ hin. 
Ein Typ hat aber keine Struktur, er beschreibt nur eine bzw. ist die 
Abkürzung für eine solche Beschreibung.

Was Dir fehlt ist eine "Variable" mit dem gewünschten Typ. Also etwas 
so:
1
CONFIG ConfigVariable;

und der, bzw. einer ihrer Elemente im Falle einer Struktur kannst Du 
dann auch etwas zuweisen:
1
ConfigVariable.Max_Voltage = 240;


Was ich mit dem Sermon sagen will: Es ist nützlich wenn man gedanklich 
die korrekten Begriffe verwendet, weil man dann auch das Problem eher - 
meist schon beim hinschreiben der Frage - erkennt.
Das wird so oft unterschätzt.

von Cyblord -. (cyblord)


Lesenswert?

Klaus schrieb:
> Das Problem, wäre ein wenig offensichtlicher, wenn Du Dich korrekt
> ausdrücken würdest.

Und wenn du weniger arrogant daher labern würdest und auch mal die 
anderen Beiträge lesen würdest, könntest du doppelte Antworten 
vermeiden.

Der Fehler ist klar und offensichtlich. Das hier C-Verständnis fehlt 
auch. Schön. Aber dein überhebliches Gesülze ist mehr als peinlich.

von Mara (Gast)


Lesenswert?

hallo,
habe noch einmal vier versucht zu lernen und ausprobiert. leider ohne 
erfolg
1
typedef struct
2
{
3
  unsigned int Max_Voltage;
4
  unsigned int Max_Current;
5
6
  unsigned int Set_Voltage;
7
  unsigned int Set_Current;
8
} header_CONFIG;
9
extern header_CONFIG CONFIG;

die header-file includiere ich in meinem haupt-code.
im Code schreibe ich dann
1
 
2
CONFIG.Max_Voltage = 240;



doch dann bekomme den fehler

build/default/production/main.o(.text+0xc): In function `.LSM4':
: undefined reference to `_CONFIG'

was kann denn jetzt noch verkehrt sein?

von Ralf G. (ralg)


Lesenswert?

Mara schrieb:
> extern header_CONFIG CONFIG;

und wo außerhalb??

von Mara (Gast)


Lesenswert?

ja, das habe ich in der header-file geschrieben, wo ich den struct auch 
definiert habe.

von icke (Gast)


Lesenswert?

Naja, extern heißt, dass der Linker irgendwoanders die Referenz sucht. 
Da Du die wahrscheinlich nirgends defniniert hast, findet der auch 
nichts.

Mach das extern weg und gut ist...

von Mara (Gast)


Lesenswert?

ja, das war es.
habe jetzt im hauptprogramm noch hinzugefügt
1
header_CONFIG CONFIG;

jetzt läuft es (ob richtig werde ich noch sehen (zumindestens kann er es 
kompilieren))

Aber ich dachte, dadurch, dass ich die header-file includiert habe, 
hätte der compiler das gewusst.

von Karl H. (kbuchegg)


Lesenswert?

Mara schrieb:
> ja, das war es.
> habe jetzt im hauptprogramm noch hinzugefügt
>
1
> header_CONFIG CONFIG;
2
>
>
> jetzt läuft es (ob richtig werde ich noch sehen (zumindestens kann er es
> kompilieren))
>
> Aber ich dachte, dadurch, dass ich die header-file includiert habe,
> hätte der compiler das gewusst.


Du    B R A U C H S T    ein C-Buch!
Du kannst es drehen und wenden wie du willst. Das hat doch keinen Sinn. 
Noch nie hat auf diesem Planeten irgendwer sich C durch erfragen von 
Achtelwissen in diversen Foren gut genug beigebracht, so dass er auch in 
der freien Wildbahn damit bestehen kann.
Das ist doch sinnlos, wenn du 2/3 der C-Schlüsselwörter (bzw. ihre 
Bedeutung) gar nicht kennst (wie hier zb. was eigentlich 'extern' macht)

von Klaus (Gast)


Lesenswert?

Karl Heinz schrieb:

> Noch nie hat auf diesem Planeten irgendwer sich C durch
> erfragen von Achtelwissen in diversen Foren gut genug
> beigebracht, so dass er auch in der freien Wildbahn
> damit bestehen kann.

Das geht durchaus. Man muss halt Achtmal fragen. :-)
1
#include <schlumpf.h>
2
3
4
// schlumpf: schlumpft schlumpfiges mit schlumpf ohne schlumpf
5
// Parameter: schlumpf * schlumpf schlumpfig
6
//            schlumpf[schlumpf] schlumpfigstes
7
8
schlumpf schlumpf (schlumpf * schlumpf, schlumpf schlumpf[schlumpf]) {
9
   schlumpf schlumpf = schlumpf;
10
11
   for (schlumpf = schlumpf; schlumpf < schlumpf; schlumpf++) {
12
     schlumpf[schlumpf] = schlumpf != schlumpf ? schlumpf : schlumpf;
13
     if (schlumpf)
14
       schlumpf (& schlumpf, schlumpf << 2);
15
   }
16
   return schlumpf;
17
}

von Dirk B. (dirkb2)


Lesenswert?

Mara schrieb:
> hallo,
> ich habe einen struct in einer header geschrieben
> typedef struct
> {
>   unsigned int Max_Voltage;
>   unsigned int Max_Current;
>
>   unsigned int Set_Voltage;
>   unsigned int Set_Current;
> } CONFIG;

Damit gibst du dem Compiler bekannt, wie die struct aussehen soll.
Du hast damit aber noch keine Variable angelegt!

> CONFIG.Max_Voltage = 240;

Damit möchtest du einen Member der struct-Variable CONFIG beschreiben.
Die hast du aber gar nicht definiert.

von r_u_d_i (Gast)


Lesenswert?

Cyblord -. schrieb:
> Klaus schrieb:
>
> Und wenn du weniger arrogant daher labern würdest ..
>
> .. Aber dein überhebliches Gesülze ist mehr als peinlich.

Wenn du dich in deiner Ausdrucksweise mehr zurück halten würdest
und dich auf menschlicher Beziehung hin etwas mehr respektvoller
zeigen würdest, wärest du vieleicht in mancher Hinsicht auch ein
ernstzunehmender Rivale - so bist du in der Vergangenheit als auch
in der Zukunft für mich der absolute Hirsch auf dem Platz, das beweist 
auch
wiedermal die Gegenwart.

Lieber einen 'arroganten' Klaus als einen langweiler wie dich Cyblord,
der das Maul über die Grenzen zieht -
Von dir hab ich noch nichts lernen können - im Gegensatz aber von dem 
'arroganten' Klaus.

rudi

von Lutz (Gast)


Lesenswert?

Cyblord -. schrieb:
> Klaus schrieb:
>> Das Problem, wäre ein wenig offensichtlicher, wenn Du Dich korrekt
>> ausdrücken würdest.
>
> Und wenn du weniger arrogant daher labern würdest und auch mal die
> anderen Beiträge lesen würdest, könntest du doppelte Antworten
> vermeiden.

Klaus schrieb:
> Was ich mit dem Sermon sagen will: Es ist nützlich wenn man gedanklich
> die korrekten Begriffe verwendet, weil man dann auch das Problem eher -
> meist schon beim hinschreiben der Frage - erkennt.
> Das wird so oft unterschätzt.

Da gebe ich Klaus Recht: Bei eindeutiger Beschreibung eines Problems (so 
daß es auch garantiert jeder andere versteht) kommt einem oft selbst die 
Lösung!

von Stefan R. (srand)


Lesenswert?

Dirk B. schrieb:
> Die hast du aber gar nicht definiert.

Guten Morgen!

Aber schön, daß sich Tage später auch nochmal ein Dritter wichtig machen 
kann.

von r_u_d_i (Gast)


Lesenswert?

Stefan R. schrieb:
> Aber schön, daß sich Tage später auch nochmal ein Dritter wichtig machen
> kann.

Ich möchte mich jetzt auch noch 'wichtig' machen und versuche das in 
einem Beispiel, das mir mal geholfen hat struct, definition und Speicher 
besser zu verstehen:

'Deklaration'

Hier wird nur ein Structure Typ mit 5 Elementen erstellt
1
struct Id3_tag {
2
  char title[30];
3
  char kuenstler[30];
4
  char album[30];
5
  short jahr;
6
  char kommentar[30];
7
  char genere[30];
8
};

Damit wird aber nur 'Deklariert', nicht aber Speicherplatz reserviert.
Speicherplatz wird erst dann reserviert, wenn eine Variable, also ein 
Bezeichner von diesem Structurtyp definiert wird

Sprich: 'Definition'

Und zwar eine Definition sieht dann so aus:
1
/* Definition einer Strukturvariable */
2
struct Id3_tag data1;

Dabei wird jetzt Speicherplatz für den Typ struct Id3_tag und seine 
einzelnen Elemente reserviert.


Deklaration + Definition zusammen in einem Abwasch:
1
struct Id3_tag {
2
  char title[30];
3
  char kuenstler[30];
4
  char album[30];
5
  short jahr;
6
  char kommentar[30];
7
  char genere[30];
8
} data ;

Hier wurde dann eine Struktur Id3_tag deklariert und eine 
Strukturvariable namens data definiert.

Wenn man das so zusammenfasst, dann kann auch der Name der Strukture 
wegfallen wie :
1
struct {
2
  char title[30];
3
  char kuenstler[30];
4
  char album[30];
5
  short jahr;
6
  char kommentar[30];
7
  char genere[30];
8
} data ;


Der TO verwendet 'typedef' also eine typendefinition,
da kann dann bei der Verwendung des Strukturtypes das Schlüsselwort 
struct wegfallen:
1
typedef struct Id3_t data1;

wegen 'typedef' kann dann eine Struktur mit einer Strukturvariablen 
definiert werden ( Speicherplatz wird eingerichtet, auf die Variable 
kann jetzt zugegriffen werden )
1
Id3_t data1;  // normalerweise: struct Id3_tag data1;


Damit die Wichtigmacherei einen Abschluss gibt:

Solches Synonym kann man bei der Deklaration einer Struktur so 
erstellen:
1
typedef struct Id3_tag{
2
  char title[30];
3
  char kuenstler[30];
4
  char album[30];
5
  short jahr;
6
  char kommentar[30];
7
  char genere[30];
8
} Id3_t ;

Und anstatt 'struct Id3_tag' wird nur noch der Strukturtyp 'Id3_t' 
verwendet.


Jetzt kommt der Zugriff auf die Deklarierte Variable! nicht auf die 
Definition wie im Eingangspost


/* die Definition im header */
1
typedef struct Id3_tag{
2
  char title[30];
3
  char kuenstler[30];
4
  char album[30];
5
  short jahr;
6
  char kommentar[30];
7
  char genere[30];
8
} Id3_t ;

/* Verwenden im Programm */
1
/* die Structure wurde nur definiert*/
2
/* jetzt wird eine Variable davon deklariert */
3
4
Id3_t data;
5
6
/* und jetzt kann man mit der Variablen arbeiten */
7
8
strncpy(data.titel, "Hurra die Schule brennt", 29);
9
strncpy(data.kuenstler, "Tom & Jerry", 29 );
10
..
11
12
/* ein Beispiel für direkte Zuweisung*/
13
data.jahr=2009;
14
..

@Mara
Du hast schon den richtigen Ansatz, aber das Prinzip noch nicht 
verstanden.
Wenn Du auf deinen Type das Element zuweisen willst
1
CONFIG.Max_Voltage = 240;

musst du erst einmal von deinem Type eine Variable erstellen,
dein Type heist CONFIG, davon musst du dann eine Variable erstellen:
1
CONFIG myCFG;  // jetzt existiert Speicherplatz für Werte und eine Variable
2
3
..
4
5
/* jetzt kannst du damit arbeiten */
6
7
mycfg.MAX_Voltage = 240;


Ich empfehle dir in jedem Fall ein c buch.
Hier mein Tip:
Grundkurs C
von Jürgen Wolf
Verlag Galileo Computing
ISBN 978-3-8362-1546-6
EUR 9.90

Dort findest du sehr verständlich solche Beispiele

lg
rudi ;-)

@cybloard
µC.net ist und bleibt eines der weiterführenden Foren überhaupt.
Mir hat das all die Jahre enormes Basis Wissen für mein Hobby 
eingebracht.
Gesten wie deine über denen Leuten, die µC.net prägen und immer 
hilfsbereit sind, das ist peinlich, wie du darauf reagierst und 
charakter zeigst; auf Lebenszeit mit Sicherheit Bewerbungsabsage von 
'uns', sollte jemals eine Bewerbung von dir ins Mutterhaus flattern.

Dich schick ich höchst persönlich erst einmal zu einem 'Benimm dich 
kurs'

Übe dich mal in Geduld und Ausdauer,
auch dir hatte man mal damit 'das meiste' Basis Wissen beigebracht,
heute kommen nur noch 'Macho Gehabe' von dir rüber.
Ist traurig, weil in dir viel steckt, aber du kannst es nicht umsetzen,
und das ist das traurigste daran.

von Cyblord -. (cyblord)


Lesenswert?

r_u_d_i schrieb:
> @cybloard
> µC.net ist und bleibt eines der weiterführenden Foren überhaupt.
> Mir hat das all die Jahre enormes Basis Wissen für mein Hobby
> eingebracht.

Sag mal was willst du eigentlich noch? Ich hab hier sei x Tagen nichts 
mehr gepostet. Nicht nur, dass du jetzt auch noch Seitenweise (anderes 
kannst du ja gar nicht posten, mach erst mal ne Therapie bevor du mich 
psychologisch analysieren willst!) deine Stümperhaften Erklärungen 
postest, du redet mich auch dauernd noch dumm von der Seite an. Ich habe 
ganz oben kurz und sachlich geholfen und den korrekten Code gepostet. 
Also was willst du eigentlich die ganze Zeit?
Was du von meinen Posts oder meinen Manieren hälst, Rudi, ich kann dir 
nicht sagen wie egal mir das ist.

von Karl H. (kbuchegg)


Lesenswert?

r_u_d_i schrieb:

> 'Deklaration'
>
> Hier wird nur ein Structure Typ mit 5 Elementen erstellt
>
>
1
> 
2
> struct Id3_tag {
3
>   char title[30];
4
>   char kuenstler[30];
5
>   char album[30];
6
>   short jahr;
7
>   char kommentar[30];
8
>   char genere[30];
9
> };
10
> 
11
>
>
> Damit wird aber nur 'Deklariert', nicht aber Speicherplatz reserviert.

exakt.
Hier wird nur festgelegt, wie ein Objekt von diesem Typ aussehen würde.
Sozusagen der Bauplan.

> Wenn man das so zusammenfasst, dann kann auch der Name der Strukture
> wegfallen wie :

was aber meistens keine so gute Idee ist.
Denn den Datentypnamen benötigt man zb dann, wenn man Funktionen 
schreibt, die ein derartiges Objekt (oder einen Pointer drauf) übergeben 
bekommen sollen.
Nur wie macht man das, wenn man dem Datentyp keinen Namen gegeben hat?

Es gibt Fälle, in denen eine derartige anonyme struct sinnvoll sein 
kann. Aber oft ist es das ganz einfach nicht.


> Der TO verwendet 'typedef' also eine typendefinition,
> da kann dann bei der Verwendung des Strukturtypes das Schlüsselwort
> struct wegfallen:
>
>
1
> 
2
> typedef struct Id3_t data1;
3
> 
4
>
>
> wegen 'typedef' kann dann eine Struktur mit einer Strukturvariablen
> definiert werden ( Speicherplatz wird eingerichtet, auf die Variable
> kann jetzt zugegriffen werden )
>
>
1
> 
2
> Id3_t data1;  // normalerweise: struct Id3_tag data1;
3
> 
4
>

Hier hast du aber ins Klo gegriffen.

typedef erstellt einen neuen Datentypnamen (einen sog. Alias) für einen 
bereits bestehenden Datentyp. Die Syntax dafür ist sehr einfach zu 
merken:
Du schreibst dir die Definition einer normalen Variablen hin
1
struct Id3_tag varName;
stellst du jetzt diesem Ding ein 'typedef' vorran, dann
* wird besagter neuer Datentypname generiert
* wandelt sich die Bedeutung dessen was vorher der Variablenname war zum 
Namen des neuen Datentyps.

Willst du also einen neuen Datentyp namens 'Id3_t' vereinbaren, der ein 
Synonym für den bereits bestehenden Datentyp 'struct Id3_tag' sein soll, 
dann sieht das so aus
1
typedef struct Id3_tag Id3_t;

und erst jetzt hast du einen neuen Datentyp namens 'Id3_t' mit dem du zb 
Variablen definieren kannst
1
typedef struct Id3_tag Id3_t;
2
3
Id3_t data1;

Edit: deine weiteren Ausführungen zeigen, dass du das wohl verstanden 
hast und wahrscheinlich einfach nur einen Fehler beim erstellen des 
Beitrags gemacht hast.

von r_u_d_i (Gast)


Lesenswert?

Cyblord -. schrieb:

> Was du von meinen Posts oder meinen Manieren hälst, Rudi, ich kann dir
> nicht sagen wie egal mir das ist.

Man liest es

;-)

von r_u_d_i (Gast)


Lesenswert?

Karl H. schrieb:
> Edit: deine weiteren Ausführungen zeigen, dass du das wohl verstanden
> hast und wahrscheinlich einfach nur einen Fehler beim erstellen des
> Beitrags gemacht hast.

;-)

Dank Hauptsächlich Deiner und 'Klaus' Hilfe seit ich hier immer wieder 
'als Gast' meine peinlichen 'Anfänger-Schüler' Fragen gestellt habe und 
ihr mir immer aber auch immer mehr als weitergeholfen habt.

Danke an Euch beiden

lg
rudi ;-)

von r_u_d_i (Gast)


Lesenswert?

Cyblord -. schrieb:

> Ich hab hier sei x Tagen nichts mehr gepostet.

2 Tage waren es

'hab dich lieb'

;-)

von r_u_d_i (Gast)


Lesenswert?

'und vermisst'

;-) ;-)

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.