contributed by<zhanyangch
>
用 prefix search 搜尋 'A' 時會產生 Segmentation fault
用 gdb 查看錯誤資訊
tst_suggest() 的原始程式碼,找到符合的節點會將字串放入 a[]中,但對於 n 的檢查 *n == max,因 tst_suggest 會多次呼叫自己,可能出現 n>=max 的情形,此時會導致程式嘗試去寫入不合法的記憶體。
if (!p || *n == max)
修正為 if (!p || *n >= max)
即可。
修正後搜尋'A'只會找到前 1025 筆資料,應為1024筆,改為在記憶體寫入前再做一次檢查
git commit --amend
和 git push --force
,讓程式碼的變革更清楚且易於維護此部份參考st9007a的共筆
原本使用 CPY 時會利用 strdup 分配一塊記憶體放置複製的字串,若改用 REF 必需先為該字串分配記憶體。
宣告一個二維陣列來存放所有要放入 TST 的字串。
Repalce argument CPY with REF in test_ref.c
=> 這說明了什麼?你要做高階的描述,說明你的修改動機、目的,還有方法。不用特別說在哪個檔案,Git 會自動追蹤Modify parameter of tst_del_word invoked by tst_ins_del
=> 同上,不要做低層次的描述,Git commit messages 是給合作者和「未來的你」看的。測試過程:
在執行 quit 時發現 free() 到不合法的指標,將 tst_free_all(root) 改為 tst_free(root),兩者差異主要在於 tst_free_all 會 free 儲存字串的 tst_node ,tst_free 則不會。
delete 的部份與 quit 相同,將 tst_ins_del 的 return tst_del_word(root, curr, &stk, 1) 改為 return tst_del_word(root, curr, &stk, cpy)
在 REF 時 freeword 為0,不會 free 字串的記憶體。
應該一併開發可以自動測試程式的機制,這樣才能交叉比對 CPY 和 REF 兩種實作的結果,而不用每次都透過人工輸入
接受 --bench
的執行參數,將 TST 的建立時間儲存在檔案中,並且在 bench 函式中測試 search A-Z 、 a-z 所需的時間。
輸入 make bench 時會執行 perf 測試效能
測試結果:CPY 的 cache miss 較多,但執行時間較短。
建立 TST 的時間
利用 gnuplot 的 stat 指令可以獲得統計數據
搜尋時間
原因探討
* 改善 REF 的方向:先配置一塊記憶體,將節點與字串依序存放。
在 tst.h 中 並沒有定義 tst_node 的成員,並且所有函式都是對 tst_node 的指標作運算,這樣的作法好處是減少重新編譯的時間,且可以由不同的 .c 檔案實做 struct 的內容,缺點是不能直接對 struct 作操作,要改用 get、set 等函式。
走訪每一個節點,順序是 lokid、eqkid、hikid、parent,且對於葉節點呼叫 fn
fn 在此為 callback function ,在符合條件時會自動被呼叫,可以藉由傳入不同的函數來實現不同功能,例如 tst_get_refcnt 可以取得字串出現的次數、tst_get_string 取得字串等。
callback function 也常被用於使用者界面,例如 OpenCV 的 setMouseCallback 當收到使用者的滑鼠事件,會呼叫 onMouse 函數進行處理,範例。
程式碼列表太少,需要提及如何「運用」,也就是最小可執行的示範
"jserv"
原本讀取檔案的方式為 fscanf(fp, "%s", word) 但 cities.txt內的格式為 city, country,fscnaf 讀取字串時遇到空格字元會停止讀取,例如:Buenos Aires, Argentina 會認為是三個字串 "Buenos"、"Aires,"、"Argentina",但這筆資料的意義應該是"Buenos Aires"、"Argentina",所以需要修改讀取的格式。
%[^,\n] 為讀取字串直到遇到 [^] 內的字元,這裡以',' '\n'分隔不同筆資料,當遇到','時忽略後面一個字元(在資料中','後面必定有一空白),並且為了辨識是 city 還是 country ,再把','補上。
測試結果:可以正確找到含有空格的字串
st9007a的共筆
stats_(Statistical_Summary) - Gnuplot: An Interactive Plotting Program
OpenCV documentation