-1

作成したハフマン デコーディング関数に少し問題があります。私のプログラムが無限ループを生成している理由を誰かが知っているかどうか疑問に思っていました. 以下は私の関数と私がそれをどのように呼んだかです。カウンターが 8 に達すると、読み取るビットがなくなるため、関数を終了する必要があります。ここにあります:

HuffmanNode *rodee = createTree(freqArray2, 256); //holds the huffman tree
HuffmanNode *temporaryNode; //temporary node for traversing
temporaryNode = rodee; //first the temporary node is equal to the root
while(cin.read((char*)&w, sizeof(w))
{
  traverseCode(temporaryNode, rodee, bits, count);
  count = 0; //reset the count back to 0 for the next time the function is called 
} //as I read in a byte of 8 bits (I converted the bytes to bits in another function not shown

void traverseCode(HuffmanNode *temp, HuffmanNode *root, unsigned char *bits, int counter)
{
    if(counter >= 7)
    {
      counter = 0;
      return; 
    }
    if(temp->getLeft() == NULL && temp->getRight() == NULL)
    {
      cout << temp->getLetter();
      temp = root; 


      traverseCode(temp, root, bits, counter);
    }
    if((int)bits[counter] == 0)
    {
      traverseCode(temp->getLeft(), root,  bits, counter++);
    }
    if((int)bits[counter] == 1)
    {
      traverseCode(temp->getRight(), root, bits, counter++);
    }
}

私の関数が無限ループに陥る理由と、これを修正する方法を知っている人はいますか? ありがとう!

4

1 に答える 1

0

traverseCode() 関数によってカウンターが更新されることが予想される場合は、参照またはポインターである必要があります。あなたのコードでは、それは単なるローカル変数であり、関数が終了すると破棄されます。

したがって、これは戻り以外に何もしません:

if(counter >= 7)
{
  counter = 0;
  return; 
}

この次のビットも紛らわしいです。「counter」の元の値で関数を呼び出しますが、これが無限ループの原因になる可能性があります。実際に返された場合、counter のローカル値をインクリメントしてから、次の if() にフォールスルーしますが、これも意図しない可能性があります。

if((int)bits[counter] == 0)
{
  traverseCode(temp->getLeft(), root,  bits, counter++);
}
if((int)bits[counter] == 1)
{
  traverseCode(temp->getRight(), root, bits, counter++);
}

そのため、カウンターをまったく異なる方法で処理する必要があり、if() ステートメントがそのように失敗しないようにする必要があります。

于 2012-12-04T07:55:13.993 に答える