PIXNET Logo登入

雲彩飛舞

跳到主文

部落格全站分類:不設分類

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 3月 01 週四 200721:01
  • c/c++ 資源 網頁

不斷更新中
 
1. http://sandwichc.blogspot.com/2007/02/cc-pointer-reference.html
 
    Sean's Wearhouse  :裡面有一些Programming 概念,本人覺得還不錯,尤其
                                    C/C++之指標 (pointer),參考 (reference) 觀念整理與常見問題
                                    寫的滿好的,作者本人似乎從事教職
 
---------------------------------------------------------------------------------------------
2. http://www.cppreference.com   找Function 指令 網站
(繼續閱讀...)
文章標籤

雲飛 發表在 痞客邦 留言(0) 人氣(40)

  • 個人分類:我這個好弱--Program
▲top
  • 2月 09 週五 200708:57
  • 是否有最根本的c/c++資料?

仿間c或c++的書很多, 而國外名著的譯本也不少
但是好像總是會有某本書講到其他書沒有講到的部份或是功能
或者是他講的比較深一點...
所以想問問是不是有這些書所根據的根本資料或是最詳細的資料...?
作者怎麼知道這些東西,根據什麼得知等等
是C99 和 C++ 2003 文件嗎?
另外想請問一下 (之前有問過,不過還不是很滿意)
C和C++的函數庫實在是很龐大
假如我想查閱一個函數的所有可用參數,舉個簡單的例子:
像printf(" A =  %c \n", B);
有些書可能會列出很多%c處可以代換的格式 ,
而'\n'處也可能會列出其他可以代換的參數,並說明他們的意義
而有些書可能僅列出比較常用的幾種...
又有些書可能printf這個函數的參數列得很詳細
但是其他函數就可能大概列出常用的參數...
坊間也看到一些函數庫的工具書
但是這些工具書有時也會互不包含,就像上面講的那種情況
有時想查個東西, 要翻好幾本書
這些作者是根據什麼資料 寫出這些書呢?
又,是不是不同的環境下,即使是相同的函數
也可能會有點不一樣?
--------------------------------------------------------------------------------
意見:
1.符合你的需求  只有規格書(史貝克)了 …
 
2.http://www.cppreference.com
 
3.很明顯你是希望有一本書 or
一份文件能包括全部知識不過就算拿到了規格書..C++
這門學問還是學不完的想把 C++
學好本來就該多看幾本,如紅皮小書系列,等你把基本的語法看熟、
知道如何操作一些常用的程式庫,有空就可以開始看看紅皮小書系列了..(The C++
In-Depth Series)

 
4.如果你有拿到規格書,那想追根究底可以參考它,
然後規格書會寫說哪邊是留給實作來定義,那些部份就看廠商怎麼定了
5.我習慣開個 pietty 連到自己的 Linux 機器上面直接 man (爆)
這樣查到的就是那台機器上面的 C Runtime Library 說明
現在的 Linux 大概 99.9% 用的是 GNU C Library 吧 ...
請參閱 http://0rz.tw/c52mb [gnu.org]
或之前在網路上翻到的 http://0rz.tw/782p8 [libc-2.3.4.chm]

如果是用 VC 的話就看 MSDN 吧
線上版比較慢,Visual Studio 的光碟應該有附,裝起來就是了

6.
C 標準函式庫其實也是個需要連結的函式庫,
不是做死在編譯器裡面的
這樣想的話應該比較容易暸解
比如說 gcc 在 Linux 上面通常是配合 GNU C Library (glibc)
但
Windows 下面的 MinGW gcc 用的卻是 (系統內附的) Microsoft C Runtime
Library
這時要查的就是 MSDN 了 ...

ps:C runtime library 的意思,為什麼要加個runtime呢?                                   
就語言的角度來說, 區分"編譯時"與"執行時"的部份這樣  

(繼續閱讀...)
文章標籤

雲飛 發表在 痞客邦 留言(0) 人氣(30)

  • 個人分類:我這個好弱--Program
▲top
  • 12月 23 週六 200601:16
  • C 語言新手十誡(增修一版)

C 語言新手十誡(The Ten Commandments for Newbie C Programmers)
                                                       by Khoguan Phuann
一、你不可以使用尚未給予適當初值的變數。
    錯誤例子:
    int accumulate(int max)    /* 從 1 累加到 max,傳回結果 */
    {
        int sum;    /* 未給予初值的區域變數,其內容值是垃圾 */
        int num;
        for (num = 1; num <= max; num++) {
            sum += num;
        }
        return sum;
    }
    正確例子:
    int accumulate(int max)
    {
        int sum = 0;    /* 正確的賦予適當的初值 */
        int num;
        for (num = 1; num <= max; num++) {
            sum += num;
        }
        return sum;
    }
