2010年2月1日 星期一

結構與集合

今天被學弟問了一個問題


struct 和 union 的差異性


其實這個我只會用


但要我解釋就不太熟了


所以還是把他搞懂


 


struct 就是把不同的成員儲存在一起。


union 其實就是把所有的成員指向同一個位址,而這個位址內的所佔的空間大小以成員最大空間來決定。


 


以前常會把union 和struct 合在一起用


 union sample{
 unsigned int data;
 struct 
  {
  unsigned  D0:1;
  unsigned  D1:1;
  unsigned  D2:1;
  unsigned  D3:1;
  unsigned  D4:1;
  unsigned  D5:1;
  unsigned  D6:1;
  unsigned  D7:1;
  unsigned  D8:1;
  unsigned  D9:1;
  unsigned  D10:1;
  unsigned  D11:1;
  unsigned  D12:1;
  unsigned  D13:1;
  unsigned  D14:1;
  unsigned  D15:1;
  };
}ans;


 


如果我需要改整個變數的話,那麼就是ans.data=0x1155;


那麼裡面的資料會自動改成


ans.D0=1


ans.D1=0


ans.D2=1


ans.D3=0


 


ans.D4=1


ans.D5=0


ans.D6=1


ans.D7=0


 


ans.D8=1


ans.D9=0


ans.D10=0


ans.D11=0


 


ans.D12=1


ans.D13=0


ans.D14=0


ans.D15=0


 


其實還滿方便的。


今天發現了一個更方便的用法,將一個型態為LONG的變數宣告成很多種可能的用法。


union LNG
{
long l;
unsigned long ul;
int i[2];
unsigned int ui[2];
char b[4];
unsigned char ub[4];
};


union LNG


test;


 


執行程式


test. ui[0]=0x5555;


test.ui[1]=0x3333;


 


那麼其他的成員就會自動變成


test.l=0x33335555


 


test.ul=0x33335555


 


test.i[0]=0x5555


test.i[0]=0x3333


 


test.b[0]=0x55


test.b[1]=0x55


test.b[2]=0x33


test.b[3]=0x33


 


test.ub[0]=0x55


test.ub[1]=0x55


test.ub[2]=0x33


test.ub[3]=0x33


 


這樣其實還滿方便好用的


要選擇long 、unsigned long 、integer 、 unsigned integer、byte 和unsigned byte 都很好用


 


如果變數只要當旗標的話,其實只需要1個bit,如果選擇char 或是int 來用的話,那麼都會很浪費,這時候就可以用結構來當作旗標來結省記憶體,


 struct 
  {
  unsigned  D0:1;
  unsigned  D1:1;
  unsigned  D2:1;
  unsigned  D3:1;
  unsigned  D4:1;
  unsigned  D5:1;
  unsigned  D6:1;
  unsigned  D7:1;
  unsigned  D8:1;
  unsigned  D9:1;
  unsigned  D10:1;
  unsigned  D11:1;
  unsigned  D12:1;
  unsigned  D13:1;
  unsigned  D14:1;
  unsigned  D15:1;
  }y;


用法就用


y.D0


y.D1




 


滿好用的2個function


3 則留言:

  1. 有一個好用的地方就是你想把浮點數的4個Byte用UART傳出去時...用union就很方便了。
    [版主回覆02/02/2010 23:23:43]嗯,如果在UART的時候,用binary傳送其實有時候也很方便。除了可以減少byte數也可以省去編ASCII Code 和解ASCII Code的問題。

    回覆刪除
  2. 沒想到又看到這個問題。我的部落格補上了我的舊文章。
    浮點數通信傳輸

    回覆刪除
  3. 原來超連結有問題。現在知道要如何做了,以下這個才是對了。
    浮點數通信傳輸

    回覆刪除