以下lru代码中的逻辑错误是什么

what is the logical error in the following lru code

本文关键字:错误 是什么 lru 代码 以下      更新时间:2023-10-16

我想使用以下代码为我的应用程序替换一个非常简单的lru页面。buf_rec的第二个和第三个元素的计数器总是具有相同的值,我不明白为什么。

#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 numn";
    std::cin>>num;
    while(num!=-1)
    {
        search_cache(&num);
        display();
        std::cout<<"nEnter a numn";
        std::cin>>num;
    }
}

一个可能的问题是,在几个地方的两个嵌套for循环中使用全局变量i,这将导致外部循环提前完成。您几乎总是希望对嵌套循环使用不同的循环变量。

例如:

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对这种形式的变量定义有问题)。

不确定这是否能解决您的问题,但在中

if( flag2 == 0)

您需要初始化ind.

ind = 0;

在第一个for循环之后的相同if块中我认为

buf_rec[i].counter+=2;

应该是

buf_rec[ind].counter+=2;

为什么int ind是全局变量?

我认为它需要是if(flag2==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;
    }

}