2013-08-01 32 views
2

我是位域概念的新手。我正在嘗試訪問結構中的元素,但它在這樣的aa=v處顯示錯誤。訪問位結構中的位域

error: incompatible types when assigning to type ‘cc’ from type ‘long unsigned int ’ 

而且它顯示錯誤,如果我在aa= (cc)v;

error: conversion to non-scalar type requested 

類型強制轉換我試圖通過聲明一個指向結構訪問的元素。在這種情況下,我做得很好,但在這種情況下,我沒有聲明指向結構的指針,我必須訪問這些元素。我怎樣才能克服這個錯誤。

感謝所有幫助提前

#include<stdio.h> 
typedef struct 
{ 
     unsigned long a:8; 
    unsigned long b:8; 
    unsigned long c:8; 
    unsigned long d:8; 
}cc; 


int main() 
{ 
     cc aa ; 
    unsigned long v = 1458; 
    printf("%d\n",sizeof(aa)); 
    aa=v; // aa= (cc)v; 
    printf("%d %d %d %d\n", aa.a,aa.b,aa.c,aa.d); 

    return 0; 
} 
+0

我可能會從'inttypes.h'使用'uint8_t's如果你需要8個大小的位域(對不起,如果這是明顯)。 – m01

回答

3

這是因爲aa是一個結構和v是沒有的,類型不相容就像錯誤消息指出。即使cc是位域的結構,它仍然只能用作結構,具有單獨的成員,而不是整數。

0

使用此:

aa.a = v; 

而不是

aa = v; 
0

你想分配longstruct這是不兼容的。

可以CC的內在價值分配到v:

cc c; 
unsigned long v = 1458; 
c.b = v; 

,如果你想的前8位是在a例如,你可以做

cc c; 
unsigned long v = 1458; 
c.a = v % 255; 
c.b = v/255 % 65280; 
+0

會不會導致溢出?不是255個八位字段可以容納的最大整數值嗎? – verbose

+0

1458二進制值爲:10110110010;我的目標是獲得結構元素a的前8位,即10110010 = 178;和接下來的8位元素b:101 = 5 ....如果我按照你說的做第一個元素是前8位和剩餘元素它顯示0 ..... – user2641184

+0

然後你可以使用模塊@ user2641184 –

2

糾正我,如果我錯誤,但是你想給你的4字節大小的結構分配一個長度爲4字節的長度。如果是的話,這可能是你:

aa = *(cc*)&v; 

但是你應該知道關於在這種情況下字節序

6

如果您打算訪問相同的數據的多種數據類型,那麼你需要使用union in C。看看,這將

  1. 寫入工會把它當作一個32位整數
    (然後)
  2. 訪問數據早在4個獨立的8位位字段的內容片斷
    (也是好措施)
  3. 訪問相同的數據再次爲32位整數

#include<stdio.h> 

typedef struct { 
    unsigned long a:8; 
    unsigned long b:8; 
    unsigned long c:8; 
    unsigned long d:8; 
}bitfields; 

union data{ 
    unsigned long i; 
    bitfields bf; 
}; 

int main() 
{ 
    union data x; 
    unsigned long v = 0xaabbccdd; 
    printf("sizeof x is %dbytes\n",sizeof(x)); 

    /* write to the union treating it as a single integer */ 
    x.i = v; 

    /* read from the union treating it as a bitfields structure */ 
    printf("%x %x %x %x\n", x.bf.a, x.bf.b, x.bf.c, x.bf.d); 

    /* read from the union treating it as an integer */ 
    printf("0x%x\n", x.i); 

    return 0; 
} 

請注意,當union以整數形式訪問時,系統的endian-ness決定各個位字段的順序。因此,32位的x86 PC(小端)上的上述計劃將輸出:

sizeof x is 4bytes 
dd cc bb aa 
0xaabbccdd