二、你不可以存取超過陣列既定範圍的空間。
    錯誤例子:
    int str[5];
    int i;
    for (i = 0; i <= 5; i++) str[i] = i;
    正確例子:
    int str[5];
    int i;
    for (i = 0; i < 5; i++) str[i] = i;
    說明:宣告陣列時,所給的陣列元素個數值如果是 N, 那麼我們在後面
    透過 [索引值] 存取其元素時,所能使用的索引值範圍是從 0 到 N-1,
    也就是 C 和 C++ 的陣列元素是從第 0 個開始算起,最後一個元素的
    索引值是 N-1, 不是 N
。
    C/C++ 為了執行效率,並不會自動檢查陣列索引值是否超過陣列邊界,
    我們要自己寫程式來確保不會越界。一旦越界,將導致無法預期的後果。

三、你不可以提取(dereference)不知指向何方的指標(包含 null 指標)。
    錯誤例子:
    char *pc1;      /* 未給予初值,不知指向何方 */
    char *pc2 = 0;  /* pc2 起始化為 null pointer */
    *pc1 = 'a';     /* 將 'a' 寫到不知何方,錯誤 */
    *pc2 = 'b';     /* 將 'b' 寫到「位址0」,錯誤 */
    正確例子:
    char c;          /* c 的內容尚未起始化 */
    char *pc1 = &c;  /* pc1 指向字元變數 c */
    /* 動態分配 10 個 char(其值未定),並將第一個char的位址賦值給 pc2 */
    char *pc2 = (char *)malloc(10);
    *pc1 = 'a';      /* c 的內容變為 'a' */
    pc2[0] = 'b';    /* 動態配置來的第 0 個字元,內容變為 'b'
    /* 最後記得 free() 掉 malloc() 所分配的空間 */
    free(pc2);
    說明:指標變數必需先指向某個明確的東西(object),才能進行操作。
四、你不可以將字串常數賦值(assign)給 char* 變數,然後透過該變數
    改寫字串的內容(只能讀不能寫)。
    錯誤例子:
    char* pc = "john";
    *pc = 'J';
    printf("Hello, %s\n", pc);
    正確例子:
    char pc[] = "john";
    *pc = 'J';  /* 或  pc[0] = 'J';  */
    printf("Hello, %s\n", pc);
    說明:字串常數的內容是唯讀的。上面的錯誤例子,是將其內容所在的位址賦
    值給字元指標 pc, 我們透過指標只可以去讀該字串常數的內容,而不應該做
    寫入的動作。而正確例子,則是另外宣告一個獨立的字元陣列,它的大小我們
    未明文指定([]),編譯器會自動將其設為剛好可以容納後面的字串常數起始
    值的大小,包括字串後面隱含的 '\0' 字元,並將字串常數的內容複製到字元
    陣列中,因此可以自由的對該字元陣列的內容進行讀和寫。
    錯誤例子(2):
    char *s1 = "Hello, ";
    char *s2 = "world!";
    /* strcat() 不會另行配置空間,只會將資料附加到 s1 所指唯讀字串的後面,
       造成寫入到程式無權碰觸的記憶體空間 */
    char *s3 = strcat(s1, s2);
    正確例子(2):
    /* s1 宣告成陣列,並保留足夠空間存放後續要附加的內容 */
    char s1[20] = "Hello, ";
    char *s2 = "world!";
    /* 因為 strcat() 的返回值等於第一個參數值,所以 s3 就不需要了 */
    strcat(s1, s2);
