PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeiger auf Struct in einer Struct



Jaecko
10.11.2009, 21:23
Moin.

Im folgenden Code soll ein Array aus Structs vom Typ stc_B erstellt werden. In jedem Array-Element soll dann neben einer Nummer (b1) auch ein Zeiger auf eine Struct vom Typ stc_cfg sein.



typedef struct
{
ui16_t a1;
ui16_t a2;
ui8_t a3;
} stc_cfg;

typedef struct
{
ui16_t b1;
stc_cfg *data_A;
} stc_B;

const stc_cfg Config1 = {0, 1, 2};
const stc_cfg Config1 = {4, 6, 2};

const stc_B DatasetsB[]=
{
{ 0x0001, Config1 },
{ 0x0002, Config2 },
{ 0x0003, Config1 },
{ 0x0004, Config1 },
{ 0x0005, Config2 }
};



Problem ist jetzt, dass jede Zeile { .. } in stc_B DatasetsB[] bemängelt wird mit:



error: initializer element is not constant
error: (near initialization for 'DatasetsB[0].data_A')
error: initializer element is not constant
error: (near initialization for 'DatasetsB[1].data_A')
error: initializer element is not constant
error: (near initialization for 'DatasetsB[2].data_A')
...


Haut diese Idee nicht hin, in einer Struct nen Zeiger auf ne Struct zu übergeben oder hab ich wieder etwas vergessen?

mfG

markusj
10.11.2009, 22:00
Hi Jaecko,

du musst die Adresse deiner Structs bei der Zuweisung verwenden, nicht die Structs selbst!



typedef struct
{
ui16_t a1;
ui16_t a2;
ui8_t a3;
} stc_cfg;

typedef struct
{
ui16_t b1;
stc_cfg *data_A;
} stc_B;

const stc_cfg Config1 = {0, 1, 2};
const stc_cfg Config1 = {4, 6, 2};

const stc_B DatasetsB[]=
{
{ 0x0001, &Config1 },
{ 0x0002, &Config2 },
{ 0x0003, &Config1 },
{ 0x0004, &Config1 },
{ 0x0005, &Config2 }
};



Dein Problem zeigt Mal wieder, dass Kompilermeldungen auch voll daneben gehen können ;)

mfG
Markus

Jaecko
10.11.2009, 22:59
Das mit dem & hab ich auch schon mal versucht.
Hier wird dann aus dem Error aber ne Warning: "initialization discards qualifiers from pointer target type".
Diese Meldung kommt mir aus dem Bereich bekannt vor, wenn man versucht, mit memset ne volatile-Variable zu füllen.

Das mit den Compilermeldungen kenn ich recht gut; v.a. immer "lustig", wenn man in einer .h irgendwo nen ; vergisst und erst Kilometer später der Fehler an einer total falschen Stelle kommt.
Oder der Klassiker bei µVision: Variablendeklaration nach einem Befehl; da ist dann auf einmal ein Syntaxfehler, wo beim gcc keiner wäre.

sternst
10.11.2009, 23:15
Das mit dem & hab ich auch schon mal versucht.
Hier wird dann aus dem Error aber ne Warning: "initialization discards qualifiers from pointer target type".Was auch kein Wunder ist, schließlich ist *data_A in stc_b nicht const.

Jaecko
11.11.2009, 14:42
Thx... das const hat gefehlt...
Hm, so gesehen hat die Compilermeldung ja dann doch gestimmt ("is not constant"); nur war meine Interpretation hier, dass sich der Wert ändern kann, obwohl die verwendeten Config-Structs selber ja const waren.