台灣最大程式設計社群網站
線上人數
906
 
會員總數:245119
討論主題:189029
歡迎您免費加入會員
討論區列表 >> C/C++ >> 請問定義結構語法=>typedef struct
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
請問定義結構語法=>typedef struct
價值 : 10 QP  點閱數:3062 回應數:5

樓主

吳小達
門外漢
0 1
24 4
發送站內信

捐贈 VP 給 吳小達
// 第一種
typedef struct {
    unsigned char speech:1;
    unsigned char bc64kbits:1;
    unsigned char bc2x64kbits:1;
    unsigned char bc384kbits:1;
    unsigned char bc1536kbits:1;
    unsigned char bc1920kbits:1;
    unsigned char multirate:1;
    unsigned char restrictedDigitalInfo:1;
    unsigned char bc3_1khzAudio:1;
    unsigned char bc7khzAudio:1;
    unsigned char video:1;
    unsigned char reserved:5;

}   INAPAPI_ATYPE_BearerCapabilities;

//======================
//第二種
typedef struct {
    unsigned char len;
    unsigned char data[2];

}   INAPAPI_DTYPE_Integer2;


想請問以上兩種定義structure方法有什麼不同?
大部分常見的是第二種,
最近有看到第一種的寫法,
不知道用":"代表什麼意思,
請各位高手解答一下吧~~~


搜尋相關Tags的文章: [ typedef ] ,
本篇文章發表於2005-05-04 13:28
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
作者回應

吳小達
捐贈 VP 給 吳小達 檢舉此回應
sorry,程式沒有加換行,再貼一次....

//第一種
typedef struct {
unsigned char speech:1;
unsigned char bc64kbits:1;
unsigned char bc2x64kbits:1;
unsigned char bc384kbits:1;
unsigned char bc1536kbits:1;
unsigned char bc1920kbits:1;
unsigned char multirate:1;
unsigned char restrictedDigitalInfo:1;
unsigned char bc3_1khzAudio:1;
unsigned char bc7khzAudio:1;
unsigned char video:1;
unsigned char reserved:5;

} INAPAPI_ATYPE_BearerCapabilities;


//第二種
typedef struct {
unsigned char len;
unsigned char data[2];

} INAPAPI_DTYPE_Integer2;

</pre>
本篇文章回覆於2005-05-04 13:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

Lak
捐贈 VP 給 Lak 檢舉此回應
其本上..你第二種寫法,是一種 unpacked 的寫法,而在 C++ 裡,
他允許你將你的 struct 包裝成你想要的大小,
就是說,你第一種寫法裡,會分配16 bit,
比如 video 就只有 1 bit ,
而 reserved 就是 5 bit ,
但這種方式最好少用..
因為雖然看起來好像可以省記憶體,
但其實會浪費很多時間在處理速度上,而且,
轉為機器碼也滿大的..
本篇文章回覆於2005-05-10 03:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

吳小達
捐贈 VP 給 吳小達 檢舉此回應
thank you~
原來是bit...
那要設定bit的初始值應該就要用16進制的and ,or ,XOR...吧?

譬如:
INAPAPI_ATYPE_BearerCapabilities test[1];

memcpy(test, "0x1111", sizeof(INAPAPI_ATYPE_BearerCapabilities));

不知道對不對?
本篇文章回覆於2005-05-10 09:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

Lak
捐贈 VP 給 Lak 檢舉此回應
你說的做法我沒試過,你可以測看看,
反正你把那個 var 設為 1 bit ..
就是能存 0 or 1
我的做法是直接當成是一般的 struct 來用,只不過你要注意你存的值不要 over,
所以應該配合 define 一些 flag 來用..
比較不會出錯..
本篇文章回覆於2005-05-10 13:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
補充:
bitwise declaration 一般通長用在取得個別的bit, 不然的確少用,
一般都搭配union使用, 例如:

union
      {
       char key;

       struct
              {
               unsigned  R_SHIFT     : 1;  /* 0 */
               unsigned  L_SHIFT     : 1;  /* 1 */
               unsigned  CTRL        : 1;  /* 2 */
               unsigned  ALT         : 1;  /* 3 */
               unsigned  SCROLL_LOCK : 1;  /* 4 */
               unsigned  NUM_LOCK    : 1;  /* 5 */
               unsigned  CAPS_LOCK   : 1;  /* 6 */
               unsigned  INSERT      : 1;  /* 7 */
              } bit;
      } kb;


kb.bit.R_SHIFT 就是 kb.key 的第0個 bit
用起來非常方便^^~
如果不這樣用, 就要 << >> shift來 shift 去了~.....那程式會很難讀...= =a
或者用 bitwise operation 的 & | ~ ^....
本篇文章回覆於2005-05-29 03:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.