Re: [問題] 關於huffman code的問題

看板C_and_CPP (C/C++)作者 (allstar)時間16年前 (2009/05/24 22:41), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串2/2 (看更多)
好像是真新手寫的 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
正常跑完的 trace 結果 http://src.wtgstudio.com/?41aavq
05/24 23:00, 1F

05/24 23:08, , 2F
我改正過了..果然是初始設定的問題~感謝感謝!!
05/24 23:08, 2F
文章代碼(AID): #1A6Lo59C (C_and_CPP)
文章代碼(AID): #1A6Lo59C (C_and_CPP)