2008年4月10日 星期四
緩緩‧腳步
最近很繁忙,滿多事,直到春假完一兩天,才放鬆一會,但緊接著又是期中考了!心態上不一會兒又落到上學期末的心境,彷彿忙完後會為自己做的感到空虛?!我想我還沒調適好生活比例,這大概是物極必反的心態吧。
今天我跑去逛逛以前實驗室的網站,發現論壇區有大學專題教授分享研究心情,看啊看啊,不一會兒又反省了一下自己,擔心再這樣下去,自己會越來越接近瞎忙。並不是替老師做事學不到東西,只是總覺得好像是在別人的想法中過生活?這是翅膀硬了的現象嗎?不過,我倒還滿臣服於老師的,實在是老師太聰明太強大!比知識理當輸,但比實作更是輸到脫褲子!上學期曾經跟學長閒聊,覺得自己的主管一定要比我還要強,不然自己無法接受對方的領導,但我跟兩位學長聊過這些,他們一同表示,社會是一點一滴地搭建,每個人都有各自的方向與能力,搭配起來才會越變越好,如果只是持著這樣的心態,反而無法合作。這是簡單的道理,我也非常清楚,但很神奇的是自己有時很難接受,彷彿一起合作時,除了擔心自己的工作外,又怕夥伴不做事吧!
生活越變越好,偶爾也該善待一下自己囉!
2008年4月8日 星期二
[C] qsort - compare function
好弱 摸很久還不是很懂 囧 最後 google 紀錄一下
突然想起第一次監考時 有學弟還問我怎樣 call qsort
大學還真的沒用過 倒是寫了幾次 qsort
資料來源 http://mail.lssh.tp.edu.tw/~hlf/class-1/lang-c/qsort.htm
void qsort( void* base, size_t n, size_t size, int (*cmp)(const void*, const void*) )
陣列基礎的快速排序法函數,陣列是參數 base,n 是陣列大小,size 是每個
元素的大小,最後的參數是指向函數的指標,這是比較元素大小的函數( 即上面
compare() 函數)。
其實最重要的是 compare 該怎樣寫, 以 sorting 一個 int array[Num] 來說
呼叫
qsort( (void*) array , Num , sizeof( int ) , compareInt );
定義
int compareInt(const void *a, const void *b)
{
int c = *(int *)a;
int d = *(int *)b;
if(c < d) //傳回 -1 代表 a < b
return -1;
else if (c == d) //傳回 0 代表 a = b
return 0;
return 1; //傳回 1 代表 a>b
}
上面寫得很淺顯易懂 程式碼的重點擺在 readability
接著就是對一個 char * array[Num] 來說
這是我常常一時之間摸不透的東西 Orz
呼叫
qsort( (void*) array , Num , sizeof( char* ) , compareString );
定義
int compareString(const void *a, const void *b)
{
return strcmp(*(char **)a, *(char **)b);
}
2008年4月1日 星期二
從 Java 到 C 的嚴重使用錯誤
這陣子寫了一堆 C 的 func 搞了一點 point 的東東
其中有件事讓我印象很深 特別記一下
由於前一次開發較大型的系統是使用 Java
我在 Java 上習慣設計一些很方便的 function 在此以數字加減運算當做例子
String getValueByI( int x ); // 傳入整數 轉換成字串回傳
int getValueByS( String s ); // 傳入字串 轉換成整數回傳
如此 我可以使用
String result = getValueByI( getValueByS( "5566" ) + 7788 );
這樣我可以方便地做數字跟字串的轉換和運算 結果我在 C 這邊使用:
uchar* getValueByI( int x );
int getValueByS( uchar* s );
使用:
uchar * result = getValueByI( getValueByS( "5566" ) + 7788 );
其實看上面一次好像沒什麼錯 來跑個迴圈吧
uchar* getValueByI( int x ){
uchar* tmp;
tmp = malloc( sizeof(uchar) * 10 );
sprintf( tmp , "%d" , x );
tmp[9] = '\0';
return tmp;
}
int main(){
uchar* result, *tmp;
while( 1 ){
if( tmp == NULL )
result = getValueByI( getValueByS( "5566" ) + 7788 );
else
result = getValueByI( getValueByS( tmp ) + 7788 );
tmp = result;
}
return 0;
}
如此一來 tmp 之前所指的空間 會一直忘記 free 掉
只是不斷地接另一個新的空間
出錯的問題很簡單 那就是我在 getValueByI 裡進行 malloc 來回傳出來
這個用法我覺得很直觀 但其實 C 並沒有 Java 的 garbage collection
所以更正確的用法是用完必須 free 掉 特別是開發給 Server 用的
結果我一連寫了10個 function 都是這種 style 囧rz
這下不知要改多少啊 XD
2008年3月15日 星期六
單位換算:長度、容量、重量、面積
http://www.mold.net.tw/classroom/unit.htm
提供:
長 度 單 位 換 算
容 量 單 位 換 算
重 量 單 位 換 算
面 積 單 位 換 算 (這個最有用XD)
其實,我什麼也不缺
我想,我可以開始新的旅程了。此刻的心情,我一定要記上一萬年。將離幸福越來越近的……