五、你不可以對尚未分配所指空間的 char* 變數,進行(字串)陣列的相關操作。
    其他型別的指標亦然。
    錯誤例子:
    char *name;   /* name 尚未指向有效的空間 */
    printf("Your name, please: ");
    gets(name);
    printf("Hello, %s\n", name);
    正確例子(1):
    /* 如果編譯期就能決定字串的最大空間,那就不要宣告成 char* 改用 char[]
*/
    char name[21]; /* 字串最長 20 個字元,另加一個 '\0' */
    printf("Your name, please: ");
    gets(name);
    printf("Hello, %s\n", name);
    正確例子(2):
    /* 若是在執行時期才能決定字串的最大空間,則需利用 malloc() 函式來動態
       分配空間 */
    size_t length;
    char *name;
    printf("請輸入字串的最大長度(含null字元): ");
    scanf("%u", &length);
    name = (char *)malloc(length);
    printf("Your name, please: ");
    scanf("%s", name);
    printf("Hello, %s\n", name);
    /* 最後記得 free() 掉 malloc() 所分配的空間 */
    free(name);
    注意:上例用 gets() 或 scanf() 來讀入字串,是不安全的。 因為這些函式
    不會幫我們檢查使用者所輸入的字串長度是否超過我們所分配的 buffer 空間,
    很可能會發生 buffer overflow。比較安全的做法是用 fgets() 來取代。如:

    char *p;
    char name[21];
    printf("Your name, please: ");
    fgets(name, sizeof(name), stdin);
    /* fgets()會連行末的'\n'也讀進字串中,所以要找出存入'\n'的位置,填入
'\0'
    if ((p = strchr(name, '\n')) != NULL)
        *p = '\0';
    printf("Hello, %s\n", name);
六、你不可以在函式中回傳一個指向區域性自動變數的指標。否則,會得到垃圾值。
    [感謝 gocpp 網友提供程式例子]
    錯誤例子:
    char *getstr(char *name)
    {
        char buf[30] = "hello, "; /*將字串常數"hello,
"的內容複製到buf陣列*/
        strcat(buf, name);
        return buf;
    }
    說明:區域性自動變數,將會在離開該區域時(本例中就是從getstr函式返回時)
    被消滅,因此呼叫端得到的指標所指的字串內容就失效了。【不過,倒是可以從
    函式中直接傳回字串常數,賦值給呼叫端的一個 const char * 變數,它既是唯
    讀的(參見第四誡),同時也具有恒常的儲存期(static storage duration),其
    內容將一直有效。】
    正確例子:
    void getstr(char buf[], int buflen, char const *name)
    {
        char const s[] = "hello, ";
        assert(strlen(s) + strlen(name) < buflen);
        strcpy(buf, s);
        strcat(buf, name);
    }
    [針對字串操作,C++提供了更方便安全的 string class, 能用就盡量用]
    #include <string>
    using std::string;
    string getstr(string const &name)
    {
        return string("hello, ") += name;
    }
七、你不可以只做 malloc(), 而不做相應的 free(). 否則會造成記憶體漏失。
    但若不是用 malloc() 所得到的記憶體,則不可以 free()。已經 free()了
    所指記憶體的指標,在它指向另一塊有效的動態分配得來的空間之前,不可
    以再被 free(),也不可以提取(dereference)這個指標。
    [C++] 你不可以只做 new, 而不做相應的 delete.
