2/24/2012

工程師的美麗與哀愁74--原始碼

我說過,我現在正在做自己的專案;因為這個案子,需要寫程式以及硬體上的製作,所以會有一些衍生物出來。像是原始程式碼或是電路圖等等。
  又沒有其他地方可以貼,所以只好貼在這邊了……
  這些衍生物我先歸類在『工程師的美麗與哀愁』之下,如果數量夠多的話,我會新開一個分類。


自訂函數 float_to_int(double dFloatPoint,long l0Int_1float[2]) 
  -與其說是將浮點數轉換成整數,倒不如說是將浮點數轉換成『長整數陣列』。
  -概念
   因為目前手邊不管是OLED的RIT128x96x4StringDraw()還是UARTprintf(),只接受『字串』以及整數
所以必須做一些很複雜的轉換。
    RIT128x96x4StringDraw()這個函數只接受『字串』,所以必須將整數轉換成字串。
這個功能用utils/ustdlib.h中的usprintf()就可以完成。但是usprintf()並不接受浮點數。

   相同的,UARTprintf()也只接受整數。

   為了這個原因,必須自訂一個函數來做轉換。將浮點數拆解成為兩個整數。

 
  -輸入參數
參數解說型態
dFloatPoint 輸入需要拆解的浮點數 Double
l0Int_1float[2]存放拆解之後的長整數陣列
l0Int_1float[0]=整數部份
l0Int_1float[1]=小數部份
long

  -方法

   整數部份:
就……直接做型態轉換,將dFloatPoint轉成long之後,存放到l0Int_1float[0]之中。

   小數部份:
    使用fmod()函數(在math.h之中),讓dFloatPoint對1做餘數,使其剩下小數的
    部份。如果小數之後有數值的話,就進入判斷式中。如果沒有的話,就讓 l0Int_1float[1]=0

    進入判斷式之後,把數值做餘數存放在dTmp中,乘上1000後,在做一次型態轉換後存入l0Int_1float[1]之中,把剩餘位數去掉。

  -討論:
  -其實也不一定要乘上10000,看需要多少的精確度而定。10000的話,可以精確到小數後四位
  
  -這個函數有個缺點,建議最好先把l0Int_1float做初始化,不然會發生不可預期的問題。
   -用到很多內建的函式庫,不知道這樣做會不會造成問題。但是,目前就以在OLED上的顯示來看  似乎還可以用。
  -以下是程式碼:

#include  
 void float_to_int(double dFloatPoint,long l0Int_1float[2]){
   double dTmp;

  l0Int_1float[0]=(long)dFloatPoint;
  if(fmod(dFloatPoint,1.0) > 0){

   dTmp=fmod(dFloatPoint,1.0);

   dTmp = dTmp *10000;

   l0Int_1float[1] = (long)dTmp;

  }else{
l0Int_1float[1] = 0;
}
}
  帥氣吧!註解寫的比程式碼還多^^
  這就是我的風格!
  有些老外寫的程式碼,註解佔了整個程式碼的一大半,但是礙於都是英文,有看真的沒有懂==
  而且那些軟體工程師都只用他們的術語來說,也沒有好好解釋整個概念,就是很單純的告訴妳,你該輸入些什麼,輸出會是什麼等等。
  看了就很疲累。

  題外話。
  這幾天,感覺好像爬了一座高山之後,突然就出現了一堵高牆,好不容易找到爬過那堵高牆的方法的時候,突然就掉了一顆大石頭擋住我的去路。
  就這樣,週而復始,好不容易有了這麼一點點的成就T_T


  對了,這段原始碼是採用創用CC的授權模式,要用的話記得把我的名字貼上去。
  還有,要做修改的話,請給我一份副本,而且麻煩請用同樣的授權方式公開,謝謝。

創用 CC 授權條款
float_to_int(double dFloatPoint,long l0Int_1float[2])Ethan製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 Unported 授權條款釋出。

沒有留言:

張貼留言

Google
Creative Commons License markscat的異想世界markscat製作,以創用CC 姓名標示-非商業性-相同方式分享 2.5 台灣 授權條款釋出。