Last active
March 15, 2016 12:03
-
-
Save KevinKu/ac20a1350d4a453600e2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 所以只好用malloc額外一個object來處理 | |
| echo 'set logging file '$2>>_tmp.gdb | |
| 這邊跟swap不同的是 | |
| 我搞懂set logging file怎麼用了 所以測試的result不會有很多無用的資訊了 | |
| set logging file 決定當set logging on 執行完的時候 gdb的output要輸出到哪個檔案 | |
| 與他使用相關的是 set logging on/off 一個開啟 一個關閉xd | |
| echo ' '>>$2 | |
| exec < $1 | |
| 下面一樣是讀測資的處理 | |
| (這有改進空間低 List* List** 這兩個如果NULL是無法用測資測的 來鞭屍的同學 交給各位處理了xd) | |
| 想法是 | |
| 每次處理的單位都三行 | |
| 第一行表示空白 | |
| 第二行表示要製造幾個node的list | |
| 第三行表示從head到tail各node的value | |
| 例如 | |
| --------->空白 每單位都要留 | |
| 4 --------->代表要創造4個node的list | |
| 12 789 54 3 --------->代表從head開始 依序node的value為 12 789 54 3 | |
| (這邊一樣沒檢查carry或overflow 沒錯 交給各位處理了xd) | |
| 另外 每個node的 value中間要用空格隔開 為何?下面會解釋 | |
| while (read var) | |
| do | |
| read var | |
| list_length=$var | |
| 決定要幾個node | |
| echo 'create_list (*($head)) '$list_length>>_tmp.gdb | |
| read var | |
| list_value=($var) | |
| 這邊有點技巧啦 為何需要()這兩個符號哩 | |
| 當初我也在想 多個value要怎麼解析 才能找出目前要insert的node的value | |
| 結果我在google的時候看到了bs 的array怎麼create 哇 如此簡單 | |
| 各位可以在bash中如此測試( ctrl + alt + t 就可以打開bash了) | |
| xu6wu6gj@kmtath:~/2016-winter-course/test2$ h="125 678 965 41" | |
| xu6wu6gj@kmtath:~/2016-winter-course/test2$ echo $h | |
| 125 678 965 41 | |
| xu6wu6gj@kmtath:~/2016-winter-course/test2$ b=($h) | |
| xu6wu6gj@kmtath:~/2016-winter-course/test2$ echo ${b[0]} | |
| 125 | |
| xu6wu6gj@kmtath:~/2016-winter-course/test2$ echo ${b[1]} | |
| 678 | |
| xu6wu6gj@kmtath:~/2016-winter-course/test2$ echo ${b[2]} | |
| 965 | |
| xu6wu6gj@kmtath:~/2016-winter-course/test2$ echo ${b[3]} | |
| 41 | |
| 是的 沒錯 從一個string製造array就會以空格區開 | |
| 耶 那這樣剛好適合測資node value所需要的格式阿 | |
| 至於${b[]}是什麼意思 下面會解釋 | |
| echo 'set $_head = (*($head))'>>_tmp.gdb | |
| for value in "${list_value[@]}" | |
| bs中 要取一個array其中一個value是這樣的 | |
| ${}內要給那array的變數名 第幾個就是變數名稱後加[] []內給index | |
| (再回上面去看 ${b[1]} 有沒有比較看得懂) | |
| 那[@]是什麼意思 對這個for loop來說 就是value 被array內的各個element賦值一次 | |
| (都不懂就直接開bs來試 這是腳本語言比較友善的地方) | |
| do | |
| echo 'p $_head->value = '$value>>_tmp.gdb | |
| echo 'p $_head = $_head->next'>>_tmp.gdb | |
| done | |
| echo 'set logging on'>>_tmp.gdb --------------->開始紀錄 | |
| echo 'p "test begin"'>>_tmp.gdb | |
| echo 'p "old_list"'>>_tmp.gdb | |
| echo 'printf_list (*($head))'>> _tmp.gdb | |
| 這邊提醒一下 gdb中有 value of(*) , address of (&) | |
| member of(./->) 的操作 | |
| 盡可能用()去處理 因為曾經在def 的command上採過雷 | |
| 來看 create_list.gdb的這幾行 | |
| while($i<$arg1) | |
| p $tmp = (List*)malloc(sizeof(List)) | |
| p $tmp->value = $i | |
| p $tmp->next = (List*)0 | |
| p ($arg0)->next = $tmp | |
| p $i = $i+1 | |
| p $arg0 = ($arg0)->next | |
| end | |
| 注意到都有($arg0) | |
| 一開始寫是沒有 | |
| 結果用 | |
| create_list *$h 3 | |
| 下去 | |
| 會出現invaild value | |
| 追查原因 | |
| 發現是 | |
| p $arg0->next = $tmp | |
| 會出問題 | |
| 他會變成 | |
| p *$h->next = $tmp | |
| 實際上是 | |
| p *($h->next) = $tmp | |
| 因為 -> 優先順序高於 * | |
| 而 $h->next是NULL | |
| 所以就出問題了 | |
| echo 'set logging off'>>_tmp.gdb --------------->紀錄結束 | |
| 從set logging on 到 off 紀錄排序前list的情況 | |
| echo 'p bubble_sort($head)'>>_tmp.gdb | |
| 測試bubble sort啦 | |
| echo 'set logging on'>>_tmp.gdb ------------------>開始紀錄 | |
| echo 'p "new_list"'>>_tmp.gdb | |
| echo 'printf_list (*($head))'>> _tmp.gdb | |
| echo 'set logging off'>>_tmp.gdb ---------------->紀錄結束 | |
| 以上的on /of 紀錄排序後的list情況 | |
| echo 'free_list (*($head))'>>_tmp.gdb | |
| 為了能測很多比 所以要有銷毀測資的動作 這邊我們可以更去想 | |
| 如果不要用malloc 而用alloc會不會更好 就可以少寫一個def | |
| done | |
| echo 'q'>>_tmp.gdb | |
| echo 'y'>>_tmp.gdb | |
| gdb -x _tmp.gdb bubble_sort>1 | |
| rm _tmp.gdb 1 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment