C

A collection of 5 posts
C

func(void):C 與 C++ 函式宣告的小差異

最近編譯遇到一個錯誤訊息 warning: function declaration isn’t a prototype,程式碼大概是像這樣: hello.h 1 2 3 4 void foo() {     printf("Hello World!\n"); } hello.c 1 2 3 4 5 int main(int argc, char**argv) {     foo();     return0; } 這樣的程式碼應該再單純不過了,怎麼會說我的函式宣告(Declaration)並不為一個原型(Prototype)呢? 深入了解 ANSI C 才知道原來這與語言的發展史有關。 函式的宣告(Declaration)
4 min read
C

好的設計是取得適當的折衷 - C# 語言特色淺探

好的程式語言必須讓程序員專注在功能上的開發,而不是被程式語言給制約。這是我個人的感觸,使用 MFC 開發 UI 實在是太過痛苦了,常常得查線上文件 API 的使用方式,光是字體跟字串就可以搞得很複雜。我實在很不喜歡心至碼不至的感覺,所以下定決定轉換到 C#,來看看 C# 有什麼特別吸引我的功能: LINQ(Language-Integrated Query) (C# 3.0) 一般我們只能對資料庫下 SQL 的語法,但是 C# 中我們可以透過 SQL-like 的方式直接對 List, Array 等常用的 LINQ-enabled 資料結構直接做查詢取值的動作!功能很強大,使用起來卻毫無負擔! 1 2 3 4 5 6 int[] scores =[new](http://www.
4 min read
C

重新認識標頭檔(C/C++ Header Files)

讓我們來複習一下標頭檔的用途:對小型程式而言,基本上我們只需要把所有的原始檔一起編譯,就可以產生出所要的執行檔。但是如果到了大型的專案呢?很多程式勢必是朝向模組化並且講究可再使用性高的方向去設計。其中最關鍵的就是可再使用性(Reusability),但別人要怎重複使用這段程式呢? 首先,回想一下我們如果完全不使用標頭檔又要把一個程式切成好幾個原始檔完成,勢必得在各個原始檔前面加上必要的「事先宣告(Forware Declaration)」,這些東西對我們來說是相依性高的,因為這些事先宣告可能跟原始碼本身的實作沒有關係。所以為了可再使用性,我們把這些事先宣告都放進了標頭檔,如此一來,不論是動態函式庫或是靜態鏈結,我們都可以透過引用這個標頭檔而再用該函式庫。 但是也不是每種語言都有標頭檔的設計,例如 Java,就透過 package 的命名機制(有興趣可以詳讀這篇文章),避免歧義,讓編譯器可以直接找到所需要的 Symbol。 標頭檔的概念很容易理解,要照著做也只是把變數拉出去而已。那麼到底還有什麼值得寫出一篇文章的地方呢? 不要把標頭檔當垃圾桶 有些人可能會為了方
4 min read
C

序:平行化程式設計(多核心編程)

平行化程式設計會越來越重要的這件事情,我想也不必我多說(因為從很早就開始被提倡了),早在幾年前,大家就注意到單核心高頻率的 CPU 是不可行的,為什麼呢? 1. Power:當 CPU 的時脈頻率一直提高,所耗費的功率也會呈指數上升,為了省電,只好放棄了繼續提高時脈的想法。 2. ILP (Instruction-Level Parallelism):不是每道指令都可以拿來管線化的,所以時脈再高也無用武之地。 3. Memory Wall:當記憶體頻寬跟不上 CPU 處理速度時,時脈再高的 CPU 也只是增加閒置時間。 因此,就演變成現在大家所熟悉的多核心處理器,隨著硬體的進步,軟體當然也要配合才可以發揮最大的效能。這就是此篇文章的目的,從抽象的角度先跟大家分享平行程式設計所應該注意的,有什麼工具、函式庫可以用?接著,會開啟一系列的文章來討論相關的議題。 回到主題,在寫平行化程式的時候,基本上我們應該要注意幾點: 1. Scalability:寫程式的時候,你絕對不可以因為這只跑在你的雙核心電腦上,就只用兩個執行緒(舉例)
9 min read
C

駭客與畫家

節錄自此 駭客(Hacker)良好的壞習慣 對大眾媒體來說,「駭客」指的是某個入侵電腦的傢伙。在程式設計師心中,它卻代表著優秀的程式設計師。但是這兩種意義具有連結。對程式設計師來說,「**駭客」最主要的字面意義就是支配:一個隨心所欲操控電腦的人 **– 不論電腦想不想。 還可以更混亂一點。「駭」這個名詞也有兩種意義。它可以是讚美,也能是羞辱。當你用某種難看的方法來做事時,叫做駭。當你用很聰明的方法、顛覆原有系統時,也叫做駭。這個字通常是以前者的意思出現,而非後者,可能是因為難看的作法總比高明的作法還常見。 不論你相不相信,這兩種概念也一樣相互連結。難看和創意的確有共同點:打破規則。這兩種打破規則的作法之間,具有連續性的漸進過程,從一般的難看(改裝腳踏車)進步到非常有創造力(推翻歐幾里德幾何學)。 所謂的Computer Science 電腦科學,是一個許多不太相關的領域混雜在一起的歷史意外,就像南斯拉夫。 一個極端是真正的數學家,他們必需把工作稱作電腦科學,才能取得DARPA的補助。 中間是鑽研電腦博物學的學者,例如研究某種演算法是如何規畫資料在網路間傳
14 min read