0

アプリケーションの非常に単純な lru ページの置換に次のコードを使用したいと考えていました。buf_recの 2 番目と 3 番目の要素のカウンター常に同じ値であり、その理由がわかりませんでした。

#include<stdio.h>
#include<conio.h>

typedef struct search_cache_rec
    {
        int index;
        int counter;
    }search_cache_rec;
search_cache_rec buf_rec[3];
void inint_buf()
{
    for(int m=0;m<3;m++)
    {
        buf_rec[m].index=-1;
        buf_rec[m].counter=100;
    }
}
int i,j,fs[3];
int ind,k,l,flag1=0,flag2=0,pf=0,frsize=3;

bool search_cache(int *id)
{
    bool status=false;
    flag1=0,flag2=0;

    for(i=0;i<3;i++)
    {
        if(buf_rec[i].index==*id)
        {
            flag1=1;
            flag2=1;
            *tanker_id=i;
            buf_rec[i].counter+=2;
            for(i=0;i<3;i++)
                {
                        //if(buf_rec[i].counter>-1)
                    buf_rec[i].counter--;
                }
            return true;
        }
    }
    if(flag1==0)
    {
        for(i=0;i<3;i++)
        {
            if(buf_rec[i].index==-1)
            {
                buf_rec[i].index=*id;
                flag2=1;
                *tanker_id=i;
                buf_rec[i].counter+=2;
                for(i=0;i<3;i++)
                {
                        //if(buf_rec[i].counter>-1)
                    buf_rec[i].counter--;
                }
                return false;
            }
        }
    }
    if(flag2==0)
    {
        int min=buf_rec[0].counter;

        for(i=0;i<3;i++)
        {
            if(min>buf_rec[i].counter)
            {
                min=buf_rec[i].counter;
                ind=i;
            }
        }
        buf_rec[ind].index=*id;
        buf_rec[i].counter+=2;
        *id=i;
        for(i=0;i<3;i++)
        {
                //if(buf_rec[i].counter>-1)
            buf_rec[i].counter--;
        }
        return false;
    }


}
  void display()
    {
        int i;
        printf("\n");
        for(i=0;i<3;i++)
            printf("\t%d",buf_rec[i].index);
    }

これが私がそれを使用する方法です

#include"lru.h"
#include<string>
#include<iostream>


void main()
{
    int num;
    inint_buf();
    display();
    std::cout<<"\nEnter a num\n";
    std::cin>>num;
    while(num!=-1)
    {
        search_cache(&num);
        display();
        std::cout<<"\nEnter a num\n";
        std::cin>>num;
    }
}
4

4 に答える 4

1

これで問題が解決するかどうかはわかりませんが、

if( flag2 == 0)

indを初期化する必要があります。

ind = 0;

最初の for ループの後の同じ if ブロックで、私は思う

buf_rec[i].counter+=2;

する必要があります

buf_rec[ind].counter+=2;
于 2012-03-15T19:52:23.257 に答える
1

i考えられる問題の 1 つは、いくつかの場所で入れ子になった 2 つの for ループでグローバル変数を使用しているため、外側のループが途中で終了してしまうことです。入れ子になったループには、ほとんどの場合、異なるループ変数を使用する必要があります。

例えば:

for(i=0;i<3;i++)
{
    if(buf_rec[i].index==*id)
    {
        flag1=1;
        flag2=1;
        *tanker_id=i;
        buf_rec[i].counter+=2;

        for(j=0;j<3;j++)  //Note change from i to j
        {
            buf_rec[j].counter--;
        }
        return true;
    }
}

また、ループ変数にグローバルを使用しないことをお勧めしますが、代わりに次のようなものをお勧めします。

for (int i = 0; i < 3; ++i)
{
}

古いコンパイラをまだ使用している場合を除きます (たとえば、VC6 では、この形式の変数定義に問題があります)。

于 2012-03-15T17:54:59.040 に答える
0

なぜint indグローバル変数なのですか?

if(flag2==0)句の(初期化された)ローカル変数である必要があると思います。

これは、グローバル変数が悪い考えである多くの理由の 1 つです。

于 2012-03-15T18:00:59.333 に答える
0

その後、 time() 関数を使用してカウンター変数を初期化および制御することで問題を解決しました。最終的なコードは次のとおりです。

#include<stdio.h>
#include<conio.h>
#include<time.h>

typedef struct search_buf_rec
    {
        int index;
        time_t counter;
    }search_buf_rec;
search_buf_rec buf_rec[3];
void inint_buf()
{
    for(int m=0;m<3;m++)
    {
        buf_rec[m].index=-1;
        buf_rec[m].counter=time(NULL);
    }
}

int i,flag1=0,flag2=0;

bool search_ht_cache(int *id)
{
    flag1=0,flag2=0;

    for(i=0;i<3;i++)
    {
        if(buf_rec[i].index==*id)
        {
            flag1=1;
            flag2=1;
            *id=i;
            buf_rec[i].counter=time(NULL);

            return true;
        }
    }

    if(flag1==0)
    {
        int ind=0;
        time_t min=buf_rec[0].counter;

        for(i=0;i<3;i++)
        {
            if(min>buf_rec[i].counter)
            {
                min=buf_rec[i].counter;
                ind=i;
            }
        }
        buf_rec[ind].index=*id;
        buf_rec[ind].counter=time(NULL);
        *id=i;

        return false;
    }


}
于 2012-03-16T09:34:13.707 に答える