2010年2月19日 星期五

找問題~

昨天的問題似乎讓我感到很有興趣


早上來的時候,觀察看看有什麼不同之處,以方便找出問題


 


利用指標結構進副程式,指標結構出副程式,可以看到在執行副程式時,roll和pitch的address已經有問題了,不知道為何address不正確!


*_att 是0x8BA


*_att->roll._ 的address 竟然是0x000?


*_att->pitch._ 的address 竟然是0x004?



在宣告struct ATTITUDE *_btt;


似乎出了問題*_btt的address竟然是0x000,也難怪送進副程式的address會有問題@@


難道在主程式內不能這樣宣告嗎?還是我什麼沒有注意到?



利用結構進副程式,指標結構出副程式,可以看到在執行副程式時,roll和pitch的address是正確的,因為是float的關系,所以相差4的address。


*_att 是0x8BA


*_att->roll._ 的address 是0x89C


*_att->pitch._ 的address 是0x8A0



因為_dtt .roll._的address 在0x89c


因為_dtt .pitch._的address 在0x8a0


所以是合理的



找到問題了,但是我還是不知道為什麼會這樣@@


還需要再研究看看!
怎麼開始覺得熱血了,是因為天氣變暖了嗎?


結構與指標副程式

故事情節是這樣的



竟然這是基本功,那麼當然要練一下了


參考網路上的範例


 


自己重新實驗,利用結構指標進副程式,結構出副程式


union f2bbbb


{


        float _;


        struct


        {


                char b1;


                char b2;


                char b3;


                char b4;


        };


};


 


struct ATTITUDE{


        union f2bbbb roll;


        union f2bbbb pitch;


};


 


struct ATTITUDE get_attitude_from_accel(struct ATTITUDE *_att,int ax,int ay,int az)


{



        _att->roll._  += ax;   


        _att->pitch._ += ay;


        return *_att;       


}


int main(void){


struct ATTITUDE _btt;


float k;


_btt=get_attitude_from_accel(&_btt,1,2,3);


k=_btt.pitch._;


k=_btt.roll._;


return 0;


}



嗯,這樣似乎沒有多大的問題


 



再修改一下,利用結構進副程式,結構出副程式


 



union f2bbbb



{


        float _;


        struct


        {


                char b1;


                char b2;


                char b3;


                char b4;


        };


};


 


struct ATTITUDE{


        union f2bbbb roll;


        union f2bbbb pitch;


};


 


struct ATTITUDE get_attitude_from_accel(struct ATTITUDE _att,int ax,int ay,int az)


{


        _att.roll._  += ax;   


        _att.pitch._ += ay;


        return _att;       


}


int main(void){


struct ATTITUDE _btt;


float k;


_btt=get_attitude_from_accel(_btt,1,2,3);


k=_btt.pitch._;


k=_btt.roll._;


return 0;


}


 


 


嗯,這樣似乎沒有多大的問題

 


再修改一下利用結構指標進副程式,結構指標出副程式


union f2bbbb


{


        float _;


        struct


        {


                char b1;


                char b2;


                char b3;


                char b4;


        };


};


struct ATTITUDE{


        union f2bbbb roll;


        union f2bbbb pitch;


};


struct ATTITUDE get_attitude_from_accel(struct ATTITUDE *_att,int ax,int ay,int az)


{


        _att->roll._  += ax;   


        _att->pitch._ += ay;


        return *_att;       


}


int main(void){


struct ATTITUDE *_btt;


float k;


*_btt=get_attitude_from_accel(_btt,1,2,3);


k=_btt->pitch._;


k=_btt->roll._;


return 0;


}


 


問題來了,執行這樣的副程式竟然會出錯!


摸不著頭緒@@


不知道為什麼這樣的指標結溝沒有辦法正常運作


 


原來-> 這個符號不是c++才擁有的@@ 原來c語言就有這個符號了


另外就是


以前以為struct 和union 只能這樣用


原來struct 和union 是可以反過來用@@


這樣的結構方式真的還滿好用的


奇怪@@才剛過完年,我怎麼好像有好多作業喔


呵呵~


不過還滿好玩的就是了


聽說今天只有8度?超級冷的啦!!!!!


實驗室是冰箱吧!!!!!!!!!!


老闆,可以申請暖器機嗎?


哈哈


2010年2月17日 星期三

指標式的副程式

今天大年初四


又溼又冷的



還是到實驗室寫程式吧


 


過年前,許同學給了我2支有趣的程式


1個是指標式的副程式


1個是指標陣列的副程式


首先,先看指標式的副程式



int add(int,int);
int sub(int,int);
int multiply(int,int);
int divide(int,int);
int (*operation)(int,int);


int test;
int main(void)
{
  int x=10,y=2,output;


  operation=add;
  output=(*operation)(x,y);
  test=output;              
//test = 12


  operation=sub;
  output=(*operation)(x,y);
  test=output;             
//test = 8


  operation=multiply;
  output=(*operation)(x,y);
  test=output;             
//test = 20


  operation=divide;
  output=(*operation)(x,y);
  test=output;             
//test = 5



  return 0;   



}

int add(int a,int b)
{
 return a+b;
}


int sub(int a,int b)
{
 return a-b;
}


int multiply(int a,int b)
{
 return a*b;
}


int divide(int a,int b)
{
 return a/b;
}



說實在的,我不知道為什麼要這樣用,我覺得直接呼叫副程式就好了


不過許同學說,以後就會看到很多這樣的寫法了。


再來,指標陣列的副程式



unsigned char aa(unsigned char a);


unsigned char bb(unsigned char b);


 


unsigned char (*ns[])(unsigned char) =


{


 aa,


 bb


};


 


int test;


int main(void)


{


 


  unsigned char r;


  r=(*ns[0])(2);


  test=r;                        //test=3


  r=(*ns[1])(2);


  test=r;                        //test=4


  return 0;


}


unsigned char aa(unsigned char a)


{


  return a+1;


}


 


unsigned char bb(unsigned char b)


{


  return b+2;


}


 


說實在的,我也不知道為什麼要這樣用,我也覺得直接呼叫副程式就好了


不過許同學說,以後這樣的寫法可以在副程式裡減少switch case的判斷式。


蛤?



我也不懂


改天再問他看看到底怎麼回事好了


不過似乎C語言的世界還是有很多值得我去探索的



2010年2月11日 星期四

找工作

這個星期一打電話去問上次應徵工作的結果


結果竟然是「沒上」



主管說他把我放在備取,而正取的有去報到,所以就只能說抱歉了


他說他很少在一個星期遇到2個這麼優秀的人


不過他的名額只有1個


主管竟然和我聊了快半個小時,也鼓勵了我很多話


嘻~~


雖然和他說沒關系


不過最後我還是問了理由


他的理由是coding 能力沒有另一個強


想不到我輸在我喜歡的程式上


呵呵~


看起來我又需要繼續找工作了


其實那家公司我還滿想進去的


主管感覺很nice,而且似乎能力很強


應該聽朋友的建言


要抱著必上的決心才對


這次是我的疏乎


不過千金也難買早知道


不過這次的疏乎讓我很在乎


嗯~


當天晚上還做了一個惡夢


夢到我去當兵了


呵呵


起來後想一想


當兵並不一是一件壞事


其實也沒有絕對要怎樣不可


所以,隨緣吧!


反正人生不會因為一次「失敗」或「失意」而沒有辦法走下去


有時候「失意」或「失敗」不見得是壞事


因為這樣會讓人成長並茁壯



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