Re: [問題] 關於huffman code的問題
好像是真新手寫的 code XD
你的 coding style 要統一一下啦 ...
我覺得至少有三個問題
1. 讀檔少讀一個 char,這個前面有人說了
2. 要用 int c = fgetc(fp);
而不是 char c = fgetc(fp);
你的程式剛好沒出問題而已
底下列舉網路範例
int c 的情況:
如果下一個讀取的字符將為 0xFF, 則
int c;
c = fgetc (rfp); // c = 0x000000FF;
if (c != -1) // 當然不等, -1 是 0xFFFFFFFF
fputc (wfp); // 噢, OXFF 複製成功.
字符0xFF, 其本身並不是EOF.
char c 的情況
假定下一個讀取的字符為 0xFF 則
char c;
c = fgetc (rfp); // fgetc(rfp)的值為 0x000000FF, 暗中降為字節, c = 0xFF
if (c != -1) // 字符與整數比較? c 被帶符號(signed)擴展為0xFFFFFFFF,
// 喔噢,條件成立,文件複製提前退出.
while ((c=fgetc(rfp))!=EOF) 中的判別條件成立, 文件複製結束! 意外中止.
unsigned char c 的情況
unsigned char c;
c = fgetc (rfp); // fgetc (rfp)的值為EOF,即-1,即0xFFFFFFFF, 降格為字節,
// c = 0xFF
if ( c!= -1) // c 被擴展為 0x000000FF, 永遠不回等於 0xFFFFFFFF
// 所以這次雖然能正確複製 0xFF, 但卻不能判斷文件結束.
// 事實上,在 c 為 uchar 時, c != -1 是永遠成立的, 一個
// 高質量的編譯器, 比如 gcc會在編譯時指出這一點.
3. 沒有初始化,也就是你當機的問題
不管新手老手,只要腦袋跟我一樣不夠靈光的,都建議將所有指標初始化為 0
Trace 原來的版本
// "111.cpp", 76L
void __cdecl intrav(struct node *)
{
tree->left = 003B4E68
// "111.cpp", 76L
void __cdecl intrav(struct node *)
{
tree->left = 42202E64
// "111.cpp", 76L
void __cdecl intrav(struct node *)
{
0x42202E64 這個位址看起來就不太正常,好像太大了
第一次修改
在 void Add_To_List(NODE* list, int x ,char y) 這個函式裡
加上 newn->left = 0;
Trace 第一次修改的版本
// "111.cpp", 76L
void __cdecl intrav(struct node *)
{
tree->left = 003B4E68
// "111.cpp", 76L
void __cdecl intrav(struct node *)
{
tree->left = 00000000
// "111.cpp", 76L
void __cdecl intrav(struct node *)
{
}
tree->right = 65687369
// "111.cpp", 76L
void __cdecl intrav(struct node *)
{
比剛剛多跑了一點點,不過問題一樣,0x65687369 也是很大的數字
第二次修改
在 void Add_To_List(NODE* list, int x, char y) 這個函式裡
加上 newn->right = 0;
順利跑完不會當機
不過我只保證不當機,不保證跑出來沒錯就是了 ...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.170.1.18
→
05/24 23:00, , 1F
05/24 23:00, 1F
推
05/24 23:08, , 2F
05/24 23:08, 2F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章