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)

其實,我什麼也不缺

打開窗,調整空氣最通暢的方式,泡杯冷茶,儘管外頭的陽光不明媚,但心的激昂卻尾隨著指尖向鍵盤敲打,其實,我不缺什麼,只是太貪心……,恰當的距離、合適的自己,真的很近很近,看著情侶卻早已拾著愛情,啊。

我想,我可以開始新的旅程了。此刻的心情,我一定要記上一萬年。將離幸福越來越近的……

2008年3月14日 星期五

啊,情人節

今天是白色情人節,昨天 lab 的學長還問我03/14是不是情人節,哈,然後跟我抱怨怎麼一年有那麼多個節日!那位學長是已結婚生子的,最近幾次跟他接觸,鐵漢柔情,亦著實地從他身上學到不少東西。至於今天給自己的禮物呢?正是一雙藍色拖鞋!我好像大學還沒穿過藍色耶!現在來體驗體驗,藍白行天下!

傍晚時,透過 Kudo 的關係,我聯絡到一位國中認識的網友,說網友還滿貼切,因為生活鮮少交集。這位哩,是位女生。若以當年東拉西扯的關係,就暫時稱她徒孫吧!在我認識的網友中,算是有過最接近的碰面。

跟徒孫的關係,扣除男女朋友外,算是與異性網友最接近的關係。記得高中某年寒假,我跟 Kudo 還到她家走走,挺不賴的,我喜歡鄉村給我的貼近感,記得那時是搭臺西客運吧?說真的,在這之前我可沒搭過,也算是新奇的經驗,然後到她家的芭樂園走走逛逛,記得那時她還叫我摘幾個芭樂送給女友,因為過幾天就是02/14情人節啦,現在回想起來,印象特別深。

與網友的相識相聚,全都落在國三時期,因為可以直升高中部,沒有聯考的壓力。當時恰逢 BBS 的初期,搭著校風男女關係,就在 BBS 認識了不少男女,當然,女生是多了很多。只不過認真算起來,比較會聊的還是那一群,若要定一個聊天內容的話,我只能說完全是「少年不識愁滋味,為賦新詞強說愁」!現在回想起來,有頗有玩意,但不知是不是那時代的經歷,現在,倒比較不會想挖別人的隱私,想起來啊,以前真是苦了小馬,國中時一直被我挖挖挖,囧rz