Huffman解码中的递归函数没有退出

时间:2012-12-04 07:43:49

标签: c++ recursion segmentation-fault decoding huffman-code

我在创建的霍夫曼解码功能方面遇到了一些麻烦。我只是想知道是否有人知道为什么我的程序产生无限循环。以下是我的功能以及我如何解决它。当计数器命中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++);
    }
}

可能有人知道为什么我的功能会进入无限循环以及如何解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:0)

如果您期望通过traverseCode()函数更新计数器,则它需要是引用或指针。在你的代码中,它只是一个局部变量,在函数退出时被丢弃。

除了返回之外,这没有任何作用:

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

这下一点也令人困惑。它将使用'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()语句失败。