<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jasmine214--love

    只有當你的內(nèi)心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
    posts - 731, comments - 60, trackbacks - 0, articles - 0

    C -struct結(jié)構(gòu)體的巨大作用

    Posted on 2010-11-29 14:31 幻海藍夢 閱讀(936) 評論(0)  編輯  收藏 所屬分類: C語言學習
    面對一個人的大型C/C++程序時,只看其對struct 的使用情況我們就可以對其編寫者的編程經(jīng)驗進行評估。因為一個 大型的C/C++程序,勢必要涉及一些(甚至大量)進行數(shù)據(jù)組合的結(jié)構(gòu)體,這些結(jié)構(gòu)體可以將原本意義屬于一個整體的數(shù)據(jù)組合在一起。從某種程度上來 說,會不會用struct,怎樣用struct 是區(qū)別一個開發(fā)人員是否具備豐富開發(fā)經(jīng)歷的標志。

          在網(wǎng)絡(luò)協(xié)議、通信控制、嵌入式系統(tǒng)C/C++編程中,我們經(jīng)常要傳送的不是簡單的字節(jié)流(char型數(shù)組),而是多種數(shù)據(jù)組合起來的一個整體,其表現(xiàn)形式是一個 結(jié)構(gòu)體。經(jīng)驗不足的開發(fā)人員往往將所有需要傳送的內(nèi)容依順序保存在char 型數(shù)組中,通過指針偏移的方法傳送網(wǎng)絡(luò)報文等信息。這樣做編程復雜,易 出錯,而且一旦控制方式及通信協(xié)議有所變化,程序就要進行非常細致的修改。


          一個有經(jīng)驗的開發(fā)者則靈活運用結(jié)構(gòu)體,舉一個例子,假設(shè)網(wǎng)絡(luò)或控制協(xié)議中需要傳送三種報文,其格式分別為packetApacketB、packetC


    struct structA


    {



    int a;



    char b;


    };


    struct structB


    {



    char a;



    short b;


    };


    struct structC


    {



    int a;



    char b;



    float c;


    }


    優(yōu)秀的程序設(shè)計者這樣設(shè)計傳送的報文:


    struct CommuPacket


    {



    int iPacketType;
    //
    報文類型標志



    union
    //
    每次傳送的是三種 報文中的一種,使用union



    {



    struct structA packetA; struct structB packetB;



    struct structC packetC;



    }


    };


    在進行報文傳送 時,直接傳送struct CommuPacket 一個整體。


    假設(shè)發(fā)送函數(shù)的原形如下:



    // pSendData
    :發(fā)送字節(jié)流的首地址,iLen:要發(fā)送的長度



    Send(char * pSendData, unsigned int iLen);


          發(fā)送方可以直接進行如下調(diào)用發(fā)送struct CommuPacket 的一個實例sendCommuPacket


    Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );



    假設(shè)接收函數(shù)的原 形如下:



    // pRecvData
    :發(fā)送字節(jié)流的首地址,iLen:要接收的長度



    //
    返回值:實際接收到的字節(jié)數(shù)


    unsigned int Recv(char * pRecvData, unsigned int iLen)


          接收方可以直接進行如下調(diào)用將接收到的數(shù)據(jù)保存在struct CommuPacket 的一個實例recvCommuPacket 中:


    Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );


          接著判斷報文類型進行相應(yīng)處理:


    switch(recvCommuPacket. iPacketType)


    {


    case PACKET_A:



    //A
    類報文處理


    break;


    case PACKET_B:



    //B
    類報文處理


    break;


    case PACKET_C:



    //C
    類報文處理


    break;


    }


    以上程序中最值得注意的是


    Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );


    Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );


    中的強制類型轉(zhuǎn)換:(char *)&sendCommuPacket、(char *)&recvCommuPacket, 先取地址,再轉(zhuǎn)化為char 型指針,這樣就可以直接利用處理字節(jié)流的函數(shù)。


          利用這種強制類型轉(zhuǎn)化,我們還可以方便程序的編寫,例如要 對sendCommuPacket 所處內(nèi)存初始化為0,可以這樣調(diào)用標準庫函數(shù)memset()



    memset((char *)&sendCommuPacket,0, sizeof(CommuPacket));


    原文; http://www.arm16.com/viewthread.php?tid=397

    主站蜘蛛池模板: 很黄很污的网站免费| 国产成人1024精品免费| 亚洲乱人伦中文字幕无码| 亚洲AV成人一区二区三区观看 | 无码专区永久免费AV网站 | 男女啪啪永久免费观看网站| 99久久婷婷国产综合亚洲| 亚洲狠狠色丁香婷婷综合| rh男男车车的车车免费网站| 午夜精品免费在线观看| 成年男女免费视频网站| 国产亚洲自拍一区| 亚洲第一精品电影网| 激情小说亚洲图片| 免费在线看污视频| 免费做爰猛烈吃奶摸视频在线观看| 又粗又大又硬又爽的免费视频| 亚洲三区在线观看无套内射| 亚洲午夜久久久精品电影院| 伊人久久国产免费观看视频| 人妻无码久久一区二区三区免费| 日韩a级毛片免费观看| 亚洲国产精品无码中文字| 最新亚洲春色Av无码专区| 久青草视频在线观看免费| 国产人成免费视频网站| 爱情岛论坛网亚洲品质自拍| 97se亚洲综合在线| 美女黄频a美女大全免费皮| 91青青国产在线观看免费| 亚洲?v女人的天堂在线观看| 亚洲精品在线播放视频| 天堂亚洲免费视频| 一色屋成人免费精品网站| 亚洲精品成人片在线播放| 亚洲精品国产高清在线观看| 污污网站免费观看| 久久精品国产精品亚洲人人| 亚洲精品无码久久久久牙蜜区| 午夜免费福利片观看| 亚洲国产精品成人网址天堂 |