-         
Ergebnis 1 bis 5 von 5

Thema: Zeiger auf Struct in einer Struct

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987

    Zeiger auf Struct in einer Struct

    Anzeige

    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.

    Code:
    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:

    Code:
    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
    #ifndef MfG
    #define MfG

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    30
    Beiträge
    1.222

    Re: Zeiger auf Struct in einer Struct

    Hi Jaecko,

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

    Code:
    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

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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.
    #ifndef MfG
    #define MfG

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Jaecko
    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.
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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.
    #ifndef MfG
    #define MfG

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •