Skip to content

Instantly share code, notes, and snippets.

@KevinKu
Last active March 15, 2016 12:03
Show Gist options
  • Select an option

  • Save KevinKu/ac20a1350d4a453600e2 to your computer and use it in GitHub Desktop.

Select an option

Save KevinKu/ac20a1350d4a453600e2 to your computer and use it in GitHub Desktop.
所以只好用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