2012-03-15 5 views
0

Я хотел использовать следующий код для очень простой замены страницы lru для моего приложения. Счетчик для второго и третьего элементов buf_rec всегда имеют одинаковые значения, и я не мог понять, почему.Что такое логическая ошибка в следующем коде lru

#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; 
    } 
} 
+1

Это код. Возможно, вам лучше справиться с просмотром кода. –

+0

@MarkB: Я думал, что это упростит проблему. – John

+0

Почему так много глобальных переменных? Возможно, также подумайте о том, чтобы дать своим переменным значимые имена и добавить комментарии? –

ответ

1

Одним из возможных проблема в том, что вы используете глобальную переменную 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, например, имеет проблема с этой формой определения переменной).

+0

Я сделал, как вы сказали. Моя проблема все еще не решена. – John

+0

Собственно, эта ошибка ничего не меняет, если в массиве LRU нет повторяющихся записей. Копирование вставки кода и исправление пропусков переменной 'tanker_id', как представляется, приводит к ожидаемому поведению (я изменил' display() 'для вывода счетчика каждого элемента). Что, собственно, не работает для вас? – uesp

+0

вы пробовали его с по крайней мере 6 номерами с некоторыми повторениями? он не делает lru, поскольку это должно быть – John

0

Почему int ind глобальная переменная?

Я думаю, что это должно быть (инициализированная) локальная переменная в предложении if(flag2==0).

Это одна из многих причин, почему глобальные переменные - плохая идея.

1

Не уверен, если это решит вашу проблему, но в

if(flag2 == 0) 

вам необходимо инициализировать Ind.

ind = 0; 

В том же, если блок после того, как первый цикл Я считаю

buf_rec[i].counter+=2; 

должен быть

buf_rec[ind].counter+=2; 
0

Я решить мою проблему с помощью функции времени() для инициализации и управления после этого переменная счетчика. Последний полный код:

#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; 
    } 


} 
Смежные вопросы