2008年9月30日 星期二

取得圓周率值

math library提供了許多常見的數學運算函式,其中也包括三角函數。然而對於圓周率(pi)值並沒有常數的定義,我們可以利用反三角函數來取得pi值:

圓周率 = 4 * atan(1)

在數學運算中,我們比較熟悉的是夾角的角度,而math library的三角函數回傳值皆以弧度(radian),所以我們可以自行定義一個常數來轉換。

#define RADIAN_TO_DEGREE (180 / (4 * atan(1)))

2008年9月29日 星期一

ldd

ldd可以用來顯示每個程式所使用到的shared library。ldd其實是一個shell script而不是執行檔。

在linux,我們可以將程式編譯成靜態連結或是動態連結,在這以hello.c來解釋。

#include 
int main(void) {
printf("Hello world!\n");
return 0;
}


用gcc編譯
# gcc hello.c -o hello
則會產生hello的執行檔,而其預設是使用動態連結的方式:

用file指令來檢視其屬性
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

用ldd來檢視共用了哪些shared library
# ldd hello
linux-gate.so.1 => (0xb7f6a000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dfd000)
/lib/ld-linux.so.2 (0xb7f6b000)

此外,此檔案的大小為
# ls -l hello
-rwxr-xr-x 1 howard howard 6256 2008-09-30 00:00 hello

上述為程式使用動態連結,我們也可以將程式編譯成靜態連結:
# gcc -static hello.c -o hello

用file來檢視,可以看到顯示為靜態連結
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.8, not stripped

用ldd來檢視,自然沒使用到任何shared library
# ldd hello
not a dynamic executable

再來檢視檔案的大小
# ls -l hello
-rwxr-xr-x 1 howard howard 564881 2008-09-30 00:07 hello

我們可以看到檔案大小為564881 Bytes,相對於之前用動態連結只用了6256 Bytes,足足大上快一百倍。可見使用動態連結能大大節省空間。

2008年9月28日 星期日

Linux Library

Program library指的就是包含已編譯好的程式碼和資料,可以拿來被其它程式來運作。可以依程式與library結合的時間將library分成三類:

  • static library:
這些library必須先和程式結合成為執行檔,才能執行。static library其實就是一堆object file集合在一起,以.a為副檔名。
  • shared library:
在程式啟始時,這些library才被載入。library和執行檔是分開的,以.so為副檔名。
  • dynamically loaded library:
可以在程式執行的任何時間內載入這些library,就像Windows下的DLL。

2008年9月27日 星期六

願者上鉤

姜太公釣魚,願者上鉤。

今天是第二次和朋友們一塊去釣蝦,但與其說我去釣蝦,不如說是陪釣員,因為我不吃蝦子,所以我甚至希望朋友們釣到可以把他們放生回去,不過看來遊說是失敗的。
自從有了上次很悲慘的經驗,就是兩支釣竿共三小時竟然只釣到了三隻蝦子,就覺得釣蝦還真是需要一些技術阿,蝦子們看起來是會上鉤,但吃到了餌就跑了。

由於我在釣蝦場無所事事,只好來幫他們記錄第一隻釣到的蝦子。




不過,今天在釣蝦場遇到了一個阿伯,他非常的熱心的傳授他的釣蝦經驗給阿佑。結果阿,這次釣的量大約就十五、六隻左右,遠大於上次的三隻。


果然姜太公的釣法在現實生活是行不通的

2008年9月25日 星期四

三聚氰胺

毒奶粉事件愈演愈烈,主要的原兇就是三聚氰胺。那就來對三聚氰胺做個簡介:
摘錄自衛生署網站

三聚氰胺(Melamine):
它是一種白色化工原料,無味、略溶於水,可溶於酒精、甲醇,常用於製告美耐皿餐具、建材、塗料,具毒性,不可添加於食品。

對人體的危害:
經腸胃吸收後,可能於腎臟中結合沈積,形成腎結石,嚴重者會造成腎臟功能受損;這種現象較易發生在腎臟尚未發育完全的嬰幼兒。

不肖廠商為什麼要在奶粉中添加三聚氰胺?
奶粉主要以蛋白質含量高低為品級分類,為通過奶粉中蛋白質含量檢測,不肖廠商才加入三聚氰胺。

macro與inline差異

C99標準新增了inline function的定義,標準說:「Making a function an inline function suggests that calls to the function be as fast as possible.」其中由suggest一詞就可以知道實際的運作要看compiler如何實作,也許真的會讓function的呼叫變快,也可能什麼事都沒發生。

而macro與inline的差異:

  • macro是由preprocessor處理,由inline則是compiler來負責
  • macro對於檢查傳入參數的型別,而inline則會檢查型別

假設定義平方的巨集如下:
#define SQUARE(x) x * x
若執行
SQUARE(3+2);
則答案並不會預期印出25,而是11,因為macro只是當純的文字替換,所以式子將會變成:
3 + 2 * 3 + 2

因此,正確安全的寫法如下:
#define SQUARE(x) ((x) * (x))
而inline的寫法就和一般的function寫法一樣:
inline int square(int x) {
return x * x;
}