Category Archives: C/C++

你沒遇過的編譯器鬼打牆,許功蓋問題

我想在前面的文章裡很多人可能都沒遇過所謂的鬼打牆,大學四年中我遇到最多鬼打牆的狀況全是Dev C++引起的,其實如果都一一記下來應該是個很長的列表,只是問題解決通常我自己也忘記了,其中一個我印相最深刻的鬼打牆問題不是由Dev C++引起的,而是Visual C++ 6.0引起的,程式碼大略像這樣 class SocketHandler { // 此函數會被呼叫以通知連線成功 void onConnectionSuccess(); }; void SocketHandler::onConnectionSuccess() { // some code here } 這是我自己寫的一個socket連線程式,不管怎麼試,編譯器總會跟我抱怨它不認識onConnectionSuccess這個函數,從表面上看起來程式也沒有任何問題,所以問題到底出在哪裡? 答案是許功蓋問題,看到了嗎? 註解的最後一個字是”功”,而我們知道”功”在 big5 其中最後一個字元是 “/”,且VC6不懂得unicode,它會以ASCII的方式來處理程式碼,所以程式碼就變成 // 此函數會被呼叫以通知連線成 void onConnectionSuccess(); 如此一來,註解就被延伸到了下一行,onConnectionSuccess的宣告就因為這樣被忽視掉了,為了找到這個問題,我重讀了好多次程式碼,都找不到任何缺陷,一整天的時間就花在這個上面 這個故事告訴我們什麼? 從此之後我就強迫自己改用英文寫註解,我想沒有多少人有機會遇到這問題,而誰也想不到註解也會造成程式的編譯問題,這個故事告訴我們,工具的好壞遠比你想像重要,不要以為這種缺陷沒什麼,事實上是那些缺陷可以讓你debug一整天都找不到原因,除了你的工作時間浪費了,學習的時間更是浪費在其中,更慘的是還帶來了嚴重的挫折感,再一次,工欲善其事,必先利其器,學習更是如此

Posted in C/C++, 中文文章 | 5 Comments

99乘法表C++ Meta Programming版

前些日子有人在PTT C++版問了99乘法表相關的問題,於是我手癢就寫了一個C++ Meta-Programming的版本,沒用真正寫過Meta-Programming,因為感覺上實在是太炫技了,像是帕格尼尼的炫技曲似的,如果inline最佳化都成功的話,應該是會整個被展開來,用的是編譯時間來換效能,因為和一般的程式寫法和思考方式都不太一樣,所以這樣的東西還是盡量別亂用的好,不然別人通常都難以維護,所以這只是純寫好玩的 如果你在修C++的課,剛好遇到99乘法表的作業,或許你可以把這拿去交,看助教看了會有什麼反應 XD 以下是程式碼 #include using namespace std; inline void printLine(int i, int j) { cout

Posted in C/C++, 中文文章 | Tagged , | 5 Comments

Python使用HGE引擎

大家肯定都知道在Python下面寫2D遊戲有個眾所階知的選擇就是pygame,雖然它簡單好寫,對於簡單的遊戲來說已經足夠,但是他有一個致命的缺點,就是速度太慢了,在pygame的背後是SDL,用純軟體畫圖的函式庫,既然為純軟體繪圖,遇上旋轉、半透明等等需求,更顯得吃力和不切實際,所以該怎麼辦才好呢? 答案是用Haaf’s Game Engine,它是一款用DirectX做為backend的Open source遊戲函式庫,我在先前的文章裡已經有做簡單的介紹,就不再重覆,那這函式庫和Python又有什麼關聯呢? 他是用C++寫的,Python沒辦法用,正因為這樣,我一直一來想幫他寫一個python的binding,我一直想如果Python也能用HGE寫起來一定很開心,我試著找了一下有沒有已經存在這樣的專案,有找到一個,但是居然是在萬惡的GNU授權下的,讓我百思不得其解,那專案的作者到底在想什麼? 想讓大家寫Open source的Game嗎? 我們都知道GNU是大名頂頂的病毒授權,任何程式使用了用GNU的函式庫都會被感染,代表你的主程式一樣得變成GNU的開源授權,我個人非常討厭打著自由名義但是卻有強烈的強迫性質的GNU授權,況且HGE的授權是非常寬鬆的 zlib/libpng License,實在想不透為什麼一個binding可以用超嚴格的GNU,不過那是那作者的自由,我也管不著,在不能接受那惡心的授權,加上我看了一下他的專案似乎好像也沒有很完整的進度,於是我還是決定自己開了一個新的專案 Python HGE 在這樣的情況下,我前些天抽空開了一個新的Open source專案: Python-HGE,把一些最核心的程式碼都用boost.python包裝給Python使用,最核心的部份完成度很高,剩下的需要我在未來有空慢慢補上,License是MIT,如果你問我為什麼選MIT,我想答案應該是商業用途一樣也可以,不像GNU那種假腥腥的自由,還有一個重點就是,我覺得麻省理工這名字聽起來很酷,讓我想起每次在Discovery看到的東西 效能問題 我照著原本HGE的Tutorial7的程式寫了一個Python的版本,這個範例的目的就是在展示HGE的效能,純C++的版本速度當然是很快,而Python的版本FPS掉了不少,一開始讓我覺得有點失望,讓我開始懷疑如果效能掉很多的話,那用Python寫HGE還有價值嗎? 後來仔細思考了一下,對於一般的2D遊戲來說,要像這demo整畫面跑來跑去的圖片加透明效果的情況實在不多,就算有也很難到這樣上千張的圖片,再者我都還沒進行最佳化、跑profile等等,而且雖說FPS掉不少,但是那是和C++數百的FPS比起來,在60以上其實都是可以接受的,加上我測試的這台電腦已經有點年代,對現代的電腦和GUP來說情況只會更好,在如此的考量之下,Python HGE還是有搞頭的 python版的tutorial 7截圖 這個demo可以在這裡下載 目前狀況 目前雖然核心部份已經高度完成,不過我還沒有把編出來的pyd釋放的打算,如果想嘗鮮的話可以直接從那個demo裡面找pyd出來用,又或著自己check out原始碼進行編譯 參與開發 如果有興趣的話,歡迎參與專案的開發,如同我上面所提到的,我用的是boost.python,一款基於C++的python binding函式庫,如果你熟悉boost.python的話當然是最好,就算沒有也沒關系,因為其實大部份工作都是剪下貼上之類的,可以參考我已經寫好的部份,有些函數回傳例如指標之類的東西需要特別處理,除此之外都只是很簡單無腦工作

Posted in C/C++, Python, 中文文章, 分享, 設計, 遊戲設計 | Tagged , , , , , , , , , | 4 Comments

VC++ 9.0的編譯器鬼打牆錯誤

VC++ 9.0的編譯器鬼打牆錯誤 : 這個時候不應有 的原因和解決方法 Continue reading

Posted in C/C++, 中文文章, 分享 | Tagged , , , | Comments Off on VC++ 9.0的編譯器鬼打牆錯誤

Google Unit Test Framework試玩

介紹Unit Test和 測試驅動開發 (Test-driven development),以及Google Unit Test Framework的試玩心得 Continue reading

Posted in C/C++, 中文文章, 分享 | Tagged , , , , | 7 Comments

Google C++ 程式風格指南

介紹Google的 C++ 程式風格指南 Continue reading

Posted in C/C++, 中文文章, 分享 | Tagged , , , , , | Comments Off on Google C++ 程式風格指南

HGE project wizard template for Code::Blocks

HGE project wizard template for Code::Blocks Continue reading

Posted in C/C++, English Articles, 分享, 遊戲 | Tagged , , , , , | 2 Comments

Code::Blocks的HGE專案樣版

為了能方便開新專案寫HGE的程式,我特地研究了一下如何製作Code::Blocks的Wizard template Continue reading

Posted in C/C++, 中文文章, 分享, 遊戲設計 | Tagged , | 2 Comments

簡易Compiler(其實是Interpreter) : Micro 實作

昨天 花了一個晚上的時間把Compiler作業Micro直譯器寫出來了,為啥說它是直譯器,因為光寫文法解析實在很無聊,它的語法又太簡單,反正讓它能執行也多沒幾行程式,就順手讓它可以直接執行,還蠻有趣的,第一次寫比較正規的語法解析器,我想起很久很久以前我寫過一個滑鼠鍵盤的巨集程式 就有解析自創的簡單語法,可是方法實在很暴力很蠢 XD,用了一些五四三的方法硬湊出來,現在我寫完這個作業覺得scanner和parser這樣才是比較正規的做法,我還用了Interpreter Pattern來實作 Micro 課本上的Micro語言實在有點簡單過頭了,只有輸入、輸出、運算而已,運算也只有加和減,本來想修改的,可是又要設計BNF和考慮運算優先順序等等麻煩的問題就打消念頭,只寫了兩個簡單的程式 begin read (a, b, c); sum := a + b + c; write (sum); end begin read (f1, f2); f3 := f1 + f2; f4 := f2 + f3; f5 := f3 + … Continue reading

Posted in C/C++, 中文文章, 分享 | Tagged , , | 7 Comments

不守標準出了名的M$

問題 今天有人問了這樣一個問題,如何不讓scanf取得指定長度後剩下的字元,被下一個scanf取得 解法 首先我想到的是scanf一個字串,可是如果字串長度剛好,就會造成要再輸入一次,於是我又想到了fflush來清空stdin的緩衝區,查了MSDN,也寫了一個小程式來測試,果然可行,但是…

Posted in C/C++, 中文文章 | Tagged , , , , | 2 Comments