0

構造体のメンバーを出力するのに少し問題があります。これは私がこれまでに持っているものです:

struct Code
{
  char letter;
  string sequence;
}

void createCode(HuffmanNode *root, string codestr, Code *codeBook, int count)
{
  if(root->getRight() == NULL && root->getLeft() == NULL)
  {
    Code code;
    code.letter = root->getLetter();
    code.sequence = codestr;
    codeBook[count] = code;
    count++;
  }
  else
  {
    createCode(root->getLeft(), codestr + "1", codeBook, count);
    createCode(root->getRight(), codestr + "0", codeBook, count);
  }
}

これはすべて正常に動作しますが、コードブックのコードの配列でメンバー シーケンスを出力しようとすると、主に次のようになります。

string codestr;
count = 0;
Code codeBook[256];
createCode(root, string codestr, codeBook, count); //root is already created 
for(int i = 256; i >= 0; i--)
{
  if(isalpha(codeBook[i].letter))
  cout << codeBook[i].sequence << " ";
}

最後に保存した文字列のみが出力されます。誰かが修正を知っていて、なぜこれが起こっているのでしょうか? 誰かが助けることができれば、それは素晴らしいことです!

4

2 に答える 2

1

主な問題は、createCode()常に渡されることcount=0です。このため、すべてのCodeエントリを配列の 0 番目の位置に格納すると、最後のエントリによって以前のすべてのエントリが上書きされます。

修正するには、count参照またはポインターで渡すか、関数が の新しい値を返すようにしますcount

最後に、forループの開始値が範囲外です (1 つずれています)。

于 2012-12-01T07:20:17.553 に答える
0

がインクリメントしていない場合はcreateCodecount値で渡しているため、参照渡しに変更します。

void createCode(HuffmanNode *root, string codestr, Code *codeBook, int& count)

配列 codeBook には 256 の要素が含まれていますが、インデックスは 0 から 255 です。for ループは次のようにする必要があります。

for(int i = 255; i >= 0; i--)

それ以外の場合、境界外の配列要素にアクセスすると、未定義の動作になります。

于 2012-12-01T07:19:42.843 に答える