hi, ich habe eine frage zu strukturen in verbindung mit dem schlüsselwot const in c. der code den ich angehängt habe lässt sich bis auf die initialisierung der dev_inst struktur kompilieren, jetzt wundere ich mich, warum ich den constanten zeigern der dev_xcg43 struktur werte zuweisen kann, der dev_inst struktur aber nicht. letztenlich sollen es globale constante daten werden, ich habe das alles auch schon mit constanten feldern gemacht, nur finde ich die zugriffsmöglichkeiten über strukturen schöner. meine fragen, sind die elemente einer const struct eh schon konstant? warum geht es bei dev_inst nicht?(wenn ich das const vor den var. weg lasse passt alles) schaffe ich es auf diesem wege, das keine variablen im ram angelgt werden, sondern nur constante werte, wie man es häufig auch für zeichensätze nutzt!? gruß, m. typedef const struct dev_inst { const unsigned long inst1; const unsigned long inst2; const unsigned long inst3; }; typedef const struct dev_xcg43 { const char* name; const dev_inst* instruction; const unsigned long* length; }; const dev_inst inst1={ 70, 80, 90 }; const dev_xcg43 pscf_3334={ "Hallo", // (unsigned long*)xcf2000p_name, &inst1, len };
maddin wrote: > jetzt wundere ich mich, warum ich den > constanten zeigern der dev_xcg43 struktur werte zuweisen kann, der > dev_inst struktur aber nicht. Das liegt daran, dass das keine konstanten Zeiger sind, sondern (variable) Zeiger auf konstante Werte...
ok, wie sage ich dem compiler das das gesamte struct constant ist, und vor allem wie initialisiere ich es!? wenn ich ein konstantes feld anlege, const unsigned long arr[]={0,0,1,2,3,4}; //konstante werte im array const unsigend long* dev[]={arr,NULL}; //hier soll der zeiger selbst auch konstant sein! dann wird für die einzelnen werte sicher kein speicher im ram angelegt, und eben dies will ich jetzt mit strukturen machen... dank dir, m.
>der code den ich angehängt habe lässt sich bis auf die initialisierung >der dev_inst struktur kompilieren, Das mag zwar so sein, aber das Ergebnis dürfte nicht das tun, was du erwartest. 1. typedef struct syntax: typedef struct {//irgendwas} name; 2. len ist nirgends deklariert. Oliver
warum!? printf("instruction 1 0x%08x\n",pscf_3334->instruction->inst1); printf("device name %s\n\n",&pscf_3334->name[0]); erfüllen bereits ihren zweck. (nehmt das "len" mal als gegeben hin, es ist für die frage nicht wichtig) @Johannes M. das mit dem const zeiger ist verständlich, wie müsste ich es machen, um den inhalt des zeigers selbst als const zu deklarieren? geht das in diesem zusammenhang überhaupt? m.
Das hier compiliert:
1 | typedef const struct |
2 | {
|
3 | const unsigned long inst1; |
4 | const unsigned long inst2; |
5 | const unsigned long inst3; |
6 | }dev_inst ; |
7 | |
8 | typedef const struct |
9 | {
|
10 | const char* name; |
11 | const dev_inst* instruction; |
12 | const unsigned long* length; |
13 | } dev_xcg43; |
14 | |
15 | const dev_inst inst1={ |
16 | 70, |
17 | 80, |
18 | 90
|
19 | };
|
20 | |
21 | const unsigned long len = 17; |
22 | |
23 | const dev_xcg43 pscf_3334={ |
24 | "Hallo", // (unsigned long*)xcf2000p_name, |
25 | &inst1, |
26 | &len |
27 | };
|
Ein Lesezugriff geht dann:
1 | unsigned long len2 = *pscf_3334.length; |
Ein Schreibzugriff wird angemeckert:
1 | pscf_3334.length = (unsigned long*) 17; |
>main.c: In function 'main': >main.c:35: error: assignment of read-only variable 'pscf_3334' >dann wird für die einzelnen werte sicher kein speicher im ram angelegt, >und eben dies will ich jetzt mit strukturen machen... Das hängt stark vom Zielprozessor und vom Compiler ab, in welchem Speichersegment solche Konstanten angelegt werden. Näheres sollte dazu in der Compilerdoku zu finden sein. Oliver Oliver
> das mit dem const zeiger ist verständlich, wie müsste ich es machen, um > den inhalt des zeigers selbst als const zu deklarieren? char* const ptr; oder wenn sowohl der Zeiger als auch das Ziel const sein soll: const char* const ptr;
ok, mal anders: wie initialisiere ich ein struct mit constanten pointern, geht das überhaupt? @stefan danke für den hinweis. m.
hier nochmal das bsp.: typedef struct dev_xcg43 { const char* const name; const dev_inst* const instruction; }; dev_xcg43 pscf_32={ "Hallo", // (unsigned long*)xcf2000p_name, &inst1, }; gruß, m. syntax des struct: struct [Name]{ Datentyp VariablenName; Datentyp VariablenName; Datentyp VariablenName; . . }[Variablenliste];
Die Initialisierung ist so richtig, aber das typedef wird so nicht gehen. Du musst das dev_xcg43 hinter die Strukturdefinition schreiben. Also:
1 | typedef struct |
2 | {
|
3 | const char* const name; |
4 | const dev_inst* const instruction; |
5 | } dev_xcg43; |
hallo stefan, habe ich auch schon bemerkt als olli schrieb, leider habe ich immer noch den fehler: error C2552: 'inst1' : Initialisierung nicht zusammengesetzter Typen mit Initialisierungsliste ist nicht moeglich es scheint nicht möglich zu sein, eine struktur mit konstanten werten mit hilfe einer initialisierungsliste zu initialisieren... während: const unsigned long gg=09; kein pronlem darstellt, logischer weise... das ist seltsam, oder? m. typedef struct { const unsigned long inst1; const unsigned long inst2; const unsigned long inst3; }dev_inst; typedef struct { const char* const name; const dev_inst* const instruction; }dev_xcg43; dev_inst inst1={ 70, 80, 90 }; dev_xcg43 pscf_32={ "Hallo", // (unsigned long*)xcf2000p_name, &inst1, };
> es scheint nicht möglich zu sein, eine struktur mit konstanten werten > mit hilfe einer initialisierungsliste zu initialisieren... Doch, das geht definitiv. Das von dir gepostete Codefragment wird bei mir ohne Fehler übersetzt (mit GCC). Und es funktioniert auch. Ein printf("%s %ld\n",pscf_32.name,(*pscf_32.instruction).inst1); liefert das erwartete "Hallo 70".
hallo stefan, danke für die tips und die hilfe: ist: "(*pscf_32.instruction).inst1" gleichwertig zu "pscf_32->instruction->inst1"? leider habe ich unter studio immer noch diese fehlerausgabe mit diesem code (gcc) kann doch nicht sein, der fehler muss zwischen den ohren liegen... m.
> "(*pscf_32.instruction).inst1" gleichwertig zu > "pscf_32->instruction->inst1"? Nein, es ist gleichwertig zu pscf_32.instruction->inst1 Meinst du mit "studio" etwa "AVR-Studio"? Dann hat das const eh nicht den Effekt, den du dir erhoffst. Lese dazu erstmal dieses: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29
nein, ich meinte schon visual studio... entschuldigung, mein fehler. ...ich übergebe die ADRESSE des gesamten devices einer "ausgabe" funktion, deswegen kann ich dort dann mit: device->instruction->inst1 darauf zugreifen... daran habe ich in der schocksekunde nicht gedacht... leider führt es immer noch zu problemen, wenn ich mit einer "const" anweisung in der definition der struktur arbeite, sobald ich sie dann mit einer initialisierungsliste initialisiere, wie oben im beispiel.... : error C2552: 'inst1' : Initialisierung nicht zusammengesetzter Typen mit Initialisierungsliste ist nicht moeglich ansonsten (ohne const) läuft alles soweit wie ich mir das vorgestellt habe... m.
>Meinst du mit "studio" etwa "AVR-Studio"? >error C2552: 'inst1' : Initialisierung nicht zusammengesetzter Typen mit >Initialisierungsliste ist nicht moeglich Das wäre der erste gcc, der deutsche Fehlermeldungen von sich gibt. http://msdn2.microsoft.com/en-us/library/0s6730bb(VS.80).aspx Das hier ist ein Forum für gcc auf Mikrocontrollern. Deine Fehlermeldung aber kommt aus dem Reich des Bösen - Fragen zu Kleinweich und dessen Visual Studio führe hier selten zu sinnvollen Antworten. Und auf dem PC landet sowieso alles grundsätzlich immmer im Ram, ob const oder const const. Was anderes kennt der PC doch gar nicht. Der gcc übersetzt jedenfalls einen Code (nach Behebung deiner Fehler) anstandslos. Oliver
Oliver wrote: >>Meinst du mit "studio" etwa "AVR-Studio"? > >>error C2552: 'inst1' : Initialisierung nicht zusammengesetzter Typen mit >>Initialisierungsliste ist nicht moeglich > > Das wäre der erste gcc, der deutsche Fehlermeldungen von sich gibt. Ich war etwas verwirrt, weil er ja den gcc explizit genannt hatte: > leider habe ich unter studio immer noch diese fehlerausgabe mit diesem > code (gcc) kann doch nicht sein, ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.