彙整

Archive for 2011 年 01 月

[轉載] TortoiseSVN 使用簡介

一月 18, 2011 發表迴響

TortoiseSVN 是一套給Windows使用者方便使用SVN Client與Local Host SVN Repository的管理軟體。
由於其簡潔的GUI介面與細緻的控制功能,使得TortoiseSVN成為Windows版本的SVN使用者最愛用的版本控制軟體之一。
這裡有一篇簡單的介紹,筆者認為他圖文並茂的說明,應該能讓大家輕鬆使用這套軟體。
在此推薦給大家!
推薦連結http://lnk.in/7ax8

類別:程式設計 標籤:

時間計畫與克服拖延

一月 16, 2011 發表迴響

之前找到的一篇有關時間計畫與如何克服拖延的文章,很有意思,可以參考看看。
文章連結:http://gov.sce.pccu.edu.tw/front/bin/ptdetail.phtml?Part=e_007&Rcg=37047

類別:生活

Smartmontools – 硬碟狀態監控

一月 11, 2011 發表迴響

上網找硬碟相關指令,無意間發現這個好東西。可以透過硬碟的S.M.A.R.T. 查看硬碟的健康狀態。
若需知詳情,請至:Smartmontools-硬碟狀態監控

關鍵字:smartctl

類別:Linux&FreeBSD 標籤:

【轉載】C 及 C++ 常犯錯誤 – EOF 測試的錯誤用法

一月 4, 2011 1 comment

摘要
大家常用到的一些C/C++ 讀取檔案程式碼,大多的長相如下:

while ( !infile.eof() )
{
  // 讀檔 ...
  // 資料處理 ...
}

然而,這樣寫可能會造成錯誤!因為C/C++ 的feof() 或是eof()的運作方式,是當上一個檔案讀取到結尾時,才回傳true,並非該次讀取到EOF才回傳true。也就是說,此一方法可能會造成當次讀取到EOF時,直接通過while迴圈,造成程式錯誤!

詳細解說請至
〔教學〕C 及 C++ 常犯錯誤 – EOF 測試的錯誤用法

類別:程式設計 標籤:

[C/C++] 陣列當作參數傳遞的函式實做方法

一月 4, 2011 發表迴響

在網路上無意間看到(原創) 如何使用function template傳遞array? (C/C++) (template)的幾篇文章後,我翻開我那塵封已久的C++ Primer 4/e,將有關陣列當做參數傳遞到函數的實作方法,整個初階到較為高階的做法,整理過後如下:
一般來說,我們若要讓函數傳遞陣列時,會寫以下:

/*
*  @Function: void fnPrintArray(int arr[10])
*  @Brief: Print the array content.
*  @Input: int arr[10]
*  @Output: array content.
*/
void fnPrintArray(int arr[10])
{
    for(size_t i=0;i<10;++i)
    {
        std::cout << i << " " << std::endl;
    }
}

但是此函式主要有兩個問題:
1. 若傳入的陣列只有包含3個元素時,會有out of range的問題。
2. 若傳入的陣列長度超過10,則無法完整印出該陣列內容。
針對上述問題的解法,C++ 在訂出reference這個概念後,array也可以用以下來代替:

/*
*  @Function: void fnPrintArray(int arr[10])
*  @Brief: Print the array content , and the input is by reference.
*  @Input: int arr[10]
*  @Output: array content.
*/
void fnPrintArray(int (&arr)[10])
{
    for(size_t i=0;i<10;++i)
    {
        std::cout << i << " " << std::endl;
    } 
}

此一reference的技巧,在於限定傳入的陣列大小只有10,降低了使用上的風險。
其中,傳入的參數int (&arr)[10] 表示傳入一個reference,其reference到具有10個int元素的陣列
若不加入括號的話:int &arr[10]表示傳入一個長度為10的陣列,每一個元素型態皆為int &
不過,如此作法卻大大降低了可用性。

因此,如何管理好陣列大小,便成為一個令人頭痛的問題!根據C/C++ Primer 4/e 提出常用的解法有三:
1. 函式另外傳入兩個指標,分別指向陣列開頭以及陣列結尾。
2. 如1.所述,不同的是,將原本指到陣列結尾的指標轉而指向陣列結尾的下一個。
3. 函式須指明給定陣列的明確長度。
但是,此方法在實用性上略顯不足,難道沒有一個更有效的方法嗎?

我們可以利用C++的template來幫我們實現這個方案。

#include <iostream>
using namespace std;
/*
* @Function:
        template<typename T,size_t N>
        void fnChange(T (&arr)[N])
* @Brief: Let each element of array increase by one.
* @Input: 1D array
* @Output: The array whose elements all increase by 1
*/
template<typename T,size_t N>
void fnChange(T (&arr)[N])
{
    for(size_t i=0;i<N;++i)
        arr[i]+=1;
}
int main(int argc, char * argv[])
{
    int arr1D[3]={1,2,3};  // Create 1D array.
    int arr2D[3][2] = { {1,2},{3,4},{5,6}}; // Create 2D array.
    // Show the initialized result.
    for(int i=0;i<3;++i)
    {
        cout << arr1D[i] << endl;
    }
    fnChange(arr1D);
    // Show the result.
    for(int i=0;i<3;++i)
    {
        cout << arr1D[i] << endl;
    }
    return 0;
}

上述程式碼,利用樣板特化的技巧,讓函式不用帶入陣列大小,便可透過樣板參數幫我們自動得知陣列大小,以利函式功能的撰寫。
因此,舉一反三,我們可以藉此程式碼推廣至二維陣列,範例程式碼如下:

#include <iostream>
using namespace std;
/*
* @Function:
        template<typename T,size_t M,size_t N>
        void fnPrint2DArray(T (&arr)[M][N])
* @Brief: Print the  content of 2D Array.
* @Input: 2D array.
* @Output: None.
*/
template<typename T,size_t M,size_t N>
void fnPrint2DArray(T (&arr)[M][N])
{
    for(size_t i=0;i<M;++i)
    {
        for(size_t j=0; j<N; ++j)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
}
int main(int argc, char * argv[])
{
    int arr2D[3][2] = { {1,2},{3,4},{5,6}}; // Create 2D array.
    // Print 2D array.
    fnPrint2DArray(arr2D);
    return 0;
}

因此,對於陣列的參數傳遞,我們可以利用樣板的功能來幫我順利達成。似乎一切在這邊有了完整的解答。:)
Reference
C++ Primer 中文版 4/e page. 110 , 240~241, 632~633.
(原創) array傳進function該怎麼寫才好? (C/C++) (C) 推薦閱讀!

類別:程式設計 標籤:,

「電子書產業」還有什麼可為的?

一月 3, 2011 發表迴響

台灣一年可以出版四萬種書,而現在沒有任何一家電子書平台能夠宣稱線上擁有超過一萬種的可下載書目。我們連韓國的八分之一都不如,這樣要指望電子書產業興盛,也真是太強人所難了。

事實擺在眼前,只有硬體不可能造就電書產業…

若需知詳情,請至:http://www.contnt.net/2010/12/ebook-industry-what-can-we-do.html

類別:生活
Follow

Get every new post delivered to your Inbox.