pretty code

2009年3月20日 星期五

EasyRegCalc

這個程式是我來這家公司第一個寫出來的 tool
因為一開始的工作被分配到兩個較簡單的 driver
雖然兩個 component 的 register 都只有 16 bit
但覺得每次都拿筆來計算不是辦法
想了一下,覺得它有程式化的意義
於是這個工具便這樣誕生了

操作介面


支援 8 ~ 32 bit 的 register


這個程式困難的不是演算法
而是如何做出適當的 UI
尤其對於還在用 1024x768 的我更是一個挑戰
必須想辦法不要影響到看 Spec 的流暢度

陌生的寬字元

個人習慣 C 語言的簡單俐落
再加上之前使用的 GUI framework 底層還未考慮到 unicode 的問題
故我對寬字元的操作其實是很陌生的
上網查了一下相關資料



typedef unsigned short wchar_t;
typedef wchar_t WCHAR;

WCHAR windows獨有之型態
但 wchar_t 是 C 語言所支援的


#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif

const TCHAR* s = _T"test";
UINCODE
const WCHAR* s = L"test";
ASCII
const char* s = "test";

LPCTSTR是什麼?

L: Long
P: Pointer
C: Const

"long pointer to a constant generic string"
表示“一個指向一般字串常量的長指標類型”
就是之前看到的const TCHAR* (字串指標)。

// Unicode(WCHAR) to ANSI(char)
TCHAR *pUnicode = _T("你好");
int nIndex = WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, NULL, 0, NULL, NULL);
char *pAnsi = new char[nIndex+1];
WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, pAnsi, nIndex, NULL, NULL);
delete pAnsi;

「多位元組字元」 (mb, multi-byte character)
「多位元組字串」 (mbs, multi-byte string)
「寬字元字串」 (wcs, wide character string)

2009年3月19日 星期四

漲聲響起

昨天台股收盤價站上五千大關
但真的是落底了嗎?

如果說窒息量是可以受人為操作
那變數就變得更不可預期
但目前應該是連窒息量都談不上

蠻有趣的盤
記住這個時間點
等公司專案告一段落後
再來好好研究

2009年3月15日 星期日

修行的順序

忘了是在哪一集七龍珠看到的
孫悟空認為要提升自己的戰鬥力
應該要從基礎修行做起
這樣才是正確的捷徑

最近寫程式似乎遇到了瓶頸
看來是要思考一下
如何重新訓練程式的基本功力吧

2009年3月12日 星期四

傳說中的猜數字電腦版

以前一直不懂它的邏輯
終於在與 nb0 的奮鬥過程休息中把它搞懂

10*9*8*7 是有可能的數字組合
因為首位可以包含 0 ,故範圍從 0123 ~ 9876。
每次猜的過程,將所有組合與幾 A 幾 B 比對,去掉不符的組合。
逐漸篩選,直到猜出答案。

底下是電腦程式執行測試的結果:

Total 10000, Average 6, Max 10, Min 2.
Total 100000, Average 6, Max 10, Min 2.
Total 1000000, Average 6, Max 10, Min 2.

演算法上應該還有改進的空間,
需要加上額外的判斷才能減少 Max 10 的情況。

2009年3月2日 星期一

EasyBuild 的誕生

因為 CPU 的 BSP 不能使用精靈建立捷徑
再加上第一次使用此 CPU
常常要參考前人留下來的 code
故需要不同版本好來比較

本來是參考舊專案的檔案來為每個 source 建立捷徑好方便 build code
但覺得每次都要為不同的 source 建立捷徑很累
故想要寫一個工具可以藉由選擇 source 路徑
自動將批次檔所需的參數帶入
便有了這個工具的雛型

後來因為需要 build 不同版本的 image 來測試
故又加上 multi-build 的功能

個人習慣使用 global 產生的 html 來 trace code
每個 html 上面都會有該檔案的路徑
因為想要複製路徑便直接用 ultraedit 來打開檔案
故又加上監控剪貼簿的功能

有時候下班回家
想 build code 又不想等待其他人 commit
故又加上定時 svn update 並 build code 的功能

因為不想花時間在等待 AK 複製及 svn 下載檔案
故又把 multi-build 的功能分成直接 build 及
自動複製 AK 和 svn 完才 build code
到此這個程式才算是有一點工具的味道

不過最令我滿意的不是程式功能
而是在每一次的改版中
把很多函數再拆解成小函數
757 行的程式有 32 個函數
不含 event 等事件
且程式碼都有適當的空白及括號

故每次新增功能
其實都不用花很多心力
直接呼叫現有的函數即可
雖然不是做到 C++ 的物件化
但還算可重覆利用就是

最後來看個圖吧