2012-03-15 19 views
0

私のアプリケーションのための非常に単純なlruページ置換のために次のコードを使いたかったのです。 カウンタの2番目と3番目の要素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

一つの可能​​性のある問題は、外側のループが完成しているになりますいくつかの場所でループのために2つの入れ子にグローバル変数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つの数字でそれを試してみましたか? – John

0

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

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

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

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


} 
関連する問題