union struct definieren



  • Hall MFK

    Super, vielen Dank für den raschen TIPP! Unter Visual C++ funktioniert der Anatz einwandfrei. Mit meinem C-Compiler (MPLAB C18) beklagt sich der Compiler allerdings mit der Fehlermeldung:

    Error [1129] [] operator requires a pointer and an integer as operands
    Error [1146] type mismatch in argument 2

    wenn ich auf die Datenstruktur zugreife.

    [cpp]typedef struct
    {
        unsigned char Code;
        unsigned char DataLen;
        union 
        { 
            unsigned char Data[24]; 
            long LongData[6]; 
        };
    }Command;
    
    Command Cmd;
    
    InitCommand(0,0,Cmd.LongData[0]);[/cpp]
    

    Ist der Compiler dann vielleicht nich Ansi-kompatibel oder muss man die Definition evtl. noch anpassen?

    Vielen Dank und freundliche Grüsse

    Gerhard



  • 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