• <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>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            環(huán)形緩沖區(qū)

            來源:http://blog.21ic.com/user1/3253/archives/2006/25241.html


            在通信程序中,經(jīng)常使用環(huán)形緩沖區(qū)作為數(shù)據(jù)結(jié)構(gòu)來存放通信中發(fā)送和接收的數(shù)據(jù)。環(huán)形緩沖區(qū)是一個先進先出的循環(huán)緩沖區(qū),可以向通信程序提供對緩沖區(qū)的互斥訪問。

            1、環(huán)形緩沖區(qū)的實現(xiàn)原理

            環(huán)形緩沖區(qū)通常有一個讀指針和一個寫指針。讀指針指向環(huán)形緩沖區(qū)中可讀的數(shù)據(jù),寫指針指向環(huán)形緩沖區(qū)中可寫的緩沖區(qū)。通過移動讀指針和寫指針就可以實現(xiàn)緩沖區(qū)的數(shù)據(jù)讀取和寫人。在通常情況下,環(huán)形緩沖區(qū)的讀用戶僅僅會影響讀指針,而寫用戶僅僅會影響寫指針。如果僅僅有一個讀用戶和一個寫用戶,那么不需要添加互斥保護機制就可以保證數(shù)據(jù)的正確性。如果有多個讀寫用戶訪問環(huán)形緩沖區(qū),那么必須添加互斥保護機制來確保多個用戶互斥訪問環(huán)形緩沖區(qū)。

            1、圖2和圖3是一個環(huán)形緩沖區(qū)的運行示意圖。圖1是環(huán)形緩沖區(qū)的初始狀態(tài),可以看到讀指針和寫指針都指向第一個緩沖區(qū)處;圖2是向環(huán)形緩沖區(qū)中添加了一個數(shù)據(jù)后的情況,可以看到寫指針已經(jīng)移動到數(shù)據(jù)塊2的位置,而讀指針沒有移動;圖3是環(huán)形緩沖區(qū)進行了讀取和添加后的狀態(tài),可以看到環(huán)形緩沖區(qū)中已經(jīng)添加了兩個數(shù)據(jù),已經(jīng)讀取了一個數(shù)據(jù)。

            2、實例:環(huán)形緩沖區(qū)的實現(xiàn)

            環(huán)形緩沖區(qū)是數(shù)據(jù)通信程序中使用最為廣泛的數(shù)據(jù)結(jié)構(gòu)之一,下面的代碼,實現(xiàn)了一個環(huán)形緩沖區(qū):

            /*ringbuf .c*/

            #i nclude
            <stdio. h>

                #i nclude
            <ctype. h>

            #define NMAX 8

            int iput = 0/* 環(huán)形緩沖區(qū)的當(dāng)前放人位置 */

            int iget = 0/* 緩沖區(qū)的當(dāng)前取出位置 */

            int n = 0/* 環(huán)形緩沖區(qū)中的元素總數(shù)量 */

            double buffer[NMAX]; 

            /*  環(huán)形緩沖區(qū)的地址編號計算函數(shù),,如果到達喚醒緩沖區(qū)的尾部,將繞回到頭部。

            環(huán)形緩沖區(qū)的有效地址編號為:0到(NMAX-1)

            */


            int addring (int i)

            {

                    
            return (i+1== NMAX ? 0 : i+1;

            }


            /* 從環(huán)形緩沖區(qū)中取一個元素 */

            double get{void}

            {

            cnt pos;

            if (n>0){

                       Pos 
            = iget;

                       iget 
            = addring(iget);

                       n
            --;

                       
            return buffer[pos];

            }


            else {

            printf(“Buffer 
            is empty\n”);

            return 0.0;

            }


            /* 向環(huán)形緩沖區(qū)中放人一個元素*/

            void put(double z)

            {

            if (n<NMAX){

                       buffer[iput]
            =z;

                       iput 
            = addring(iput);

                       n
            ++;

            }


            else

            printf(“Buffer 
            is full\n”);

            }


             

            int main{void)

            {

            chat opera[
            5];

            double z;

            do {

            printf(“Please input p
            |g|e?”);

            scanf(“
            %s”, &opera);

                           
            switch(tolower(opera[0])){

                           
            case ‘p’: /* put */

                              printf(“Please input a 
            float number?”);

                              scanf(“
            %lf”, &z);

                              put(z);

                              
            break;

            case ‘g’: /* get */

                              z 
            = get();

            printf(“
            %8.2f from Buffer\n”, z);

            break;

            case ‘e’:

                              printf(“End\n”);

                              
            break;

            default:

                              printf(“
            %- Operation command error! \n”, opera);

            }
            /* end switch */

            }
            while(opera[0!= ’e’);

                
            return 0;

            }


            posted on 2008-07-11 03:38 楊粼波 閱讀(2163) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品国产72国产精福利| 久久久久国产精品嫩草影院| 伊人久久亚洲综合影院| 久久www免费人成精品香蕉| 亚洲国产成人久久精品99| 久久久无码精品亚洲日韩按摩| 久久综合狠狠综合久久综合88| 伊人久久精品线影院| 久久午夜无码鲁丝片秋霞| 久久99精品国产麻豆| 伊人久久成人成综合网222| 99999久久久久久亚洲| 日韩精品久久久久久久电影| 久久se精品一区二区| 狠狠综合久久AV一区二区三区| 亚洲国产成人久久精品影视| 久久AV无码精品人妻糸列| 国内精品久久久久久中文字幕| 久久亚洲AV成人无码电影| 久久精品亚洲男人的天堂| 国产精品一区二区久久国产| 偷偷做久久久久网站| 久久久久久国产精品美女| av国内精品久久久久影院 | 精品久久久一二三区| 国产AⅤ精品一区二区三区久久| 亚洲国产精品一区二区久久hs| 久久久久国产日韩精品网站| 久久综合久久综合久久综合| 久久精品99久久香蕉国产色戒 | 亚洲午夜久久久久妓女影院| 亚洲国产精品无码久久九九| 51久久夜色精品国产| 国产精品久久久天天影视| 99999久久久久久亚洲| 99久久超碰中文字幕伊人| 久久精品卫校国产小美女| 久久精品国产亚洲AV蜜臀色欲 | 77777亚洲午夜久久多人| 国产精品久久久久久久久软件| 久久综合精品国产一区二区三区|