int

2012-08-10 13 views
8

में संरचना कास्टिंग करना क्या uint64_t या किसी अन्य int में संरचना कास्टिंग करने का कोई साफ तरीका है, क्या < = स्ट्रक्चर int में अंतर्निहित है? यूनियनों का उपयोग करने के लिए केवल एक चीज जिसे मैं सोच सकता हूं वह केवल 'ठीक' समाधान है। हालांकि मैं कभी उनका शौक नहीं रहा हूं। मैं कैसे some_struct डाली अपनी बिट्स uint32_t रजिस्टर में आदेश पर कब्जा करने के लिए क्याint

typedef struct { 
uint8_t field: 5; 
uint8_t field2: 4; 
/* and so on... */ 
}some_struct_t; 

some_struct_t some_struct; 
//init struct here 

uint32_t register; 

अब:

मुझे स्पष्ट करने के लिए एक कोड स्निपेट शामिल हैं।

आशा है कि यह थोड़ा स्पष्ट हो जाए।

+4

वहाँ हमेशा memcpy है! –

+0

@ मार्टिनबेकेट यह एक अच्छा जवाब देगा :) – dasblinkenlight

+7

संघों का "शौकीन" नहीं है? एक संघ ठीक वही करता है जो आप स्पष्ट, रखरखाव योग्य तरीके से करना चाहते हैं। इसके बारे में सिर्फ "ठीक" क्या है? –

उत्तर

1

एक गैर पोर्टेबल समाधान:

struct smallst { 
    int a; 
    char b; 
}; 

void make_uint64_t(struct smallst *ps, uint64_t *pi) { 
    memcpy(pi, ps, sizeof(struct smallst)); 
} 

आप समस्याओं का सामना कर सकते हैं यदि आप, उदाहरण के लिए, एक छोटे से endian मशीन पर struct पैक और एक बड़े endian मशीन पर खोल दे।

15

मैं सिर्फ एक ही समस्या मारा है, और मैं इस तरह की एक संघ के साथ इसे हल:

typedef union { 
    struct { 
     uint8_t field: 5; 
     uint8_t field2: 4; 
     /* and so on... */ 
    } fields; 
    uint32_t bits; 
} some_struct_t; 

/* cast from uint32_t x */ 
some_struct_t mystruct = { .bits = x }; 

/* cast to uint32_t */ 
uint32_t x = mystruct.bits; 

HTH, एलेक्स

0

आप संकेत का उपयोग कर सकते हैं और यह उदाहरण के लिए आसान हो जाएगा :

struct s { 
    int a:8; 
    int b:4; 
    int c:4; 
    int d:8; 
    int e:8; }* st; 

st->b = 0x8; 
st->c = 1; 
int *struct_as_int = st; 

आशा है कि यह मदद करता है

+0

इसके लिए किसी भी अनुरूप कंपेलर में टाइपकास्ट की आवश्यकता होगी, और कई कंप्यूटर्स पर भी '-फनो-सख्त-एलियासिंग' या कुछ समान विकल्प के उपयोग की आवश्यकता होगी। – supercat