• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            人生亦編程

            --Programmable Life
            posts - 86, comments - 43, trackbacks - 0, articles - 7

            #include?? < string .h > ??
            ?
            void
            ??main()??
            {??
            ???????
            string ??aaa = ?? " abcsd??d "
            ;??
            ???????printf(
            " looking??for??abc??from??abcdecd??%s\n "
            ,??
            ???????????????(strcmp(aaa,
            " abc " ))?? ? ?? " Found " ??:?? " Not??Found "
            );??
            ?
            }
            ??

            不能正確執行,提示說是string類型沒有定義??

            而下面:??

            #include?? < string > ??
            ?
            using ?? namespace
            ??std;??
            void
            ??main()??
            {??
            ???????
            string ??aaa = ?? " abcsd??d "
            ;??
            ???????printf(
            " looking??for??abc??from??abcdecd??%s\n "
            ,??
            ???????????????(strcmp(aaa,
            " abc " ))?? ? ?? " Found " ??:?? " Not??Found "
            );??
            }
            ??


            這里的string編譯器就認識了,但是strcmp就不認識了呢???

            一般一個C++的老的帶“.h”擴展名的庫文件,比如iostream.h,在新標準后的標準庫中都有一個不帶“.h”擴展名的相對應,區別除了后者的好多改進之外,還有一點就是后者的東東都塞進了“std”名字空間中。 ?
            ?
            但唯獨string特別。 ?
            問題在于C++要兼容C的標準庫,而C的標準庫里碰巧也已經有一個名字叫做“string.h”的頭文件,包含一些常用的C字符串處理函數,比如樓主提到的strcmp。 ?
            這個頭文件跟C++的string類半點關系也沒有,所以<string>并非<string.h>的“升級版本”,他們是毫無關系的兩個頭文件。 ?
            要達到樓主的目的,比如同時:??

            #include?? < string .h > ??
            #include??
            < string >
            ??
            using ?? namespace ??std;??


            或者??

            #include?? < cstring > ??
            #include??
            < string > ??


            ?
            其中<cstring>是與C標準庫的<string.h>相對應,但裹有std名字空間的版本。

            笑談(來自高質量++)

            C++標準庫很大。非常大。難以置信的大。怎么個大法?這么說吧:在C++標準中,關于標準庫的規格說明占了密密麻麻300 多頁,這還不包括標準C 庫,后者只是"作為參考"(老實說,原文就是用的這個詞)包含在C++庫中。當然,并非總是越大越好,但在現在的情況下,確實越大越好,因為大的庫會包含大量的功能。標準庫中的功能越多,開發自己的應用程序時能借助的功能就越多。C++庫并非提供了一切(很明顯的是,沒有提供并發和圖形用戶接口的支持),但確實提供了很多。幾乎任何事你都可以求助于它。在歸納標準庫中有些什么之前,需要介紹一下它是如何組織的。因為標準庫中東西如此之多,你(或象你一樣的其他什么人)所選擇的類名或函數名就很有可能和標準庫中的某個名字相同。為了避免這種情況所造成的名字沖突,實際上標準庫中的一切都被放在名字空間std 中(參見條款28)。但這帶來了一個新問題。無數現有的C++代碼都依賴于使用了多年的偽標準庫中的功能,例如,聲明在<iostream.h>,<complex.h>,<limits.h>等頭文件中的功能。現有軟件沒有針對使用名字空間而進行設計,如果用std 來包裝標準庫導致現有代碼不能用,將是一種可恥行為。(這種釜底抽薪的做法會讓現有代碼的程序員說出比"可恥" 更難聽的話)懾于被激怒的程序員會產生的破壞力,標準委員會決定為包裝了std 的那部分標準庫構件創建新的頭文件名。生成新頭文件的方法僅僅是將現有C++頭文件名中的.h 去掉,方法本身不重要,正如最后產生的結果不一致也并不重要一樣。所以<iostream.h>變成了<iostream>,<complex.h>變成了<complex>,等等。對于C 頭文件,采用同樣的方法,但在每個名字前還要添加一個c。所以C 的<string.h>變成了<cstring>,<stdio.h>變成了<cstdio>,等等。最后一點是,舊的C++頭文件是官方所反對使用的(即,明確列出不再支持),但舊的C 頭文件則沒有(以保持對C 的兼容性)。實際上,編譯器制造商不會停止對客戶現有軟件提供支持,所以可以預計,舊的C++頭文件在未來幾年內還是會被支持。
            所以,實際來說,下面是C++頭文件的現狀:
            舊的C++頭文件名如<iostream.h>將會繼續被支持,盡管它們不在官方標準中。這些頭文件的內容不在名字空間std 中。
            新的C++頭文件如<iostream>包含的基本功能和對應的舊頭文件相同,但頭文件的內容在名字空間std 中。(在標準化的過程中,庫中有些部分的細節被修改了,所以舊頭文件和新頭文件中的實體不一定完全對應。)
            標準C 頭文件如<stdio.h>繼續被支持。頭文件的內容不在std 中。
            具有C 庫功能的新C++頭文件具有如<cstdio>這樣的名字。它們提供的內容和相應的舊C 頭文件相同,只是內容在std 中。
            所有這些初看有點怪,但不難習慣它。最大的挑戰是把字符串頭文件理清楚:
            <string.h>是舊的C 頭文件,對應的是基于char*的字符串處理函數;
            <cstring>是對應于舊C 頭文件的std 版本;
            <string>是包裝了std 的C++頭文件,對應的是新的string 類。

            如果能掌握這些(我相信你能),其余的也就容易了。

            posted @ 2006-07-27 12:28 人生亦編程 閱讀(1939) | 評論 (0)編輯 收藏

            #include?

            int ?max( int ?x, int ?y) {? return (x > y ? x:y);?} ?

            void ?main()?
            {?
            ????
            int ?( * ptr)();?
            ????
            int ?a,b,c;?
            ????ptr
            = max;?
            ????scanf(
            " %d,%d " , & a, & b);?
            ????c
            = ( * ptr)(a,b);?
            ????printf(
            " a=%d,b=%d,max=%d " ,a,b,c);?
            }
            ?
            指針函數和函數指針有什么區別

            1,這兩個概念都是簡稱,指針函數是指帶指針的函數,即本質是一個函數。我們知道函數都又返回類型(如果不返回值,則為無值型),只不過指針函數返回類型是某一類型的指針。其定義格式如下所示:

            返回類型標識符 *返回名稱(形式參數表)
            { 函數體 }

            返回類型可以是任何基本類型和復合類型。返回指針的函數的用途十分廣泛。事實上,每一個函數,即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該地址相當于一個指針。比如函數返回一個整型值,實際上也相當于返回一個指針變量的值,不過這時的變量是函數本身而已,而整個函數相當于一個“變量”。例如下面一個返回指針函數的例子:

            #include?

            float?*find();?
            main()?
            {?
            ????
            static?float?score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}};?
            ????
            float?*p;?
            ????
            int?i,m;?
            ????printf(
            "Enter?the?number?to?be?found:");?
            ????scanf(
            "%d",&m);?
            ????printf(
            "the?score?of?NO.%d?are:\n",m);?
            ????p
            =find(score,m);?
            ????
            for(i=0;i<4;i++)?
            ????????printf(
            "%5.2f\t",*(p+i));?
            }
            ?

            float?*find(float(*pionter)[4],int?n)/*定義指針函數*/?
            {?
            ????
            float?*pt;?
            ????pt
            =*(pionter+n);?
            ????
            return(pt);?
            }
            ?

            學生學號從0號算起,函數find()被定義為指針函數,起形參pointer是指針指向包含4個元素的一維數組的指針變量。pointer+1指向score的第一行。*(pointer+1)指向第一行的第0個元素。pt是一個指針變量,它指向浮點型變量。main()函數中調用find()函數,將score數組的首地址傳給pointer.

            2,“函數指針”是指向函數的指針變量,因而“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組一樣,這里是指向函數。如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量后,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上一致的。函數指針有兩個用途:調用函數和做函數的參數。函數指針不能絕對不能指向不同類型,或者是帶不同形參的函數,在定義函數指針的時候我們很容易犯如下的錯誤。

            int *fp(int a);//這里是錯誤的,因為按照結合性和優先級來看就是先和()結合,然后變成了一個返回整形指針的函數了,而不是函數指針,這一點尤其需要注意!

            函數指針的說明方法為:
            數據類型標志符 (*指針變量名)(參數);注:函數括號中的參數可有可無,視情況而定。
            下面的程序說明了函數指針調用函數的方法:


            ptr是指向函數的指針變量,所以可把函數max()賦給ptr作為ptr的值,即把max()的入口地址賦給ptr,以后就可以用ptr來調用該函數,實際上ptr和max都指向同一個入口地址,不同就是ptr是一個指針變量,不像函數名稱那樣是死的,它可以指向任何函數,就看你像怎么做了。在程序中把哪個函數的地址賦給它,它就指向哪個函數。而后用指針變量調用它,因此可以先后指向不同的函數,不過注意,指向函數的指針變量沒有++和--運算,用時要小心。

            posted @ 2006-07-23 13:52 人生亦編程 閱讀(187) | 評論 (0)編輯 收藏

            如果將英文字母A到Z分別編上1—26的分數,(A=1,B=2,...Z=26)那么:
            知識(knowledge)得到96分(11+14+15+23+12+5+4+7+5=96),
            努力(hardwork)也只得98分(8+1+18+4+23+15+18+11=98),
            態度(attitude) ???

            posted @ 2006-07-21 19:42 人生亦編程 閱讀(83) | 評論 (0)編輯 收藏

            在BCB中
            #include"CString.h"

            string s="";//Ansistring
            String s="";//string兩者是不同的

            posted @ 2006-07-21 19:38 人生亦編程 閱讀(143) | 評論 (0)編輯 收藏

            VOOTOO服務器上玩的時候......
            還有一個叫deva *imcreasy 的伙伴
            conqueror.JPG
            died.jpg
            31.jpg

            posted @ 2006-07-21 19:37 人生亦編程 閱讀(153) | 評論 (0)編輯 收藏

            點左下角開始-運行-在輸入框里輸入“regsvr32 jscript.dll”
            點“確定”-出現成功提示后點OK。
            同樣方法運行“regsvr32 vbscript.dll”。

            posted @ 2006-07-21 19:33 人生亦編程 閱讀(265) | 評論 (2)編輯 收藏

            如果你有耐心看望第二節,你就是...
            如果你有耐心看望第三節,你就是...
            如果你有耐心看望第四節,你就是...
            如果你有耐心看望第五節,你就是...

            如果你抖腿著看完本文,你就是...
            如果你微笑著看完本文,你就是...
            如果你點頭著看完本文,你就是...
            如果你迫不及待著看完本文,你就是...


            修煉一名程序員的職業水準(林慶忠__署名原創)

            作者:林慶忠,1990年畢業于昆明工學院計算機軟件專業,后又于1999年畢業在南京大學 完成軟件工程專業碩士的學習,現供職于CNPC旗下的一個行業軟件研發中心,因為在網上看了許多有經驗的各路軟件開發人員寫的好帖,一時手癢興起,也湊一篇壯壯聲勢。

            假設你是一名軟件專業畢業的本科學子,如何在工作中修煉成為一名有較高職業水準的程序員呢,本文試圖總結作者從事15年軟件開發工作的感想,希望對有志成為職業程序員的人有所幫助,并借此機會感謝原昆明工學院計算機系的和智玲老師和張懷寧老師,特別感謝我的碩士導師,南京大學計算機系的博導鄭國梁教授。

            注:本帖言辭尖刻,乃作者脾氣秉性使然,如果你看著有氣,就請多多見諒,放下別看了。

            程序就是一系列按步驟進行的操作序列,它有好多種級別,比如最低級的微程序、次低級的匯編程序、高級的各種編程語言程序、最高級的腳本語言程序,也許我列的不對,但沒關系,我要說的是不管是那個級別的程序,其本質都是操作的邏輯序列。大多數系統和應用程序都是建立在高級編程語言上的,比如C、C++、C#、FORTRAN、BISIC、JAVA等等,就讓我們只關注這一級的編程能力吧。因此如果一個程序員的邏輯能力不高,他永遠都不能成為一名具有合格職業水準的程序員,我們在下面的討論有關編程能力的方方面面,最終都是為了最大程度地提高和實現一名程序員的邏輯能力。

            一、掌握基礎知識:十六年寒窗的持續積累

            從7歲讀小學起,經過16年的學習,你從軟件專業本科畢業后,必須完成以下幾門專業課程的學習:計算機組成、操作系統原理、匯編語言、數據結構、編譯原理、數據庫原理、軟件工程、結構性設計語言(PASCAL、C)、面向對象設計語言(C++、C#)、計算機網絡等,你最好還懂一些算法分析、分布式系統、計算機圖形學、形式邏輯、人工智能原理、軟件設計模式、軟件構架/框架等研究生的課程,16年來,你積累的除了知識,更重要的是形成最適合自己的學習方法和工作方法。這些是你具備程序員職業水準的基礎能力,不要受什么計算機軟件怪杰之類傳奇的影響,那不過是小概率事件,而且這些怪杰們就算沒有讀過軟件本科和研究生,也往往自學了大多數專業課程,很可能比在校學習的學生對這些課程的精髓部分理解的更好,還有他們的工作方法和思維方式是特別而高效的,但普遍性差,可以借鑒,不宜模仿。好,所以現在你只需要問問自己,那些課程和知識都學會并掌握了嗎?如果是,那就準備好進行實踐了。

            二、在實踐中提高:成為一名高水平的Coder

            好了,你畢業了,在校功課都不錯,也找了一個專業對口的工作,你想大展鴻圖了,可是別急,你的翅膀還不夠硬,不信我們說來看看。

            通常,你在工作中都會用到某一種單位/公司固定的操作系統和編程語言開發環境,比如Windows、UNIX、LINUX等操作系統,又比如用VC、VB、PB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor等編程語言和開發環境,我們在后面把它們合稱為開發環境。就在校學習的有關開發環境的知識而言,大概你距工作需要的差距是不小的,當某個操作系統和編程語言環境成為你的飯碗時,就不應也不能用通過課程/認證考試之類的眼光和要求來評價你的能力,即使你能考100分。你需要深入地學習該操作系統和編程語言環境的各類開發手冊的所有內容,你會說大多數你都用不上,其實你既對又不對,對的是單從使用的角度而言,你確實用不上開發手冊的大多數內容,比如龐大的VC開發類庫和復雜的開發環境,你在實際工作中能用到的不到總數的1/10或1/5,不對的地方在于,你用到的部分不是孤立存在的,它們是整個體系中的一部分,只有對整個體系有了一個較完整的了解,才能得心應手、隨心所欲地用好你用到的部分,你才算初步具備在這種開發環境下進行Coding的職業水準(還遠不夠程序員的職業水準呢),而這只是剛開始。如何才能真正掌握一種開發環境的全面的知識呢,最原始的辦法就是讀開發指南/教程、參考手冊,一般來講,學習開發指南/教程時,你如果是一個認真的人,都會完成5/10~7/10左右內容的學習和練習,如果你想成為職業選手,就應該完成9/10以上內容的學習和練習。參考手冊不同,大多數所謂的“程序員”們只是用到了才翻翻,這差的太遠了,你應該象讀開發指南/教程一樣,每個環節都要讀,比如VC,參考手冊中的每個類,類的每個函數,都要讀上幾遍,它們往往是一小伙一小伙地糾纏在一起使用的,開始時讀得你毫無頭緒、心煩意亂,不要緊,還有一手呢,如果你開發環境安裝的全面,它們往往都有開發商做的demo例子可看,你就進入另一個境界了,開始時你關注demo中的具體技術,后來你發現這些demo的程序寫的都還算不錯,結構簡單但合理,如果你真的用心,就一定能發現一些個別的demo是極品,它所展現的程序邏輯結構是你設計不出來的,你現在有點更關心它的程序設計構架,甚于對你原始目的(某種相關的技術/技巧)的關注,這時的你,開始了從一名Coder向一名Programmer的轉變,你會忍不住要看看開發商提供的源程序,比如.h和.cpp,通常你會找到include路徑下所有的.h程序,你才知道,哇!好多好多東東在參考手冊中都沒提到,你要學的太多了,沒時間顧及其它的業余愛好了,現在知道為什么程序員是年輕人的職業了吧,你要有足夠多的時間才行,即使你的智商有160。如果你走到這一步,在你工作的團隊中,已經是經常有人向你請教技術問題,經常有人請求你幫忙debug,你已是公認的“高手”了,別得意,因為你仍然是個Coder,為什么這么說呢,你想想,你已深入了解了這個開發環境中的各種技能,知道一名Coder如何用好這些東西,可是你能設計的出提供給Coder們用的東西嗎?唔……,你想了想,可能還不太行。對了,就是這樣,你還是一名小我境界的程序員呢,本質是個Coder,當然已是一名高水平的Coder了,然而你需要進一步登堂入室才能成為一名真正的程序員。

            讓我們繼續吧,通常你都是從精通一種編程環境開始的,假設你已經較為精通在Windows下用VC開發軟件了,這時在技術和技巧方面你將面臨一小一大兩個挑戰,第一個小挑戰是如果公司/單位改換了開發環境,比如用LINUX下的QT交互語言工具進行開發,你不過是把前面掌握VC的過程再來一遍,由于在主觀上經歷了VC工具的學習過程,在客觀上各種開發環境都有太多相似的方面,這回你掌握的應該較快。要小心,在這時第一次誘惑之門打開了,因為你感覺良好,看!這回這么快,我就這么好地掌握了新的開發環境,你開始關注其它暫時還用不到的同類環境,比如VB、Delph、JAVA,如饑似渴地掌握各種開發工具,證明自己的學習能力和價值,但你忘了一點,你仍然是個Coder,只不過是一個在好多開發環境下都能編程的Coder,就像你生活在中國,因而精通了漢語,工作需要你又掌握了英語,然后你就來了勁,把俄語、日語、阿拉伯語、拉丁語,等等等等,都學習個遍,我只能說,有點BT。你忘了自己是個職業人,同一類的東西工作中用得到才需學習,太多太多的Coder們喜歡在一起比較和炫耀自己會掌握了幾種開發工具,不信你看看招聘時的求職書就知道了,sigh!他們中絕大多數人永遠都只能停留在這個層次上,心浮氣躁,一生都再也當不成真正的程序員了。總結一下,其實你在這時需要的是對自己掌握新開發環境的能力的自信,而不是一遍遍地重復來證明自己。第二個大挑戰就是你明白了只掌握VC是不夠的,你發現自己有點淺薄,有很多東東你會用但你不太懂,很多方面支持VC編程的知識你都沒掌握,比如操作系統的源碼、網絡協議知識、Windows 的注冊表、進程和線程的基礎知識、硬件驅動方面的知識、ActiveX、Windows 龐大的 API,又是一個等等等等,這些基礎知識的學習和掌握可是要花費大量時間的,你再一次深切地感到時間太不夠用了,因為這時的你大概有許多俗務纏身了,所以有點沮喪,還不用提IT業每天不知有多少新東西在發布,KAO,永遠都跟不上,越拉越遠了。哎!別氣餒,振作一點,你還是忘記了自己是個職業人,既然好多東東在工作中你永遠都沒機會用,那么干嘛要學呢?用什么才學什么,最多預測到馬上要用什么,先一步學什么好了,要知道沒有人是真正的、無所不精的全科大夫,除非你是神,但如果你還在耐著性子看這篇文章,你肯定是個人嘛。

            OK,一般工作后三五年,你經歷了上述過程,經受了誘惑和考驗,終于明白了一個道理:你要的是強勁的學習知識的能力,是對某種軟件知識/技能的有深度的精通,一種摸到它的根的深度,而不是已掌握的技能的種類和數量。這時無論誰用他掌握了多少種你不會的技能來嚇唬你都沒用,你對他的層次只有蔑視。通過幾年的學習和工作,要記住最重要的一點,永遠最重要:對自己學習IT知識能力的自信,一個程序員一生都要不停地進行高強度的學習,用心問問自己,有沒有這個自信?別用虛榮心來騙自己哦,如果沒有的話,那就不必花費你寶貴的時間向下看了,作者在此感謝你有耐心看到這里,現在建議你關閉這篇文章,趁著年輕,當機立斷轉行吧!

            三、注重邏輯:成為一名職業程序員

            好,再前進一點點,你就要成為一名職業程序員了,讓我們繼續來完成這個任務吧!我們在前一節提到過,“你發現一些個別的demo是極品,它所展現的程序邏輯結構是你設計不出來的,你現在有點更關心它的程序設計構架,甚于對你原始目的(某種相關的技術/技巧)的關注”,其實你是在關注這個demo程序作者的思維邏輯,所有程序的本質就是邏輯。技術你已經較好地掌握了,但只有完成邏輯能力的提高,你才能成為一名職業程序員。打一個比方吧,你會十八般武藝,刀槍棍棒都很精通,但就是力氣不夠,所以永遠都上不了戰場,這個力氣對程序員而言就是邏輯能力(其本質是一個人的數學修養,注意,不是數學知識)。邏輯能力也是逐步提高的,開始時你一定是用直觀的邏輯能力來編程的,怎么想就怎么編,不對就再改,在改進中提高自己的邏輯能力,從直觀邏輯能力提高到抽象邏輯能力,這是很正常的。提前說一句吧,到達邏輯能力的至高境界,其表現是用數學語言來描述問題和問題的解決辦法,高度抽象!好,說回來吧,你要提高邏輯能力,最快的辦法就是讀別人寫的結構優秀的程序。優秀的代碼是百讀不厭的(這句話是我抄來的),暫時放放對其中某種技術和技巧的關注吧,你要推導和學習的是這些好程序的邏輯結構,它們是被精心設計出來的。你可以先捂住這個demo程序,自己設計一個功能相同的程序結構,然后比較一下demo的程序結構,如果差距較大,那你就不應簡單地改進一下,而是要把demo作者設計的過程在心里復原一遍,做到這一點也許有點困難,但這種事干的多了,你就會越干越快,越來越得心應手,你的邏輯能力飛速提升,你能看得上的邏輯結構優秀的程序開始不多了,下一步就是練習。從工作中開始吧,如果你有空閑,你需要做至少兩類練習,一類是算法練習,所有的經典算法都是經典的邏輯,題目有的是,像個好學生一樣吧,每年的國內國際編程競賽都有邏輯要求非常高的題,你可以只選一兩道難題來做做。當你可以把復雜的單遞歸程序(只有A調A)變成非遞歸程序時,已經不錯了,如果你能看得懂雙遞歸程序(A調A、A調B、B調A、B調B都有),我為你鼓掌!你不必往下看了,我有點不好意思啦――班門弄斧,你快滾蛋吧!另一類是把以前和當前你工作中你不滿意的程序推倒重新設計一遍,這非常重要,省時省力,因為你熟悉需求,技術上也沒問題,目的就是改進程序的邏輯結構,很劃算哦,唯一要克服的就是:你對推翻以前工作中那點小小成就的心理障礙,如果你真想優秀,說句粗話:這點心理障礙算個屁,一遍遍反復地推倒已有的成果只能使自己快速進步,放手干吧,沒什么好可惜的,馬恩早就在《共.產.黨宣言》里說過了:在這個過程中,你失去的只有鎖鏈(禁錮你思想的鎖鏈)。

            讓我們來總結一下,經過自我否定后,再生的你盡管對過去的“業績”還有一些眷戀,但已是一個初步具備職業水準的程序員了,掌握了相應的技術和技巧,具備了較高的抽象邏輯思維能力,最主要的特征是:能自覺地自我否定,不斷地追求更高水平的邏輯能力。

            在這個過程中,如果你能注意以下一些小的方面,你前進的步伐也許會快一些。

            l 從編譯原理的角度來理解你工作中使用的高級語言,如果你做到這一點,至少有兩個好處,第一個好處是避免一大堆低水平重復出現的編譯錯誤。一名優秀的Coder平均在一個工作日中應該完成200行以上的源碼,其編譯錯誤應該控制在5個以下,要知道這200行源碼不是一次完成的,所以大多數情況下你都要追求一次編譯通過,而一名職業水準的程序員,應該進一步做到即使用purify這類的工具來檢查源碼,也不會存在嚴重的內存泄露。第二個好處是可以提高源碼的可讀性和效率。規范地編寫你的代碼使你自己的邏輯清晰,因為你明白多加幾個括號和空行、多換行對齊、多注釋,編譯器是會自動識別的,不影響程序執行的效率,反過來,控制好遞歸調用和循環內的if語句才是提高程序效率的關鍵,要全力避免遞歸,但要深刻理解遞歸,能通過自己建立堆棧來把遞歸程序轉換成非遞歸程序,要求還是較高的哦!

            l 避免思維陷阱,只要你是人就一定有自己的思維慣性,這一定又會表現在你的程序邏輯中,有時你就是從這個慣性中跳不出來(誰都有這個時候),但要心里有數才行,所以你需要幫助,如果你有幾個水平相若或更高的職業伙伴,太好了,當遇到花30分鐘還打不下的bug時,就別浪費時間了,找他們吧,最要緊的是能思路清晰明確地表述你的問題,通常你自己在這個過程中或者伙伴中就有人把問題解決了,又快又好。另外,有幾個可以良性競爭的職業伙伴是人生的一件幸事,1+1>2,大家各有所長,你最好做到及時公開你的成果,技不壓身嘛,IT發展的這么快,你再優秀,那點東東也沒有什么值得隱藏的,所以你可以技術或水平不夠高,但千萬不可以讓真正具有職業水準的選手鄙視你的職業品質和行為。

            l 有自己debug的特點,下面的說法作者不敢太肯定,只是經驗之談。即使在VC這種高度完善的開放環境下,你仍然應該要求自己僅憑打印語句就能debug。這也有兩點好處,第一個好處是,遇到bug你會認真想問題所在,而不是用debug工具一步步簡單地追蹤卡在哪兒了,你定位bug范圍的方式是從大到小、從粗到精,這是一種自頂向下的思維方式,而用工具追蹤,容易形成自底向上的思維方式,這不算好,你應該先看到森林,再看到樹木。我反復提及:程序就是邏輯過程,大多數程序從main函數開始,是由數據結構和功能子程序組成的一個樹形結構的邏輯過程(要認清即使是面向對象的程序語言也是一樣的),它的執行過程是深度優先的,但你定位bug應該是廣度優先的,好好想想這一點,嗯?第二個好處是強迫你思考并記住而不是用工具看到調用過程,你大腦的抽象邏輯思維能力和胳膊上肌肉的力量一樣,都是練出來的,如果你的bug是程序結構上的邏輯錯誤引起的,這一點就非常重要了,順便說一句,最難打的bug就是程序邏輯結構錯誤導致的bug。你要是真正明明白白地認識到這兒了,那我就沒什么東西可以告訴你了。總之,程序員的職業水準:生產效率和程序質量,主要是取決于源碼中bug的數量和debug的速度,而不是取決于編寫源碼的速度。給你一個我自己定義的考查一個職業程序員的指標:一個合格水準的職業程序員,編程的時間如果算一份的話,其累計debug的時間不能超過一份,真正職業高手累計debug的時間應該控制在0.5份以下,如何?你關上門悄悄問問自己,你花費在編程和debug上的時間比例是多少?如果你把程序員作為自己一生的職業,那么就永遠都要牢記一點:追求做一個0 bug的優秀程序員!這是任何一個想成為職業程序員的人的理想,請相信:堅忍不拔地追求實現這個理想將讓你出類拔萃!

            l 做好程序的單元測試,這是另一項考查你是否是一名具有合格職業水準的程序員的一個必要指標。其實在你拿到需求的時候就要準備單元測試用例了,并且這些用例將直接影響你的詳細設計(有關軟件設計本來是該放在第四節講的)。我們還是打比方吧,當你拿到一個需求時,除了分析它靜態的功能外,還應明確它動態的操作/執行過程,把這個動態過程明確地用流程圖畫出來,比如分為A~Z的26步,其中A又可以進一步分解為A1~A5的5步,直到不能再分解為止。又比如說A3步不可分解了,那么你應該把A3步的正常操作和所有五花八門的異常操作都列出來,確保正常的操作肯定正確,異常的操作起碼程序不退出才行。這樣你就要寫好多好多的測試用例,說句老實話,我也從來不寫!但我一般會列一個提綱,比如A3步有正常的操作a、b、c、d、e共5項,異常的操作有f、g、h、i、j、k、l、m、n共9項,你在進行單元測試時都應該跑一遍,這樣的程序都還不敢說質量如何好,但起碼可以說較穩定吧!如果要想在進行單元測試時干得快、效率高,那么在進行詳細設計時,你就應該把A3步中對所有正常操作和異常操作的判斷都設計好,在編程實現A3步時,使得程序的結構合理高效,對不對?所以,如果你在工作中是割裂地看待軟件工程中從需求、分析、設計、編程、測試等各個環節,恐怕水平很有限喔!但如果你在分析需求時就能看到測試的問題,并改進設計和實現,為此做好相應的準備工作,嘿嘿,整個軟件開發過程你的效率會高很多,通常你在一個開發團隊中就會高度自信的,你已越過當一名偏頗、露骨的高手的境界,成為一個平靜的高手,這可是The best in the best!,用周星星的話說:是高手之高高手,因為別人看不出你高在哪兒,沒見你有什么高招或特拚命干,但反正你就是干得又快又好、又省力。關于進行單元測試還有很多復雜的方法,在此本文只提到了最基本的一點,目的是讓你在工作上考慮周全、安排有序,其它的自己琢磨吧,沒有人能替你吃飽飯!

            l 如果你是用C++編程,我再簡單談談有關內層釋放的一個小技巧,就是對所有你編寫的類,在構造和析構函數中加打印語句,統計每個類在運行程序時構造和析構的地方,如果是配對的,那么起碼沒有對象類一級的內層在程序運行結束時沒有釋放,然后你就可以把打印語句刪掉了,招數雖土,但管用!

            l 還有其它一些好習慣,在這里我隨筆寫一些,你要是有不同看法也請一笑過之吧。編程時應該對齊縮進,一個縮進用一個tab鍵,一般是4個空格,嚴格遵守開發團隊的編程規范也是非常重要的。一個子程序不應超過30行(不算空行),其內多重循環不應超過3層,否則都應該分裂成兩個子程序,個別算法程序可以長一些,但也不宜超過200行。通常一個類的所有成員函數總和不宜超過1500行,多了就應該考慮分解成兩個類(這個工作最好在設計時就完成)。每完成一小段程序,比如15~30行,就立即編譯運行,不要假裝高手,先敲它一大堆程序,再編譯運行,妄想一次成功,體驗一種假爽的、虛榮的快感,或炫耀給別人看,這么做只能證明自己是一個不折不扣的傻瓜,裝酷而已。因為只要有一次不成功,你就會花費大量的時間來調程序,別人的進度在這時就遠遠地超過你了,平常心是道,還是修煉真功夫吧!孫子兵法里關于這一點有明確的闡述,我就不引用了,但建議你真的不要這么干,除非你確實就是這樣總是一次就成功的天才,那你還看這篇文章干什么呢?我又不是寫給你們這些天才們看的。再就是有學會買好書、讀好書,關于計算機和軟件方面的書太多了,時間有限,比如有一個叫侯捷的家伙,幾乎寫的每本書都不錯,張國峰的C++編程也不錯,這只是我的個人意見啊,好書多著呢,列出來比這篇文章長好多倍,我就不多說了。還有一招,要是你運氣好,能搞到一些著名軟件系統的源碼,好好讀讀吧,在此我只能告訴你,Linux操作系統的一些源碼不錯,是開放的,你可以合法地搞到,其它的不要說是我建議你侵犯知識版權啊!

            四、天生神力:成為系統分析員

            本來就論述如何成為一名職業程序員而言,本文已基本完成任務了,但《菜根譚》有言:竭世機樞,似一滴投于巨壑,窮諸玄辯,若一毫置于太虛。既已乘興到此,何妨多置一毫于太虛呢,作者不才,干脆盡興寫算了。

            你要是運氣好,直接進入了一個嚴格規范生產的軟件企業就業,剛開始就應該是按別人做好的軟件設計來實現編程,你可以有機會直接學習軟件設計,當你積累的足夠多了,能夠對其中的一些設計提出好的改進建議,而且干得又快又好,就會漸漸地展露頭角,我相信你終有一天成為一名軟件設計人員(注意,不是軟件產品設計人員),步入系統分析員的行列,但這還需其它的一些條件和自我修煉。如果你在一個不規范的軟件企業工作,那也不錯,你很可能直接就有機會進行軟件設計,然后開發、測試,甚至還不得不自己定義需求,把軟件開發過程的各個環節走一個遍,當然這樣對你的要求更高,而且你也不容易得到及時有益的指點,在正態分布的情況下,你應該是成長的很慢。但不管就業的單位如何,如果你決心要成為頂尖軟件職業選手,通常什么客觀困難都阻擋不了你,然而你個人的因素可能會阻止你的前進。下面提出的觀點純屬一己之見,傷人自尊之處作者在此提前道歉,并建議你除非對本文有強烈的興趣,否則就請直接看第五節或放下別看了。丑話已說在前頭了,在各種軟件開發組織的發展過程中的事實也證明,只有少數程序員能成為系統分析員,我想這一點不是我杜撰的吧,因此你要是在看接下來的部分時感到氣憤難當,那也實在沒著,純屬活該,因為作者只是在說明自己的觀點而已,你最多可以呲之以鼻,表示一下你的輕蔑好了,但沒有任何理由可以罵人!

            作者自己沒有到微軟面試過,但身處軟件行業,關于微軟的許多東東當然還是有耳聞的,據說微軟招聘一名程序員要過五個已經成為微軟程序員的面試關,而且是一票否決制,又據說大多數面試題并非編程,而是一些有關邏輯和智力的題,作者私下也做過許多流傳的微軟面試題,并對此做法深以為然。程序的本質就是邏輯,所以幾十年前就有人提出編程是一門藝術,而藝術是要靠天份的,這一點少有人反對。一個人的邏輯能力可以不斷提高,但其能到達的終極邏輯能力的層次必定為其天生智力所限制,這一點就讓人不易接受了。好笑啊!人們可以公開承認自己沒有某種或全部的藝術天份,但要說自己邏輯天份不夠,換句話說承認自己笨、IQ不夠高,往往是要怒發沖冠的,其實這又有什么區別呢?話都說到這兒了,再次建議你如果不夠自信,就跳過這一節吧,直接看第五節,好嗎?

            好了,把話題說回來,你已經成為一門合格的職業程序員了,如果要想成為從事軟件系統設計的職業系統分析員,第一件事就是悄悄找一個標準智商測試的網站或其它渠道,嚴格認真的測一測自己的智商,如果IQ低于130 (正常智商是110),就請別費勁了,打消掉成為系統分析員的念頭吧!好!好!先請你冷靜一下,好好想想,其實微軟面試時就是在測你的智商和邏輯數學素質呢,這就是本節的標題為“天生神力”的原因,因為設計就是從無到有地進行創造,無論是軟件還是其它行業都一樣,可以有借鑒的,沒有現成的,設計就是創造!如果你IQ在130以上,又決心要當一名職業軟件系統分析員,其實你不過是要準備好吃更大的苦而已,有什么好虛榮的呢?

            修煉還是從基本功開始的,過程和成為一名職業程序員差不多。必須使用設計工具這一點是不用多說的。在工作中,你基本上遇到的是兩類方式的設計,一個是結構化設計,另一個是面向對象設計,就個人經驗而言,面向對象的設計更好。如果你工作中不得不采用結構化的設計,你必須熟練地掌握數據流圖和控制流圖的分析和設計,一般來講,如果你把一個軟件中用到的數據模型設計好了,針對功能化的流程,不難設計出數據流圖,但下一步設計控制流圖才是挑戰,如果你按照需求走不通設計好的控制流圖,那么你或別人在按照這個設計編程實現時,必定也走不通,沒有奇跡會發生,還是在設計階段嚴格要求吧,又有一點需要牢記:返工是最慢的。當你在進行控制流圖的設計時,也不要妄想得到需求人員提供給你明確的指點,通常他們要是能夠把需求的功能和操作次序寫完整的話,你應該就感恩戴德了,從需求中整理出功能、操作的拓撲次序和條件是你作為系統分析員的職責。看看,要是沒有一點圖論的基礎和拓撲學的入門知識,你是當不好一個職業系統分析員的,即使你天賦不錯,必要的數學和邏輯素質仍然不可或缺。也不用氣餒,永遠沒有最好的設計,只有更好的設計,反復地進行設計迭代,勇于推翻舊的設計,你將快速進步。如果你在工作中是采用面向對象進行設計的,那就更有利了,有關面向對象設計的書太多了,不用作者在此多費口舌,建議精讀一本經典的書,比如北大邵維忠等編譯的《面向對象的分析》,有些方法和技巧可能過時,但其邏輯的基本原理是非常正確的,其本質是,你在邏輯上是如何認識這個世界的,你就是如何設計軟件體系結構的,然后讀讀其它書,觸類旁通,自己創造機會多實踐,成功自然會到來的,總之,不管是結構化設計還是面向對象設計,評價一下自己的軟件系統設計方案吧,有好多指標呢,比如是否均勻和平衡?局部獨立性強不強?有沒有歧異的結構?有沒有層次太多或太少?有沒有某個層次太大、太廣?是不是邏輯結構先復雜了再化簡的?還是只會設計簡單的,復雜不起來(這一點是笨哦,如果出現多次,請你不要意氣用事,轉行吧)?最重要的一點,是否容易理解、實現和改進?你自己會得出評價的。如果有機會看到別人的設計,一定不要錯過學習的機會,自己推導一遍,認真比較比較,獲益會較多。

            走到這一步,你就應該關注設計模式了,首先還是學習,這方面的好書有的是,但一般在工作中用到的設計模式較為單一,應該多嘗試一下其它的設計模式。其次必須要明白設計模式不是設計思路,也不能代替設計思路,比方你要從A到B修一條路,設計模式只是讓你選擇,是修水泥的還是柏油的?是高架路還是普通的,但線路必須你自己定,而線路就是設計思路,模式對思路是有影響,但不能代替,所以如果你的智商高達250,我相信你直接用匯編語言也能寫出面向對象的程序來。第三在此有一個陷阱,很多系統分析員生搬硬套設計模式,全然不懂如何融會貫通,在你的一項具體工作中,往往是以一種設計模式為主,其它模式為輔的,思維不拘泥于形式才是關鍵,而且也為你到達更高的軟件設計的境界做好準備。

            唉!都不知該怎么向下寫好了,因為已達到作者水平的極限了,我胡亂說一點,你湊合看吧。軟件設計最終的層次是:以無法為有法、以無限為有限,這句話是李小龍說的,不是我說的。再拾人牙慧一把,類比一個故事吧,金大俠在《倚天屠龍記》里講到張無忌初學太極,學會的標志是把剛學的招數全忘了,記住的是太極的道理和精神,和李小龍有些相似喔,軟件設計也一樣,忘記所有的設計模式,隨心所欲進行設計才是至高境界,所以你能到達多高的軟件設計的境界最終將取決于你的哲學素質,這一點實在是不好寫啊,你自己領悟吧!作者只有祝福了!

            五、職業人的終極目標:全面修煉,成為Leader

            這一節更不好寫,涉及到太多其它非技術方面的因素,特別是個人人生觀和世界觀的修煉,如果本帖的點擊率超過作者私下期望的一個數值,那我就爭取盡力厚著臉皮再補上吧。我只說一句,雖然大家都知道軟件開發是一個團隊性的工作,但追求參與一個大型軟件系統的成功開發,是一名軟件人員的本能,就像拿破侖說的不想當元帥的士兵不是好士兵,所以不追求實現大系統的軟件人員,也不是一個好的職業軟件人員,但你只有成為Leader,領導一個優秀的軟件開發團隊,才有機會實現這個終極職業目標,對不對?

            好吧,不管你現在的感受如何,我都謝謝你能讀到這里!我不習慣假歉虛,就不說什么作者水平有限,本文拋磚引玉,歡迎大家批評斧正之類的客套話了,雖然作者水平確實有限。所以我認為你盡管有權砸磚,但實在沒必要搞回帖、或回罵、或頂之類的玩意兒,我只是盡興寫一點多年從事軟件開發工作的體驗,因此接下來我就高掛免戰牌,不回復任何回帖了。再次謝謝你能有耐心讀到這里!希望本文對你有所裨益,祝你成功!再見!


            祝賀你,你當然是......

            posted @ 2006-07-21 19:27 人生亦編程 閱讀(132) | 評論 (0)編輯 收藏

            RSS是站點用來和其他站點之間共享內容的一種簡易方式(也叫聚合內容),通常被用于新聞和其他按順序排列的網站,例如Blog。一段項目的介紹可能包含新聞的全部介紹等。或者僅僅是額外的內容或者簡短的介紹。這些項目的鏈接通常都能鏈接到全部的內容。網絡用戶可以在客戶端借助于支持RSS的新聞聚合軟件(如FeedDemon、SharpReader,NewzCrawler),在不打開網站內容頁面的情況下閱讀支持RSS輸出的網站內容。網站提供RSS輸出,有利于讓用戶發現網站內容的更新。

            RSS如何工作?
            首先您一般需要下載和安裝一個RSS新聞閱讀器,然后從網站提供的聚合新聞目錄列表中訂閱您感興趣的新聞欄目的內容。訂閱后,您將會及時獲得所訂閱新聞頻道的最新內容。

            閱讀RSS新聞的特點?
            1.沒有廣告或者圖片來影響標題或者文章概要的閱讀。
            2.RSS閱讀器自動更新你定制的網站內容,保持新聞的及時性。
            3.用戶可以加入多個定制的RSS提要,從多個來源搜集新聞整合 到單個數據流中。


            隨著網絡的普及,越來越多的人習慣通過網絡來獲取信息、查詢資料。雖然各種各樣的門戶網站紛紛興起,但在各個網站之間來回穿梭也的確是十分麻煩,搜索引擎可以幫助我們搜索到任何想要找的東西,但查找起來也比較麻煩。現在網絡上出現了一種全新的資訊方式,他可以把我們定閱的各種資訊送到我們的桌面上來,不但可以及時了解最新的新聞資訊,而且免去了瀏覽網站時惱人的網絡廣告,這種最新的資訊方式被叫做信息聚合,簡稱RSS。
            通過RSS技術,我們可以把定閱的最新的資訊接收到電腦桌面上,要接收RSS信息,使用RSS閱讀器是最好的方法。當網站內容更新時,RSS閱讀器就會自動接收,把最新的信息接收到本地電腦桌面上來,同時可以看到最新信息的標題與摘要,點擊標題就能夠查看全文內容了。自從去年國內“博客”的興起,使的RSS資源漸漸多了起來,同時各大網站也紛紛推出了RSS服務,通常只要看到網站上有XML標志,就說明該網站提供RSS服務。
            FeedDemon、看天下網絡資訊瀏覽器 、新浪點點通閱讀器、周博通等是常見的RSS閱讀器。
            參考資料:天極網

            posted @ 2006-07-21 19:00 人生亦編程 閱讀(116) | 評論 (0)編輯 收藏

            聯合(union)在c/c++里面見得并不多,但是在一些對內存要求特別嚴格的地方,聯合又是頻繁出現,那么究竟什么是聯合、怎么去用、有什么需要注意的地方呢?

            1、什么是聯合?
               “聯合”是一種特殊的類,也是一種構造類型的數據結構。 在一個“聯合”內可以定義多種不同的數據類型, 一個被說明為該“聯合”類型的變量中,允許裝入該“聯合”所定義的任何一種數據,這些數據共享同一段內存,已達到節省空間的目的(還有一個節省空間的類型:位域)。 這是一個非常特殊的地方,也是聯合的特征。另外,同struct一樣,聯合默認訪問權限也是公有的,并且,也具有成員函數。

            2、聯合與結構的區別?
               “聯合”與“結構”有一些相似之處。但兩者有本質上的不同。在結構中各成員有各自的內存空間, 一個結構變量的總長度是各成員長度之和(空結構除外,同時不考慮邊界調整)。而在“聯合”中,各成員共享一段內存空間, 一個聯合變量的長度等于各成員中最長的長度。應該說明的是, 這里所謂的共享不是指把多個成員同時裝入一個聯合變量內, 而是指該聯合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。

            3、如何定義?
               例如:
                union test
                <
                  test() < >
                  int office;
                  char teacher[5];
                >;
                定義了一個名為test的聯合類型,它含有兩個成員,一個為整型,成員名為office;另一個為字符數組,數組名為teacher。聯合定義之后,即可進行聯合變量說明,被說明為test類型的變量,可以存放整型量office或存放字符數組teacher。

            4、如何說明?
               聯合變量的說明有三種形式:先定義再說明、定義同時說明和直接說明。
               以test類型為例,說明如下:
                1) union test
                   <
                     int office;
                     char teacher[5];
                   >;
                   union test a,b;    /*說明a,b為test類型*/
                2) union test
                   <
                     int office;
                     char teacher[5];
                   > a,b;
                3) union
                   <
                     int office;
                     char teacher[5];
                   > a,b;
                   經說明后的a,b變量均為test類型。
                a,b變量的長度應等于test的成員中最長的長度,即等于teacher數組的長度,共5個字節。a,b變量如賦予整型值時,只使用了4個字節,而賦予字符數組時,可用5個字節。

            5、如何使用?
               對聯合變量的賦值,使用都只能是對變量的成員進行。
               聯合變量的成員表示為:聯合變量名.成員名 
               例如,a被說明為test類型的變量之后,可使用a.class、a.office 
               不允許只用聯合變量名作賦值或其它操作,也不允許對聯合變量作初始化賦值,賦值只能在程序中進行。
               還要再強調說明的是,一個聯合變量,每次只能賦予一個成員值。換句話說,一個聯合變量的值就是聯合變員的某一個成員值。

            6、匿名聯合
               匿名聯合僅僅通知編譯器它的成員變量共同享一個地址,而變量本身是直接引用的,不使用通常的點號運算符語法.例如:
                 #include <iostream>
                 void main()
                 <
                     union< 
                            int test;
                            char c; 
                           >;         
                    test=5;
                    c=a;
                    std::cout<<i<<" "<<c;
                 >
                正如所見到的,聯合成分象聲明的普通局部變量那樣被引用,事實上對于程序而言,這也正是使用這些變量的方式.另外,盡管被定義在一個聯合聲明中,他們與同一個程序快那的任何其他局部變量具有相同的作用域級別.這意味這匿名聯合內的成員的名稱不能與同一個作用域內的其他一直標志符沖突.
                對匿名聯合還存在如下限制:
                因為匿名聯合不使用點運算符,所以包含在匿名聯合內的元素必須是數據,不允許有成員函數,也不能包含私有或受保護的成員。還有,全局匿名聯合必須是靜態(static)的,否則就必須放在匿名名字空間中。

            7、幾點需要討論的地方:
               1、聯合里面那些東西不能存放?
                  我們知道,聯合里面的東西共享內存,所以靜態、引用都不能用,因為他們不可能共享內存。
               2、類可以放入聯合嗎?
                  我們先看一個例子:
                  class test
                  <
                  public:
                test():data(0) < >
                  private:
                      int data;
                  >;

                 typedef union _test
                 <
             test test;   file://??????
                 >ui;  
                 編譯通不過,為什么呢?
                 因為聯合里不允許存放帶有構造函數、析夠函數、復制拷貝操作符等的類,因為他們共享內存,編譯器無法保證這些對象不被破壞,也無法保證離開時調用析夠函數。
                3、又是匿名惹的禍??
                   我們先看下一段代碼: 
             class test
             <
                    public:
                         test(const  char* p);
                         test(int in);
                         const operator char*() const
                         operator long() const
                    private:
                 enum type ;
                        union
                 <
              const char* ch;
              int i;
                  >datatype;
                  type stype;
                  test(test&);
                  test& operator=(const test&);
                    >;
                   test::test(const  char *p):stype(string),datatype.ch(p)     < >
                   test::test(int in):stype(int),datatype.l(i)     < >
                 看出什么問題了嗎?呵呵,編譯通不過。為什么呢?難道datatype.ch(p)和datatype.l(i)有問題嗎?
                 哈哈,問題在哪呢?讓我們來看看構造test對象時發生了什么,當創建test對象時,自然要調用其相應的構造函數,在構造函數中當然要調用其成員的構造函數,所以其要去調用datatype成員的構造函數,但是他沒有構造函數可調用,所以出錯。
                 注意了,這里可并不是匿名聯合!因為它后面緊跟了個data!
                4、如何有效的防止訪問出錯?
                   使用聯合可以節省內存空間,但是也有一定的風險:通過一個不適當的數據成員獲取當前對象的值!例如上面的ch、i交錯訪問。
                   為了防止這樣的錯誤,我們必須定義一個額外的對象,來跟蹤當前被存儲在聯合中的值得類型,我們稱這個額外的對象為:union的判別式。
                   一個比較好的經驗是,在處理作為類成員的union對象時,為所有union數據類型提供一組訪問函數。

            posted @ 2006-07-21 12:56 人生亦編程 閱讀(206) | 評論 (0)編輯 收藏

            如何定義網絡協議,它有哪些意義?
            ??? 協議是對網絡中設備以何種方式交換信息的一系列規定的組合,它對信息交換的速率、傳輸代碼、代碼結構、傳輸控制步驟、出錯控制等許多參數作出定義。

              網絡是一個相互聯結的大群體,因此要想加入到這個群體中來,就不能隨心所欲,任由興之所發。就好象一個國家或一個種族擁有自己的語言,大家都必須通曉并憑借這種語言來對話一樣,相互聯結的網絡中各個節點也需要擁有共同的“語言”,依據它所定義的規則來控制數據的傳遞,這種語言便是大家經常聽說的 “協議”。協議是對網絡中設備以何種方式交換信息的一系列規定的組合,它對信息交換的速率、傳輸代碼、代碼結構、傳輸控制步驟、出錯控制等許多參數作出定義。

              對網絡始入門者來說,紛繁復雜的協議常常讓人頭痛不已—這些協議各起什么作用?它們之間又有什么聯系?為什么有了A協議還需要補充B協議?這些問題搞不清楚,往往成為進一步學習的障礙。其實這個問題應該這樣理解:是先有了各種不同語言的民族,后來隨著社會的發展,才有了不同民族間交流的需求。網絡也是這樣,最初人們在小范圍內建立網絡,只需要自己作一些簡單的約定,保證這一有限范圍內的用戶遵守就可以了;到后來網絡規模越來越大,才考慮到制定更嚴格的規章制度即協議;而為了實現多個不同網絡的互聯,又會增加不少新協議作為補充,或成長為統一的新標準。

              數據在網絡中由源傳輸到目的地,需要一系列的加工處理,為了便于理解,我們這里不妨打個比喻。如果我們把數據比做巧克力:我們可以把加工巧克力的設備作為源,而把消費者的手作為目的來看看會有什么樣的傳輸過程。巧克力廠通常會為每塊巧克力外邊加上一層包裝,然后還會將若干巧克力裝入一個巧克力盒,再把幾個巧克力盒一起裝入一個外包裝,運輸公司還會把許多箱巧克力裝入一個集裝箱,到達消費者所在的城市后,又會由運輸商、批發商、零售商、消費者打開不同的包裝層。不同層次的包裝、解包裝需要不同的規范和設備,計算機網絡也同樣有不同的封裝、傳輸層面,為此國際標準化組織ISO于1978 年提出“開放系統互連參考模型”,即著名的OSI(Open System Interconnection)七層模型,它將是我們后續篇幅中要介紹的內容,這里先不展開論述。 網絡的協議就是用作這些不同的網絡層的行為規范的。網絡在發展過程中形成了很多不同的協議族,每一協議族都在網絡的各層對應有相應的協議,其中作為Internet規范的是ICP/IP協議族,這也是我們今天要講的。

            TCP/IP協議的定義以及層次、功能

            什么是TCP/IP協議,劃為幾層,各有什么功能?
              TCP/IP協議族包含了很多功能各異的子協議。為此我們也利用上文所述的分層的方式來剖析它的結構。TCP/IP層次模型共分為四層:應用層、傳輸層、網絡層、數據鏈路層。

            TCP/IP網絡協議
              TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協議/網間網協議)是目前世界上應用最為廣泛的協議,它的流行與Internet的迅猛發展密切相關—TCP/IP最初是為互聯網的原型ARPANET所設計的,目的是提供一整套方便實用、能應用于多種網絡上的協議,事實證明TCP/IP做到了這一點,它使網絡互聯變得容易起來,并且使越來越多的網絡加入其中,成為Internet的事實標準。

            * 應用層—應用層是所有用戶所面向的應用程序的統稱。ICP/IP協議族在這一層面有著很多協議來支持不同的應用,許多大家所熟悉的基于Internet的應用的實現就離不開這些協議。如我們進行萬維網(WWW)訪問用到了HTTP協議、文件傳輸用FTP協議、電子郵件發送用SMTP、域名的解析用DNS協議、 遠程登錄用Telnet協議等等,都是屬于TCP/IP應用層的;就用戶而言,看到的是由一個個軟件所構筑的大多為圖形化的操作界面,而實際后臺運行的便是上述協議。

            * 傳輸層—這一層的的功能主要是提供應用程序間的通信,TCP/IP協議族在這一層的協議有TCP和UDP

            * 網絡層—是TCP/IP協議族中非常關鍵的一層,主要定義了IP地址格式,從而能夠使得不同應用類型的數據在Internet上通暢地傳輸,IP協議就是一個網絡層協議。

            * 網絡接口層—這是TCP/IP軟件的最低層,負責接收IP數據包并通過網絡發送之,或者從網絡上接收物理幀,抽出IP數據報,交給IP層。

            1.TCP/UDP協議
              TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)協議屬于傳輸層協議。其中TCP提供IP環境下的數據可靠傳輸,它提供的服務包括數據流傳送、可靠性、有效流控、全雙工操作和多路復用。通過面向連接、端到端和可靠的數據包發送。通俗說,它是事先為所發送的數據開辟出連接好的通道,然后再進行數據發送;而UDP則不為IP提供可靠性、流控或差錯恢復功能。一般來說,TCP對應的是可靠性要求高的應用,而UDP對應的則是可靠性要求低、傳輸經濟的應用。TCP支持的應用協議主要有:Telnet、FTP、SMTP等;UDP支持的應用層協議主要有:NFS(網絡文件系統)、SNMP(簡單網絡管理協議)、DNS(主域名稱系統)、TFTP(通用文件傳輸協議)等。

            IP協議的定義、IP地址的分類及特點

            什么是IP協議,IP地址如何表示,分為幾類,各有什么特點?
              為了便于尋址和層次化地構造網絡,IP地址被分為A、B、C、D、E五類,商業應用中只用到A、B、C三類。

              IP協議(Internet Protocol)又稱互聯網協議,是支持網間互連的數據報協議,它與TCP協議(傳輸控制協議)一起構成了TCP/IP協議族的核心。它提供網間連接的完善功能, 包括IP數據報規定互連網絡范圍內的IP地址格式。

              Internet 上,為了實現連接到互聯網上的結點之間的通信,必須為每個結點(入網的計算機)分配一個地址,并且應當保證這個地址是全網唯一的,這便是IP地址。

              目前的IP地址(IPv4:IP第4版本)由32個二進制位表示,每8位二進制數為一個整數,中間由小數點間隔,如159.226.41.98,整個IP地址空間有4組8位二進制數,由表示主機所在的網絡的地址(類似部隊的編號)以及主機在該網絡中的標識(如同士兵在該部隊的編號)共同組成。

              為了便于尋址和層次化的構造網絡,IP地址被分為A、B、C、D、E五類,商業應用中只用到A、B、C三類。

            * A類地址:A類地址的網絡標識由第一組8位二進制數表示,網絡中的主機標識占3組8位二進制數,A類地址的特點是網絡標識的第一位二進制數取值必須為“0”。不難算出,A類地址允許有126個網段,每個網絡大約允許有1670萬臺主機,通常分配給擁有大量主機的網絡(如主干網)。

            * B類地址:B類地址的網絡標識由前兩組8位二進制數表示,網絡中的主機標識占兩組8位二進制數,B類地址的特點是網絡標識的前兩位二進制數取值必須為“10”。B類地址允許有16384個網段,每個網絡允許有65533臺主機,適用于結點比較多的網絡(如區域網)。

            * C類地址:C類地址的網絡標識由前3組8位二進制數表示,網絡中主機標識占1組8位二進制數,C類地址的特點是網絡標識的前3位二進制數取值必須為“110”。具有C類地址的網絡允許有254臺主機,適用于結點比較少的網絡(如校園網)。

              為了便于記憶,通常習慣采用4個十進制數來表示一個IP地址,十進制數之間采用句點“.”予以分隔。這種IP地址的表示方法也被稱為點分十進制法。如以這種方式表示,A類網絡的IP地址范圍為1.0.0.1-127.255.255.254;B類網絡的IP地址范圍為:128.1.0.1-191.255.255.254;C類網絡的IP地址范圍為:192.0.1.1-223.255.255.254。

              由于網絡地址緊張、主機地址相對過剩,采取子網掩碼的方式來指定網段號。

              TCP/IP協議與低層的數據鏈路層和物理層無關,這也是TCP/IP的重要特點。正因為如此 ,它能廣泛地支持由低兩層協議構成的物理網絡結構。目前已使用TCP/IP連接成洲際網、全國網與跨地區網。

            posted @ 2006-07-21 12:45 人生亦編程 閱讀(382) | 評論 (0)編輯 收藏

            僅列出標題
            共9頁: 1 2 3 4 5 6 7 8 9 
            久久亚洲高清观看| 少妇精品久久久一区二区三区| 久久无码高潮喷水| 亚洲Av无码国产情品久久| 丁香久久婷婷国产午夜视频| 久久美女人爽女人爽| 精品久久香蕉国产线看观看亚洲 | 99久久精品免费| 久久亚洲精品视频| 久久国产美女免费观看精品| 国内精品久久久久久久久电影网| 国内精品久久久久久久久| 精品久久国产一区二区三区香蕉 | 久久久久99这里有精品10| 精品人妻伦一二三区久久| 欧美激情精品久久久久久久九九九| 人妻少妇精品久久| 99久久精品免费看国产一区二区三区| 97久久国产露脸精品国产| 国产国产成人精品久久| 国产69精品久久久久99| 亚洲&#228;v永久无码精品天堂久久| 一极黄色视频久久网站| 久久婷婷五月综合色奶水99啪| 久久精品人妻中文系列| 国产精品久久永久免费| 久久久久99精品成人片三人毛片| 久久久久久久91精品免费观看| 亚洲中文字幕久久精品无码APP | 亚洲午夜久久久精品影院| 日韩欧美亚洲国产精品字幕久久久| 一日本道伊人久久综合影| 久久精品中文字幕无码绿巨人| 久久综合九色综合久99| 亚洲国产精品综合久久网络| 久久久久AV综合网成人 | 久久只这里是精品66| 精品久久久久久亚洲精品| 久久久久国产成人精品亚洲午夜| 亚洲精品高清国产一线久久| 亚洲国产精品久久|