2009年2月14日 星期六

Initialize Array

雖然說用平常建議使用initializer來初使化變數,但是如果遇到初使化一個很大的array的話,還是建議使用別的方法來初使化。讓我們來看一下底下的code:
int main(){
int arr[10] = {0};
// ...
return 0;
}
看起來沒什麼問題,但是如果我們再把array size從10改成1,000或是1,000,000或是更大,然後看一下compile出來的binary的大小,你就會發現大小差超多的! 雖然說平時沒事不太有機會宣告一個這麼大的array,不過如果真的遇到了,而binary的大小又是你的concern之一的話,建議改用下面的初使化方法,一是使用迴圈:
int main(){
int arr[1000000];
int i;
for( i=0; i<1000000; ++i )
arr[i] = 0;
return 0;
}
二是使用memset:
#include <cstring>
int main(){
int arr[1000000];
memset( arr, 0, sizeof(int)*1000000 );
return 0;
}
還是要再次提醒,畢竟這種狀況應該滿少的,平時的其他變數還是建議使用initializer。

2009年2月11日 星期三

Do NOT Extern an Inline Function

如果你在 a.cpp 裡宣告了
inline foo();
在b.cpp中,請不要使用extern,eg.
extern foo();
void bar() {
foo();
}
雖然在gcc/g++ compile會過,但是在其他compiler可能會fail。
這是因為inline function在compile時會embed進code裡,所以link的時候理論上會找不到這個symbol。
建議將function 寫在header中,使用include header的方法,eg.
#include"a.h"
比較好。

2009年2月9日 星期一

coding style 可以看作者的個性

最近寫code時,因為希望quality好一點,所以對很多parameter input & function return會做檢查,結果程式碼裡面就出現好多
if( false == func() ) {
// print error msg
return false;
}
之類的code,或是一堆 assert(a==b)之類的 ...
感覺好像矯枉過正?

寫程式果然是藝術,還可以看一個人的個性...
看得出來我的安全感很低 Orz

2009年1月20日 星期二

vim的plugin初體驗 ─ supertab.vim

如果你有用過一些IDE(Integrated development environment,就是可以輔助編輯程式並compile的軟體),例如visual studio系列、dev c++,或者eclipse,那麼在寫程式的時候應該很熟析一個功能:當function或variable的名字太長,我們常常會打幾個字之後按下tab鍵(通常在Q的右邊左邊),然後它就會幫我們自動完成,或是列出可選的清單。

vim其實也有自動完成的功能。你可以在vim中
:h ins-completion
查看相關操作。不過,看起來還滿複雜的。沒關係,vim的網站上有人提供了方便的plugin,可以簡單地按個tab就達到自動完成的功能。這個plugin叫做supertab。底下就教你怎麼安裝這個plugin。

首先,要先下載supertab的檔案,還記得wget嗎?以寫本文的時間為例,目前supertab出到0.48版,所以我們可以
% wget http://www.vim.org/scripts/download_script.php?src_id=9837
來下載,然後就可以在home directory底下發現supertab.vim的蹤跡囉!接下來要將他移到正確的位置才能發揮作用。vim的plugin都是放在.vim/plugin/資料夾底下的,首先先用ls檢查看看.vim/plugin在不在,不存在的話就用mkdir建立,然後再將supertab.vim mv進去。
% ls .vim/plugin
% mkdir -p .vim/plugin
% mv supertab.vim .vim/plugin/
這樣就安裝完成啦!!很簡單吧! 趕快來測試看看吧。首先我們來寫一個簡單的程式:
int main()
{
int thisIsVarWithLongName = 0;
return 0;
}
接下來,當我們要對thisIsVarWithLongName做運算時,你可以打thisIs然後開心地按下tab鍵,你就會發現它自動幫你完成了!! 如果有超過兩個字是thisIs開頭的話,他還會有清單列出來讓你可以上下選咧!只要移動上下鍵或是繼續按tab鍵就可以選擇啦。

如果選單的顏色不喜歡的話,可以把底下貼進你的~/.vimrc,就可以改變選單的顏色啦。("開頭表示被註解掉)
"hi Pmenu        term=standout   cterm=reverse   ctermfg=Magenta
hi PmenuSel term=bold cterm=bold ctermfg=Blue ctermbg=White
"hi PmenuSbar term=standout cterm=bold ctermfg=White ctermbg=White
hi PmenuThumb term=bold cterm=bold ctermbg=Blue
怎麼加阿... 用vim加囉,我必須承認我自己提供的這組配色也很難看,不過算是給個範例,大家可以自己嘗試其他的配色,找到自己順眼的。

其實關於自動完成,還有更好用的套件,叫做OmniCppComplete,在我拖稿到介紹這個東西如何安裝使用前,不妨自己先玩玩看它吧 :)

2009年1月18日 星期日

if condition

在寫if condition或是其他一些condition時,一般人習慣的寫法是:
if(a==0) {
// do something
}
通常是左手邊變數,右手邊常數。不過寫C/C++最常犯的bug之一,就是相等比較的2個=常常會不小心少寫一個=寫成assignment的一個等於。如下
if(a=0) {
// do something
}
這可是差很多的! 由於在語法上完全合法,所以並不會有compile error。有些compiler會吐warning出來,但是有些不會。忽略這個錯誤將會造成debug時的痛苦...

下面的coding小技巧可以幫助避免這樣的事情發生,我們只要將上面那段code改成
if(0==a) {
// do something
}
將左右手邊對調,左手邊是常數,右手邊是變數,這樣不小心寫成一個=時,一定會有compile error被report。雖然這樣寫剛開始會很不習慣就是了。
另一個好處就是,常數通常都很短,但變數命名通常都較長,這樣寫會有另一種alignment的美感,可以試著體會看看 :)