У меня небольшие проблемы с созданной мной функцией декодирования Хаффмана. Мне было просто интересно, знает ли кто-нибудь, почему моя программа создает бесконечный цикл. Ниже моя функция и как я ее назвал. Когда счетчик достигает 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++);
}
}
Кто-нибудь может знать, почему моя функция входит в бесконечный цикл и как это исправить? Спасибо!
Если вы ожидаете, что счетчик будет обновлен функцией 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 () проваливались.
Других решений пока нет …