This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

and again the question of variables

There is an SRC variable of 16 bits, how to create two 8-bit variables, so that one is addressed to the upper part and the second to the lower part of the SRC variable?
type construction

uint16_t src;
uint8_t b1 = * ((uint8_t *) & src);
uint8_t b2 = * (((uint8_t *) & src) +1);


should work but at compilation produces:

MAIN.c (16): error: # 28: expression must have a constant value
  uint8_t b1 = * ((uint8_t *) & src);
MAIN.c (17): error: # 28: expression must have a constant value
  uint8_t b2 = * (((uint8_t *) & src) +1);
MAIN.c: 0 warnings, 2 erros


How to correctly address the variables B1 and B2 that, when changing these variables, the corresponding value in the SRC variable and vice versa change.
Sorry for my english :)

Parents
  • For all who are interested in - a single address space variable and access to bits and bytes.
    Full version:

    union Register32 {
        struct {
        unsigned a0: 1;
        unsigned a1: 1;
        unsigned a2: 1;
        unsigned a3: 1;
        unsigned a4: 1;
        unsigned a5: 1;
        unsigned a6: 1;
        unsigned a7: 1;
        unsigned a8: 1;
        unsigned a9: 1;
        unsigned a10: 1;
        unsigned a11: 1;
        unsigned a12: 1;
        unsigned a13: 1;
        unsigned a14: 1;
        unsigned a15: 1;
        unsigned a16: 1;
        unsigned a17: 1;
        unsigned a18: 1;
        unsigned a19: 1;
        unsigned a20: 1;
        unsigned a21: 1;
        unsigned a22: 1;
        unsigned a23: 1;
        unsigned a24: 1;
        unsigned a25: 1;
        unsigned a26: 1;
        unsigned a27: 1;
        unsigned a28: 1;
        unsigned a29: 1;
        unsigned a30: 1;
        unsigned a31: 1;
        } bit;
        struct {
            uint8_t byte1;
            uint8_t byte2;
            uint8_t byte3;
            uint8_t byte4;
        } bytes;
        struct {
            uint16_t low;
            uint16_t high;
        } words;
        uint32_t dword;
    };
    union Register16 {
        struct {
            unsigned a0: 1;
            unsigned a1: 1;
            unsigned a2: 1;
            unsigned a3: 1;
            unsigned a4: 1;
            unsigned a5: 1;
            unsigned a6: 1;
            unsigned a7: 1;
            unsigned a8: 1;
            unsigned a9: 1;
            unsigned a10: 1;
            unsigned a11: 1;
            unsigned a12: 1;
            unsigned a13: 1;
            unsigned a14: 1;
            unsigned a15: 1;
        } bit;
        struct {
            uint8_t low;
            uint8_t high;
        } bytes;
        uint16_t dint;
    };
    union Register8 {
        struct {
            unsigned a0: 1;
            unsigned a1: 1;
            unsigned a2: 1;
            unsigned a3: 1;
            unsigned a4: 1;
            unsigned a5: 1;
            unsigned a6: 1;
            unsigned a7: 1;
        } bit;
           uint8_t bytes;
    };
    typedef union Register32 EAX32;
    typedef union Register16 EAX16;
    typedef union Register8  EAX8;
    

Reply
  • For all who are interested in - a single address space variable and access to bits and bytes.
    Full version:

    union Register32 {
        struct {
        unsigned a0: 1;
        unsigned a1: 1;
        unsigned a2: 1;
        unsigned a3: 1;
        unsigned a4: 1;
        unsigned a5: 1;
        unsigned a6: 1;
        unsigned a7: 1;
        unsigned a8: 1;
        unsigned a9: 1;
        unsigned a10: 1;
        unsigned a11: 1;
        unsigned a12: 1;
        unsigned a13: 1;
        unsigned a14: 1;
        unsigned a15: 1;
        unsigned a16: 1;
        unsigned a17: 1;
        unsigned a18: 1;
        unsigned a19: 1;
        unsigned a20: 1;
        unsigned a21: 1;
        unsigned a22: 1;
        unsigned a23: 1;
        unsigned a24: 1;
        unsigned a25: 1;
        unsigned a26: 1;
        unsigned a27: 1;
        unsigned a28: 1;
        unsigned a29: 1;
        unsigned a30: 1;
        unsigned a31: 1;
        } bit;
        struct {
            uint8_t byte1;
            uint8_t byte2;
            uint8_t byte3;
            uint8_t byte4;
        } bytes;
        struct {
            uint16_t low;
            uint16_t high;
        } words;
        uint32_t dword;
    };
    union Register16 {
        struct {
            unsigned a0: 1;
            unsigned a1: 1;
            unsigned a2: 1;
            unsigned a3: 1;
            unsigned a4: 1;
            unsigned a5: 1;
            unsigned a6: 1;
            unsigned a7: 1;
            unsigned a8: 1;
            unsigned a9: 1;
            unsigned a10: 1;
            unsigned a11: 1;
            unsigned a12: 1;
            unsigned a13: 1;
            unsigned a14: 1;
            unsigned a15: 1;
        } bit;
        struct {
            uint8_t low;
            uint8_t high;
        } bytes;
        uint16_t dint;
    };
    union Register8 {
        struct {
            unsigned a0: 1;
            unsigned a1: 1;
            unsigned a2: 1;
            unsigned a3: 1;
            unsigned a4: 1;
            unsigned a5: 1;
            unsigned a6: 1;
            unsigned a7: 1;
        } bit;
           uint8_t bytes;
    };
    typedef union Register32 EAX32;
    typedef union Register16 EAX16;
    typedef union Register8  EAX8;
    

Children
No data