union struct definieren



  • MFK schrieb:

    typedef struct
    {
        unsigned char Command;
        unsigned char DataLen;
    
        union
        {
            unsigned char ByteData[24];
            unsigned char LongData[6];
        };
    }
    

    Ich bin mir jetzt nicht sicher (und zu faul den Standard zu durchforsten), aber kann es sein, dass das nicht standardkonform ist? Also der Union keinen Namen zuzuweisen?



  • TactX schrieb:

    MFK schrieb:

    typedef struct
    {
        unsigned char Command;
        unsigned char DataLen;
    
        union
        {
            unsigned char ByteData[24];
            unsigned char LongData[6];
        };
    }
    

    Ich bin mir jetzt nicht sicher (und zu faul den Standard zu durchforsten), aber kann es sein, dass das nicht standardkonform ist? Also der Union keinen Namen zuzuweisen?

    sowas wirds sein. probier dies:

    typedef struct
    {
        unsigned char Command;
        unsigned char DataLen;
    
        union __data
        {
            unsigned char ByteData[24];
            unsigned char LongData[6];
        } data;
    } Command;
    
    Command cmd;
    InitCommand(0,0,Cmd.data.LongData[0]);
    


  • wieso typedef struct {} structname;? ich kenn es so:

    struct structname {
    ...
    } inst1, inst2;
    


  • c.rackwitz schrieb:

    wieso typedef struct {} structname

    Gegenfrage: Warum nicht so? Kann evtl. doch ein wenig tippen ersparen.



  • TactX schrieb:

    c.rackwitz schrieb:

    wieso typedef struct {} structname

    Gegenfrage: Warum nicht so? Kann evtl. doch ein wenig tippen ersparen.

    Ne dadurch hat man ein 'typedef' mehr 🙄



  • net schrieb:

    sowas wirds sein.

    Jup. Sieht ganz danach aus.



  • FireFlow schrieb:

    TactX schrieb:

    c.rackwitz schrieb:

    wieso typedef struct {} structname

    Gegenfrage: Warum nicht so? Kann evtl. doch ein wenig tippen ersparen.

    Ne dadurch hat man ein 'typedef' mehr 🙄

    Ich schieb's mal auf das schwüle Wetter 😃



  • FireFlow schrieb:

    Ne dadurch hat man ein 'typedef' mehr 🙄

    Dafür muss man überall "struct Command" schreiben. Mit typedef muss man das nicht.



  • 🙂 Hallo zusammen

    Vielen Dank für eure Tipps. Ich habe nun die Lösung von MFK eigesetzt. Die wird auch vom Microchip-Compiler akzeptiert.

    Beste Grüsse
    Gerhard



  • net schrieb:

    typedef struct
    {
        unsigned char Command;
        unsigned char DataLen;
    
        union __data
        {
            unsigned char ByteData[24];
            unsigned char LongData[6];
        } data;
    } Command;
    
    Command cmd;
    InitCommand(0,0,Cmd.data.LongData[0]);
    

    Müsste es nicht

    typedef struct
    {
        unsigned char Command;
        unsigned char DataLen;
    
        union __data
        {
            unsigned char ByteData[24];
            long LongData[6];
        } data;
    } Command;
    
    Command cmd;
    InitCommand(0,0,Cmd.data.LongData[0]);
    

    sein, damit es sinn macht? Sonst wären doch die Speicherbereiche der ersten und der zweiten Variable nicht mehr gleich groß.



  • ProgChild schrieb:

    Sonst wären doch die Speicherbereiche der ersten und der zweiten Variable nicht mehr gleich groß.

    Es ist egal wie gross die Felder einer union sind. Das Feld data wird so gross wie das grösste feld in der union.
    Kurt



  • ProgChild schrieb:

    Sonst wären doch die Speicherbereiche der ersten und der zweiten Variable nicht mehr gleich groß.

    irgendwie schon, aber die grösse von 'long' ist dummerweise nicht festgelegt, vielleicht besser uint8_t und uint32_t nehmen.


Anmelden zum Antworten