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的美感,可以試著體會看看 :)

2008年11月27日 星期四

安裝Vim 7

要在工作站上寫程式的話,首先必須要有一個文字編輯器,在工作站上有許多編輯器可以選擇,文字介面常用的有vim或joe,而GUI介面常用的有emacs、kwriter、gedit,還有許多我沒用過的editor,當然身邊也有許多人是用Ultraedit連上工作站編寫程式。這篇主要要介紹vim,因為它的功能實在太過強大了,對於發展程式的人來講,可以很方便的trace code跟編寫程式。當然,寫程式如果使用IDE(Integrated Development Environment)來寫,會更方便,但是vim好處就是,他是文字介面,所以處理起來會比GUI快速,而且他的plugin很多。只是缺點是上手比較慢。不要怕,小風風就是要幫你上手vim,告訴你用vim寫程式到底有多方便!

大部分的工作站上,都已經有安裝好的vim,不過大部分都是6.X版的,由於vim第7版已經推出了(寫此文時已經7.2版),所以我想推薦大家使用新的版本,最主要是有tab page的功能,我覺得很好用。這篇文章就是教你如何安裝最新版的vim,主要是教你如何安裝在Unix的機器上。

首先請到vim的官方網站下載最新版的source檔,目前的版本是7.2版。你可以先下載下來,再用ftp(or sftp)傳上去工作站,如果你使用pietty的話,你可以把下載好的檔案拉進pietty的視窗,就可以上傳到你的home。如果你直接從工作站上下載vim,你可以打底下的指令進行下載:
% wget ftp://ftp.vim.org/pub/vim/unix/vim-7.2.tar.bz2
此處以7.2版的下載為例,前面的%prompt%之後的文字才是你需要輸入的指令。
通常我習慣將下載下來的安裝檔放到一個資料夾裡。在這裡我們使用package這個資料夾,如下指令:
% mkdir package
% mv vim-7.2.tar.bz2 package
% cd package
先建立package這個資料夾,再將剛剛下載下來的vim-7.2.tar.bz2移到package資料夾中。然後切換資料夾到package。進入資料夾後,我們就可以將剛下載下來的檔案解壓縮:
% tar jxf vim-7.2.tar.bz2
% ls
% cd vim72
先將剛下載的vim-7.2.tar.bz2解壓縮。解開後用ls可以看到多了一個vim72的資料夾,就可以進入vim72資料夾準備compile然後install。

在安裝之前要注意一點,如果你想要讓編譯出來的程式可以在32bit的機器跟64-bit的機器上都能跑,最好是在32bit的機器上compile,這樣通常64bit的機器也可以跑;但是64bit上compile的程式32bit上就不能跑了。然後你要決定要將程式安裝在哪裡,由於我們是以user的名義安裝個人要使用的程式,所以通常是安裝在自己的home底下。我會建議在home底下建一個資料夾,可以命名成usr(跟linux的root(/)底下安裝tool的資料夾名稱一樣),或是取自己喜歡如tools之類的,底下就以安裝在自己的home底下的usr為例操作:
% mkdir ~/usr
先在home(~)底下建立一個usr的資料夾,然後我們在vim72的資料夾底下先做config:
% ./configure --prefix=$HOME/usr
如果確認config之後沒有error,就可以開始compile(build)程式:
% make
compile如果也沒有問題,就可以安裝啦:
% make install
安裝完後,就可以看到~/usr/bin/底下已經有安裝好的vim啦:
% ls ~/usr/bin
但是這個時候你用的vim仍然是OS原先裝好的vim,不信你輸入下面的指令試試看:
% which vim
會出現/usr/bin/vim之類的路徑,而不是類似~/usr/bin/vim之類的(通常應該會顯示完整路徑,例如我的就是/home/starsky/usr/bin/vim)。為了要讓工作站知道我下vim的指令時,他要到哪裡去找vim的程式來執行,我們必須要修改一下shell的rc檔,如果你是使用bash的話,請修改~/.bashrc這個檔案(怎麼修改...,這是個好問題,用文字編輯器吧 XD),加入底下這行(如果不知道要加在哪裡,就加在最後面吧):
export PATH=$HOME/usr/bin:$PATH
之後如果想再加入其他path,用:分隔開就好了。如果是tcsh的話,就修改~/.cshrc,加入底下這行:
set path = ( $HOME/usr/bin $path )
用空白分隔每個路徑。修改完存檔後,重新登入就可以了!如果不想重新登入可以用:
% source ~/.bashrc

% source ~/.cshrc
(看你用哪一種shell),就可以了!現在,再which vim一次試試看,應該會顯示路徑為~/usr/bin/vim了,而如果你下底下的指令:
% vim --version
應該會看到你現在用的vim是version7.2的了!

那麼,關於(不是官榆XD)vim7的安裝就先講到這裡啦~,接下來會慢慢讓你覺得vim好用的!
(以我目前寫文的速度來看,會很慢很慢Orz,這篇的前一篇,都還沒寫出來的說....)

2008年11月26日 星期三

Linux指令略解

寫別篇文章的時候發現,如果我把看的人都定位在只會cd跟ls的話,我每個指令提到時都要先解釋指令才能說在幹麻,未免太過冗長且目標模糊。所以決定全部搬到這篇來寫,根據我寫文時的需求,有提到的指令會在這篇文章中更新。由於這不是重點,詳細的用法都可以用man去查詢,例如要查詢ls這個指令,只要寫
% man ls
就可以查到ls的詳細用法,所以只有概略寫每個指令的用途。

  • cd是change directory,就是進入某個資料夾。例如
    % cd someDir
  • ls是list的意思,列出資料夾的檔案。常用參數-l來列出檔案更詳細的資料。例如
    % ls
    % ls -l
    % ls someDir

  • mkdir是make directory的意思,就是建立資料夾。例如
    % mkdir aDir
  • mv是move,將檔案或資料夾移到另一個資料夾。例如
    % mv fromFileDir toDir
  • path: 在下指令寫路徑時,有幾個特殊路徑要特別注意。.是代表現在所在的資料夾,即本層資料夾;..是代表上一層資料夾;~是代表home directory,就是你的家目錄,一登入時就在~底下。
  • prompt: [prompt]%是工作站中用來提示你輸入的提示詞,例如在bash常常長得像這樣:[username@machine path]$,文章中我都將prompt簡略成%符號。%之後的文字才是你需要輸入的指令。
  • tar是一個將檔案打包跟解開的指令,他可以跟gzip or bzip2一起運作,將打包後的檔案壓縮或解壓縮。參數j是將檔案用bzip2壓縮/解壓縮;z是將檔案用gzip壓縮/解壓縮;x是extract,解開之意;c是archive,將檔案打包;f是file,打包/解成檔案;v是verbose,顯示資訊。如果要用gzip壓縮打包一個資料夾成為tgz檔(或tar.gz),可以用以下指令
    % tar zcfv xxx.tgz dirToTar
    如果要解壓縮一個tgz(or tar.gz)檔,可以用以下指令
    % tar zxfv xxx.tgz
  • wget是一個從網路上下載資料的指令。
  • which是用來查看某個指令(的程式)是存放在哪裡,或者是什麼的alias。