Forum: Mikrocontroller und Digitale Elektronik c struct const


von maddin (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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

von maddin (Gast)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

>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

von maddin (Gast)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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

von maddin (Gast)


Lesenswert?

ok, mal anders:

wie initialisiere ich ein struct mit constanten pointern, geht das 
überhaupt?

@stefan danke für den hinweis.

m.

von maddin (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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;

von maddin (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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

von maddin (Gast)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

> "(*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

von maddin (Gast)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

>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

von Stefan E. (sternst)


Lesenswert?

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
Noch kein Account? Hier anmelden.