Re: [情報] 電腦輔助工程製圖LISP的除錯

看板NTUMETA作者 (金色惡夢魔王)時間16年前 (2008/04/26 10:52), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
這是part2 前一篇是原則上的問題 這篇是技巧上的說明 什麼無法載入 括號出問題的 就不需要看這篇了 LISP最麻煩的地方 就是沒有類似C語言的介面--會提示哪一行出錯 但我們可以創造這些介面! 舉個例子 (defun c:test (/ IP R P1 PI/2) (setq IP '(0 0) R 10) ;定義圓心與半徑 (command "circle" IP R) ;畫圓 (setq P1 (polar IP PI/2 R) ;定義P1 (command "line" IP P1 "") ;畫線 );end defun 這個執行時,會出現; error: bad argument type: numberp: nil 眼力好的人應該可以發現是PI/2沒有定義 但如果我們眼力不好,那怎麼辦呢? 最好的除錯方法 就是觀察「程式執行到哪兒了」 很顯然的 執行程式中畫出了圓 >>有執行這行 (command "circle" IP R) ;畫圓 但是線沒有畫出來 >>沒有執行這行 (command "line" IP P1 "") ;畫線 因此可以知道 出錯的程式一定是這邊附近 (setq P1 (polar IP PI/2 R) ;定義P1 (command "line" IP P1 "") ;畫線 這時候眼力再差,也可以看出來PI/2沒有定義吧! ============================================================= 上面的例子很簡單 但是如果遇到這麼一串(setq)呢 (defun c:test2 (/ a b c d e f g) (setq a 1 b 2 c 3 d b e '(a b) f (- a f) g (+ b c) );end_setq (princ) );end_defun 錯誤訊息是; error: bad argument type: numberp: nil 這時候沒有圓,沒有線,啥都沒有! 我常用的方法 是利用(princ)這個function 例如用(princ "AAA")會在命令回應視窗中印出AAA的字樣 所以我可以把上面的程式改成 (defun c:test2 (/ a b c d e f g) (setq a 1 b 2 c 3 d b )(princ "AAA") (setq e '(a b) f (- a f) g (+ b c) );end_setq (princ) );end_defun 第一個右括號 ")"是讓前面的(setq 完結 後面的(setq則是跟原本的);end_setq一對 在不破壞程式結構的情況下,我增加一個列印"AAA"的動作 然後載入程式,並執行,而結果是 AAA; error: bad argument type: numberp: nil 注意前面的AAA,這表示(princ "AAA")被執行了! 也就是說 大概是後面的程式出錯 你們可以選擇兩個作法 一個是移動 )(princ "AAA") (setq 以確定哪裡出錯 另一個作法是......我就貼一堆 )(princ "AAA") (setq 例如 (defun c:test2 (/ a b c d e f g) (setq a 1 b 2 c 3 d b )(princ "AAA") (setq e '(a b) )(princ "AAA") (setq f (- a f) )(princ "AAA") (setq g (+ b c) ) (princ) );end defun 這個執行結果是 AAAAAA; error: bad argument type: numberp: nil 很顯然他印出兩次AAA,那就是" f (- a f) "出錯了! 果然(- a f)中間的f沒有定義到 以上 LISP除錯技巧 這次沒有WORD檔可以下載 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.230.59 ※ 編輯: chintei 來自: 140.112.230.59 (04/26 11:03)

04/26 21:12, , 1F
首推腳推 助教的用心
04/26 21:12, 1F
文章代碼(AID): #184fZIC5 (NTUMETA)
文章代碼(AID): #184fZIC5 (NTUMETA)