mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik c struct const


Autor: maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
                          };

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier compiliert:
typedef const struct 
{
   const unsigned long inst1;
   const unsigned long inst2;
   const unsigned long inst3;
}dev_inst ;

typedef const struct 
{
   const char* name;
   const dev_inst* instruction;
   const unsigned long* length;
} dev_xcg43;

const dev_inst inst1={
    70,
    80,
    90
       };
     
const unsigned long len = 17;

const dev_xcg43 pscf_3334={
    "Hallo",  // (unsigned long*)xcf2000p_name,
    &inst1,
    &len
                          };
Ein Lesezugriff geht dann:
  unsigned long len2 = *pscf_3334.length;
 

Ein Schreibzugriff wird angemeckert:
  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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, mal anders:

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

@stefan danke für den hinweis.

m.

Autor: maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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];

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Initialisierung ist so richtig, aber das typedef wird so nicht 
gehen. Du musst das dev_xcg43 hinter die Strukturdefinition schreiben.
Also:
typedef struct
{
  const char* const name;
  const dev_inst* const instruction;
} dev_xcg43;

Autor: maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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,
    };

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Autor: maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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(...

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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, ...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.