[情報] 電腦輔助工程製圖LISP的除錯
撰寫AutoLISP時常見的錯誤
Word檔案下載 http://www.sendspace.com/file/cqk1tx
國力台灣大學機械工程學系
96學年度下學期電腦輔助工程製圖助教 林錦德
首先要說怎麼避免錯誤
最常見的錯誤就是打錯字,例如p0與po、p1與pl。這個問題多半是心不在焉,腦袋空空看
著人家寫什麼就打什麼。如果是自己去建構撰寫的結構,就不會發生這種錯誤,因為自己
很清楚那是什麼。(所以下次讓我抓到這種錯誤,就等於是告訴我,你是在COPY黑板或講
義)這類錯誤經常伴隨的錯誤訊息是
; error: bad argument type: 2D/3D point: nil
第二種常見的錯誤就是function錯誤,LISP的格式多是
( func arg arg arg ... )
LIST中的第一個元素是 function,其餘為argument。打錯function也是很常見的,例如
(setq)打成了(setg)。最有效的方法是利用進階的編輯軟體,例如AutoCAD提供的Visual
LISP Editor,或是UltraEdit掛上LISP的語法高亮度設定。如此,只要打出正確的
function,該function的字就會變成藍色。而這類軟體也多半會附加上括號檢查。
另一種造成錯誤的原因是沒有在fun與arg間留空格,例如:
(setqa b)
他會出現
; error: no function definition: SETQA
所以以後看到這行錯誤,就用編輯器的搜尋功能,搜尋字串 (SETQA ,看看哪裡打錯了。
最後一種常見的錯誤是命令錯誤,也就是(command)執行不完全。例如要畫一條聚合線,
p1至p2是直線,p2至p4是弧線,該中心為p3,p4至p5是直線
下面這個例子是錯誤的,因為p4跟p5也變成弧線了
(command "pline" p1 p2 "arc" "ce" p3 p4 p5 "")
要修正這個錯誤,就是自己到作圖區打上pline然後操作一次,這邊就不給解答了。又另
外一提的是,Autocad對arc的設定是逆時針方向,請務必記住。
這邊是一些常用的除錯技巧
載入撰寫好的LISP時 只要看到; error 那就是有問題了。不要一廂情願的還去跑程式
,那保證是你上次載入還沒被覆蓋的錯誤資訊。看到error就好好瞭解發生什麼事情,以
下是幾種常見的錯誤:
; error: syntax error
這是語法錯誤。一般邏輯func會限制後面的argument數量,或指定其格式。例如 (if T
2 3)是對的,如果打成了(if T 2 3 4) 或(if T),就保證出現這個錯誤。檢查時就是去
看func後面的argument數量是否充裕。
; error: too few arguments
; error: too many arguments
先嘗試在autocad的命令列中打(polar a b)與(polar a b c d),abcd先不用定義。這個
錯誤很簡單,就是polar後面會跟隨三個argument,多了或少了都會出錯。這常發生在定
義argument時括號打錯位置,例如
(polar '(0 0 (+ pi (/ pi 2) 5)))
這其實只是打錯一個括號而已。一樣,這也是檢查func後面的argument是否充裕。
又你把上面的問題修正成(polar a b c)後 又出現新的問題
; error: bad argument type: 2D/3D point: nil
前面提到,func後面會跟隨argument,很多func對argument的型態(type)很重視,例如
polar的第一個argument一定是2D或3D點,其餘兩個都是實數。這時候因為a沒有定義,也
就是a=nil,所以autocad回應"我需要2D/3D point,但是卻得到nil"。解決方法很容易,
就是把a設定為點資料就可以了。
這邊show幾個例子,試著看看為什麼
(getreal a)
; error: bad argument type: stringp nil
(+ a 1)
; error: bad argument type: numberp: nil
檢查的方法就是看出問題的argument,他所用參數是不是定義正確了。
其他大多是括號出錯的錯誤有
; error: malformed list on input
看到這個錯誤就是缺括號,其他還有兩個錯誤,會直接告訴撰寫者少打的是哪一邊的括號
(我試不出來例子)
如果沒把握的話,考試請印一份在旁邊看吧!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.230.59
推
04/22 17:44, , 1F
04/22 17:44, 1F
推
04/23 08:51, , 2F
04/23 08:51, 2F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):