字體:小 中 大 | |
|
|||||||||
2011/09/09 14:40:33瀏覽1528|回應1|推薦3 | |||||||||
我說過,我現在正在做自己的專案;因為這個案子,需要寫程式以及硬體上的製作,所以會有一些衍生物出來。像是原始程式碼或是電路圖等等。 又沒有其他地方可以貼,所以只好貼在這邊了…… 這些衍生物我先歸類在『工程師的美麗與哀愁』之下,如果數量夠多的話,我會新開一個分類。 自訂函數 float_to_int(double dFloatPoint,long l0Int_1float[2]) -與其說是將浮點數轉換成整數,倒不如說是將浮點數轉換成『長整數陣列』。 -概念 因為目前手邊不管是OLED的RIT128x96x4StringDraw()還是UARTprintf(),只接受『字串』以及整數 所以必須做一些很複雜的轉換。 RIT128x96x4StringDraw()這個函數只接受『字串』,所以必須將整數轉換成字串。 這個功能用utils/ustdlib.h中的usprintf()就可以完成。但是usprintf()並不接受浮點數。 相同的,UARTprintf()也只接受整數。 為了這個原因,必須自訂一個函數來做轉換。將浮點數拆解成為兩個整數。 -輸入參數
-方法 整數部份: 就……直接做型態轉換,將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的授權模式,要用的話記得把我的名字貼上去。 還有,要做修改的話,請給我一份副本,而且麻煩請用同樣的授權方式公開,謝謝。 float_to_int(double dFloatPoint,long l0Int_1float[2])由Ethan製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 Unported 授權條款釋出。 |
|||||||||
( 創作|其他 ) |