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
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
CONFIGConfigVariable;
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.
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.
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?
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...
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.
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)
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
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.
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
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!
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 )
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.
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.
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 )>>
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
structId3_tagvarName;
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
typedefstructId3_tagId3_t;
und erst jetzt hast du einen neuen Datentyp namens 'Id3_t' mit dem du zb
Variablen definieren kannst
1
typedefstructId3_tagId3_t;
2
3
Id3_tdata1;
Edit: deine weiteren Ausführungen zeigen, dass du das wohl verstanden
hast und wahrscheinlich einfach nur einen Fehler beim erstellen des
Beitrags gemacht hast.
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 ;-)