以下lru代码中的逻辑错误是什么
what is the logical error in the following lru code
我想使用以下代码为我的应用程序替换一个非常简单的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;
}
}
相关文章:
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- C++中的"expected unqualified-id"错误是什么?
- 谁能告诉我,程序中的错误是什么?该程序仅用于获取文件扩展名
- 我的代码中针对 NQueens 问题的错误是什么?
- 这个代码中的错误是什么,每次都会给我分段错误
- 'note: 候選人: Volume& Volume::operator=(const Volume&)'.这个错误是什么?
- 此气泡排序代码中的错误是什么?
- 第9行的给定代码中的错误是什么?
- C++ - "Incomplete type not allowed"错误是什么意思,我该如何修复它?
- 这个错误是什么?似乎没有理由出现
- 这个编译器错误是什么意思 - "qualified-id in declaration before ‘=’ token" C++?
- 这个boost.python程序中的错误是什么?
- C 如果该代码中的错误是什么
- TMB教程中的此编译错误是什么?
- 此代码运算符超载中的错误是什么?
- 英特尔SGX错误:8207错误是什么意思是当我无法正确加载飞地时
- 这个奇怪的"/usr/bin/ld: cannot find -lXAW_LIBRARY-NOTFOUND"错误是什么意思?
- 该代码的主要错误是什么,用于确定n`天后日期
- 错误 LNK2019:未解析的外部符号"外部"C"此错误是什么?
- 这个C++代码中的错误是什么