2014年7月20日 星期日

C語言的函數指標(function pointer)的參數特性

  今天在解一個bug時在看相關的code,發現有個跟函數指標有關的地方我以為是一種bug,在與主管釐清了一些觀念後,把自己了解的觀念給記下來。

  函數指標(function pointer):就是一個指向函數的指標,指標必須先決定接收的參數資料型態回傳值這兩種東西,舉例來說,假設想宣告一個函數指標為fptr,而fptr的參數資料型態為float,回傳值為void,則我們必須這樣宣告它。
void (*fptr)(float);
要將fptr指向某個函數,只要將函數名稱給值給fptr即可。函數名稱事實上就是個常數指標(constant pointer),所存的內容就是該函數在記憶體中占據的記憶體位址的開頭。fptr所指向的函數,照正常所學的C語言教學,fptr所指向的函數必須也是參數資料型態為float,回傳值為void,不過事實上函數指標並非那麼嚴謹。下面用一段code舉三種例子來說明。

2014年7月10日 星期四

Linux kernel計時器-jiffies與do_gettimeofday()

  最近有個工作是一位資深部門同事在會議中提出他發現了一個疑似跟timestamp有關的bug,簡單介紹一下就是這個timestamp在source code的其他地方是以system time 做儲存,也就是現實時間,維基條目有詳細的介紹(System time),但是某個地方的卻存成jiffies。由於怕如ˊ果有timestamp被拿來做「比較」的時候會出現單位上不同的bug,需要觀察在source code中,這個timestamp會被拿來做什麼事,於是直屬主管就將這項工作將給我。這篇文章是要來記錄一下system time跟jiffies的差異。

2014年7月5日 星期六

重新理解張益唐博士的論文-任意相鄰兩個質數的上界

  美國籍華裔數學家張益唐博士在2013年4月17日《數學年刊》(Annals of Mathematics)發
表了一篇數學論文《Bounded gaps between primes》,撼動的數學界。定理結果用一個很漂亮的數學式子就能表達出來,定理敘述如下:

Theorem 1:
It is proved that
,
where pn is the n-th prime. 

  而台灣的新聞報導卻將這結果解釋成「任意相鄰質數必定不超過7000萬」(其中一篇新聞可以參考自由時報-張益唐的髮絲步 撞破數學質數牆),其實這是嚴重誤導。事實上,相鄰質數的相差要有多大,就有多大,其證明可以參考這篇文章-最近很紅的孿生質數猜想-中的「相鄰質數的距離可以多大?」段落。

  這篇文章只是想重新理解這個定理結果的真正意義,也就是「存在無限多組相鄰質數,其相差小於7000萬」。此外還能復習一下大學所學的mathematical analysis的邏輯推理。先來複習一下lim inf的定義。

遞增運算子i++與++i的差異

  今天在看一個bug的問題,發現一個for loop裡頭的遞增條件為++i。問了資深同事後才發現自己在這個小細節上沒有理解得很清楚,現在再來幫自己重新複習一遍。

  以C語言為例舉個例子。在宣告完一個int變數i=0,若想將它加1,則可使用i=i+1。我們能用更簡單的方法表示,表示法為i++或++i。

  i++與++i的差異是在回傳值的不同。同樣都是代表i=i+1,但是i++會回傳舊的i值,也就是0;++i會回傳新的值,也就是1。

  現在直接用程式碼來說明最清楚。我們用兩種不同的程式碼來說明。

多載(overloading)、重載(overriding)、多型(polymorphism)

一、多載(overloading)一個類別(class)中具有複數個相同名稱的函數(method)時,利用下列兩種方式判斷函數呼叫該載入哪個函數:
  1.參數(argument)的型態(type)不同
  例:
    function foo(char c){code statements;}
    function foo(int num){code statements;}
  2.參數載入數量不同(包含0個)
  例:
    function foo(int a){code statements;}
    function foo(int a,int b){code statements;}