contributed by < p61402
>
sysprog
commit message 中的 "Complete" 改為 "Implement" 較為適合
課程助教
已修正
p61402
由於本身筆電沒有裝 linux 系統,因此決定使用 ssh 連線到另一台有 linux 系統的電腦。
輸入以下指令進行連線:
其中user
為 server 端的使用者名稱,後方 IP 也是 server 端的 IP,依照提示輸入密碼後,出現以下文字即代表連線成功:
由於不習慣使用 vim 進行編輯,因此為了在本地端以慣用編輯器開啟檔案,我會利用 sshfs 透過 ssh 協定掛載遠端硬碟。
在 Mac OS X 若要使用 sshfs,可以下載 FUSE for OS X。
安裝完成後,建立一個掛載用的目錄。
接著執行以下指令,其中user
代換成使用者名稱,host
代換成 IP 位址,/home/qoo/Documents/lab0-c
則代表 server 端掛載的目錄。
此時~/share
資料夾就會跟遠端的資料夾同步,可以用mount
指令查看目前掛載的目錄有哪些:
要卸載時使用umount
指令:
從 Github 將專案 clone 到本機後,資料夾本身就具有 git 的特性,不必再進行git init
的動作。
在 Github 上新增 ssh key,可以不用在每次連結 Github 時都輸入帳號密碼,設定流程我參考這篇官方的完整教學。
在 Github 上建立一個新的 repository 後,輸入以下指令與 Github 進行連線並 push 目前的進度。
由於作業規定q_inaert_tail
以及q_size
兩個函式的時間複雜度必須為 O(1),因此必須使用額外的變數來儲存 queue 的尾端以及目前大小。
在 Programming Lab 提到,測試資料可能多達一百萬筆,建議使用迴圈而非遞迴來實作,否則可能造成 stackoverflow。至於 queue 的 size 使用int
型別大小宣告即可應付一百萬筆資料。
為一個新的 queue 配置一塊記憶體空間,回傳一個指向此記憶體空間的指標,若失敗則回傳 NULL pointer。
釋放整個 queue 所佔用的記憶體,由於每個 element 在 insert 的時候會配置記憶體空間,因此要使用迴圈將每個 element (包括其中的value
) 的記憶體循序釋放,時間複雜度 O(n)。
在 queue 前端 insert 一個新的 element。
使用malloc
配置一段給新 element 的記憶體,以及value
的記憶體,並透過strcpy
將字串內容複製到value
。
在 queue 的尾端 insert 一個新的 element。
方法同q_insert_head
。
移除 queue 前端第一個 element,並且在sp
不為NULL
時將移除之 element 的value
複製到sp
,並且必須釋放移除之 element 的記憶體空間。
回傳 queue 目前的 element 個數。
將 queue 的 element 反轉。
目的:將原先 commit 中的字詞 complete 代換成 implement。
先查看歷史的 commit 紀錄:
使用rebase
指令,範圍選取自bd8aa24
到現在為止的 commit。
將欲修改的 commit 前方的pick
改為reword
或r
:
存檔離開後,要開始修改剛剛選擇的 commit,此時系統會不斷跳出預設的編輯器,讓使用者逐一修改 commit 並存檔,最後出現以下訊息代表成功。
但當要 push 時出現以下問題:
大概是因為修改 commit 的關係,讓 git 認為目前的版本是某個點的另一個分支,因為希望以目前這個版本為主,所以加入force
參數強制改寫為現在這個版本。[參考資料]
再次查看歷史 commit,已經修改成功囉!
首先查看 Makefile 檔案,可以看到指令make test
會執行 scripts/driver.py
。
接著查看scripts/driver.py
檔,在第 12 行呼叫getopt
函式,此函式能夠方便 parse command line 指令的參數,不必使用 regular expression 等複雜的方式來處理參數,真是太神奇了。
接著函式宣告一個Tracer
的 instance,在Tracer
當中,traceDict
用來儲存每個測試檔的名稱。
每段測試的指令都被收錄在trace
資料夾內,例如traces/trace-01-ops.cmd
,用來測試insert_head
及remove_head
的功能是否正確:
而maxScores
決定每個測試佔多少分:
Tracer
會透過在qtest
中執行每個測試檔的指令,來判斷所測試的項目是否正確,在第 9 行,subprocess.call
會回傳 process 的 exit status,若 return 0 則代表正確,拿到該測試的分數,最後再將所有分數加總。