1

次の関数を作成しました。これは、「ブロック」を引数として取り、ブロックのリスト「lru」で「ブロック」を検索します。ここで「block」はクラス「Block」のインスタンスです。以下は、「lru」の宣言です。

  list<Block> lru;

そして、以下は私の検索機能です:

int LRU::searchLRU(Block block)
{
    if (lru.size() == 0) 
    {
        lru.push_back(block);
        return 1;
    }

    list<Block>::iterator i;

    for (i = lru.begin(); i != lru.end(); i++)              
    {
        if (i->get_set() == block.get_set() && i->get_index() == block.get_index()) 
        {
            lru.push_back(block);
            lru.erase(i);
            return 2;
        }
    }

    if (lru.size() == size)
    {
        lru.pop_front();
        lru.push_back(block);
        return 3;
    } 
}

しかし問題は、関数が「0」を返す場合があることです。その結果、私のプログラム全体が適切に機能していません。私はすべてのケースを処理したと感じています。

誰かが間違いを指摘できますか、または関数が「0」を返す理由を教えてください。

4

1 に答える 1

2

最初の if は空のリストのケースをカバーし、最後の if は完全なリストのケースをカバーし、中間の for ループは空でない非完全なリストをカバーしますが、ブロックが見つからない場合はブロックから返されないため、完全でない場合空でもない場合、関数の最後から落ちて 0 が返されます。明確でない場合は、言い換えてみます。

empty list -> add item, return 0
full list -> pos item, add item, return 3
partially full list -> find item, *if found* {erase item, add item, return 2}

問題は、見つかった場合、見つからない場合は何もしないことです。あなたは最後から落ちるでしょう(それはメインで0を返し、それ以外の場合はUBです。ここを参照してください)。

于 2013-08-03T20:51:20.397 に答える