八、你不可以在數值運算、賦值或比較中隨意混用不同型別的數值,而不謹慎考
    慮數值型別轉換可能帶來的「意外驚喜」(錯愕)。必須隨時注意數值運算
    的結果,其範圍是否會超出變數的型別。
    錯誤例子(1):
    unsigned int sum = 2000000000 + 2000000000; /* 20 億 */
    double f = 10 / 3;
    正確例子(1):
    /* 全部都用 unsigned int, 注意數字後面的 u, 大寫 U 也成 */
    unsigned int sum = 2000000000u + 2000000000u;
    /* 或是用顯式的轉型 */
    unsigned int sum = (unsigned int)2000000000 + 2000000000;
    double f = 10.0 / 3.0;
    說明:在目前最普遍的32位元PC作業平台上,整數常數2000000000的型別為
    signed int(簡寫為 int),相加後,其結果仍為 int, 但是 signed int
    放不下 4000000000, 造成算術溢位(arithmetic overflow),很可能無法
    將正確的值指派給 unsigned int sum,縱使 unsigned int 放得下4000000000
    的數值。注意:寫成
    unsigned int sum = (unsigned int)(2000000000 + 2000000000);
    也是不對的。
    例子(2):(感謝 sekya 網友提供)
    unsigned char a = 0x80;
    char b = 0x80;           /* implementation-defined result */
    if( a == 0x80 ) {        /* 恒真 */
        printf( "a ok\n" );
    if( b == 0x80 ) {        /* 不一定恒真 */
        printf( "b ok\n" );
    }
    說明:在將 char 型別定義為範圍從 -128 至 +127 的系統上,int 0x80
    (其值等於 +128)要轉成 char 會放不下,會產生編譯器自行定義的值。
    這樣的程式就不具可移植性了。
九、你不可以在一個運算式(expression)中,對一個基本型態的變數修改其值
    超過一次以上。否則,將導致未定義的行為(undefined behavior)。

    錯誤例子:
    int i = 7;
    int j = ++i + i++;
    正確例子:
    int i = 7;
    int j = ++i;
    j += i++;
    你也不可以在一個運算式(expression)中,對一個基本型態的變數修改其值,
    而且還在同一個式子的其他地方為了其他目的而存取該變數的值
。(其他目的,
    是指不是為了計算這個變數的新值的目的)。否則,將導致未定義的行為。
    錯誤例子:
    int arr[5];
    int i = 0;
    arr[i] = i++;
    正確例子:
    int arr[5];
    int i = 0;
    arr[i] = i;
    i++;
    [C++程式]
    錯誤例子:
    int i = 10;
    cout << i << "==" << i++;
    正確例子:
    int i = 10;
    cout << i << "==";
    cout << i++;
十、你不可以在macro的定義中,不為它的參數個別加上括號。
    錯誤例子:
    #include <stdio.h>
    #define SQUARE(x)    (x * x)
    int main()
    {
        printf("%d\n", SQUARE(10-5));
        return 0;
    }
    正確例子:
    #include <stdio.h>
    #define SQUARE(x)    ((x) * (x))
    int main()
    {
        printf("%d\n", SQUARE(10-5));
        return 0;
    }
    說明:如果是用 C++, 請多多利用 inline function 來取代上述的 macro,
    以免除 macro 定義的種種危險性
。如:
    inline int square(int x) { return x * x; }
    macro 定義出的「偽函式」至少缺乏下列數項函式本有的能力:
    (1) 無法進行參數型別的檢查。
    (2) 無法遞迴呼叫。
    (3) 無法用 & 加在 macro name 之前,取得函式位址。
    (4) 呼叫時往往不能使用具有 side effect 的引數。例如:

    錯誤例子:(感謝 yaca 網友提供)
    #define MACRO(x)     (((x) * (x)) - ((x) * (x)))
    int main()
    {
        int x = 3;
        printf("%d\n", MACRO(++x));
        return 0;
    }
    MACRO(++x) 展開來後變成 (((++x) * (++x)) - ((++x) * (++x)))
    違反了第九誡。在 gcc 4.3.3 下的結果是 -24, 在 vc++ 下是 0.
後記:從「古時候」流傳下來一篇文章
      "The Ten Commandments for C Programmers"(Annotated Edition)
      by Henry Spencer
      http://www.lysator.liu.se/c/ten-commandments.html
      一方面它不是針對 C 的初學者,一方面它特意模仿中古英文
      聖經的用語,寫得文謅謅。所以我現在另外寫了這篇,希望
      能涵蓋最重要的觀念以及初學甚至老手最易犯的錯誤。
作者:潘科元(Khoguan Phuann) (c)2005. 感謝 ptt.cc BBS 的 C_and_CPP
      看板眾多網友提供寶貴意見及程式實例。
(繼續閱讀...)
文章標籤

雲飛 發表在 痞客邦 留言(0) 人氣(375)

  • 個人分類:我這個好弱--Program
▲top
1

自訂側欄

自訂側欄

個人資訊

雲飛
暱稱:
雲飛
分類:
不設分類
好友:
累積中
地區:

熱門文章

  • (1,154)Thank God I Found You \Mariah CareyY ft 98 Degrees -
  • (2,748)The Twin Bracelets(雙鐲)
  • (36)工作,不斷解決問題,讓我更快樂
  • (320)Vixy.net 幫你從 YouTube 下載影片
  • (184)[問題] I am "an" American...
  • (19)9/9 特別的日子
  • (27)【轉貼】老外介紹金庸作品
  • (1,697)白色巨塔 侯文詠談白塔內的動人故事
  • (4,454)蜜蜂的窩為什麼是六角形的?
  • (174)95中興榜單

文章分類

  • 影片 (1)
  • 旅行 (2)
  • [凡物皆數] By 畢達哥拉斯 (5)
  • 萬物之結構,生命之泉源--化之學 (1)
  • 隨意 (20)
  • English View (8)
  • 你不理財 ; 財不理你 (8)
  • 研究(寶庫哦) (5)
  • 我這個好弱--Program (3)
  • 健康 (3)
  • 詩雲 詞飛 (11)
  • 知識 (13)
  • 新聞與政治 (22)
  • 觀念 VS. 思索 (18)
  • 心情 (68)
  • 飆淚 (2)
  • 電腦和網際網路 (8)
  • 外文之妙 (5)
  • 嗜好 (8)
  • 效率 積極 (11)
  • 雲飛 電影觀 (8)
  • 娛樂 (37)
  • 圖書 (5)
  • 音樂 (34)
  • 未分類文章 (1)

最新文章

  • 到此一遊
  • Uefang Smith's Favorite Songs (KTV)
  • Conference Paper & Thesis
  • [Movie] The Secret that Cannot be told (Jay Chou Secret OST Music)
  • [Movie] Enchanted
  • Mariah Carey
  • 用生命拍出來的電影 [海角七號Cape NO.7]
  • Yezi (Leaf) by A-Sun
  • [紀念] 20080520中華民國第12任總統馬英九先生就職演說
  • [Talk] 紀念 彩虹.....

動態訂閱

文章精選

文章搜尋

誰來我家

參觀人氣

  • 本日人氣:
  • 累積人氣: