-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: スタックオーバーフロー。
再帰を続行するかどうかを決定するブランチがないため、無限再帰が行われます。 – MikeCAT
再帰をループに変換します。再帰の深さには自然な制限があります。入力のすべてのビットがこの制限を超えることは確かです。再帰はコード内の特定の目的には役立たない。 –
if(map [code] == PSEUDO_EOF)return;コード化されたテキストの末尾に があります。再帰を停止するPSEUFO_EOF charがあります。 –