2016-06-26 6 views
-1
void decodeFile(ibstream& infile, Node* encodingTree, ostream& file) { 
    // initializing map here. 

    string code = ""; 
    /*while (true) { 
     code += integerToString(infile.readBit());   
     if (map.containsKey(code)) { 
      if (map[code] == PSEUDO_EOF) break; 
      file.put(map[code]); 
      code = ""; 
     } 
    }*/ 
    bitToString(infile,file,code,map); 
} 

コメント部分のある指定されたメソッドは正常に動作しますが、私はサイクル中ではなく再帰を行うようにしています。ハーフマン、スタックオーバーフロー

void bitToString(ibstream& infile, ostream& file,string& code,Map<string,ext_char>& map){  
    code += integerToString(infile.readBit()); 
    if (map.containsKey(code)) { 
     if (map[code] == PSEUDO_EOF) return; 
     file.put(map[code]); 
     code=""; 
    } 
    bitToString(infile,file,code,map); 
} 

しかし、この再帰では、大きなファイルに対してスタック・フロー・エラーが発生します。

ハフマンEncoding.exeで0x621dffdeで未処理の例外は:0xC00000FD: スタックオーバーフロー。

+3

再帰を続行するかどうかを決定するブランチがないため、無限再帰が行われます。 – MikeCAT

+0

再帰をループに変換します。再帰の深さには自然な制限があります。入力のすべてのビットがこの制限を超えることは確かです。再帰はコード内の特定の目的には役立たない。 –

+0

if(map [code] == PSEUDO_EOF)return;コード化されたテキストの末尾に があります。再帰を停止するPSEUFO_EOF charがあります。 –

答えて

2

機能のネストには限界があります。あなたが元気です。 10000回の関数でネスト関数を実行すると、エラーが発生します。あなたはハフマンデコードを行うために再帰を使うことができますが、それを繰り返し(または2回目の再帰)と組み合わせる必要があります。正しいコードを見つけたら再帰をリセットし、EOFまで次のコードを繰り返してください。

関連する問題