




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第 6 章章 調(diào)試程序調(diào)試程序 6.1 6.1 概述概述 語法正確的程序并不能保證正常運(yùn)行,在運(yùn)行時(shí)可能會(huì)產(chǎn)生錯(cuò)誤的結(jié)果語法正確的程序并不能保證正常運(yùn)行,在運(yùn)行時(shí)可能會(huì)產(chǎn)生錯(cuò)誤的結(jié)果或者發(fā)生崩潰現(xiàn)象,這就需要調(diào)試。或者發(fā)生崩潰現(xiàn)象,這就需要調(diào)試。調(diào)試程序的步驟是:調(diào)試程序的步驟是: 控制程序在指定的位置暫停;控制程序在指定的位置暫停; 查看、分析有關(guān)變量的值;查看、分析有關(guān)變量的值; 修改程序的源代碼;修改程序的源代碼; 繼續(xù)或重新運(yùn)行程序;繼續(xù)或重新運(yùn)行程序; 如果程序不能正常運(yùn)行,繼續(xù)調(diào)試程序,直至程序正常運(yùn)行。如果程序不能正常運(yùn)行,繼續(xù)調(diào)試程序,直至程序正常運(yùn)行。 為了便于調(diào)試程序,為
2、了便于調(diào)試程序,Visual LISPVisual LISP提供了一些調(diào)試程序的工具,幫助用戶提供了一些調(diào)試程序的工具,幫助用戶迅速查找并改正程序中的錯(cuò)誤。迅速查找并改正程序中的錯(cuò)誤。 VisualLISPVisualLISP提供了監(jiān)視窗口、檢驗(yàn)窗口、符號(hào)服務(wù)對(duì)話框、中斷和繼續(xù)提供了監(jiān)視窗口、檢驗(yàn)窗口、符號(hào)服務(wù)對(duì)話框、中斷和繼續(xù)執(zhí)行程序的模式、命令跟蹤、跟蹤堆棧、跟蹤窗口等調(diào)試程序的工具。執(zhí)行程序的模式、命令跟蹤、跟蹤堆棧、跟蹤窗口等調(diào)試程序的工具。 通過圖通過圖6-16-1示示ViewView下拉菜單和下拉菜單和ViewView工具欄可以調(diào)用監(jiān)視窗口、檢驗(yàn)窗口等工具欄可以調(diào)用監(jiān)視窗口、檢驗(yàn)窗
3、口等調(diào)試工具。調(diào)試工具。檢驗(yàn)窗口檢驗(yàn)窗口跟蹤堆棧跟蹤堆棧出錯(cuò)跟蹤出錯(cuò)跟蹤符號(hào)服務(wù)符號(hào)服務(wù)監(jiān)視窗口監(jiān)視窗口自動(dòng)匹配窗口自動(dòng)匹配窗口斷點(diǎn)窗口斷點(diǎn)窗口編譯輸出窗口編譯輸出窗口VisualLISPVisualLISP控制臺(tái)控制臺(tái)瀏覽圖形數(shù)據(jù)庫(kù)瀏覽圖形數(shù)據(jù)庫(kù)選擇工具欄選擇工具欄圖圖6-1 View6-1 View下拉菜單下拉菜單打開監(jiān)視窗口打開監(jiān)視窗口匹配匹配符號(hào)服務(wù)符號(hào)服務(wù)堆棧跟蹤功能堆棧跟蹤功能打開檢測(cè)窗口打開檢測(cè)窗口激活控制臺(tái)窗口激活控制臺(tái)窗口確定活動(dòng)窗口確定活動(dòng)窗口切換到切換到AutoCAD圖形窗口圖形窗口 通過圖通過圖6-26-2所示所示DebugDebug下拉菜單和下拉菜單和DebugDeb
4、ug工具欄的選項(xiàng)可以設(shè)置程序暫停工具欄的選項(xiàng)可以設(shè)置程序暫停的模式和繼續(xù)程序運(yùn)行的方式。的模式和繼續(xù)程序運(yùn)行的方式。只執(zhí)行一步表達(dá)式求值。只執(zhí)行一步表達(dá)式求值。執(zhí)行到下一個(gè)斷點(diǎn),如無斷點(diǎn),則執(zhí)行一個(gè)完整的表達(dá)式求值。執(zhí)行到下一個(gè)斷點(diǎn),如無斷點(diǎn),則執(zhí)行一個(gè)完整的表達(dá)式求值。執(zhí)行到下一個(gè)斷點(diǎn),如無斷點(diǎn),則執(zhí)行一個(gè)最外層的表達(dá)式求值。執(zhí)行到下一個(gè)斷點(diǎn),如無斷點(diǎn),則執(zhí)行一個(gè)最外層的表達(dá)式求值。繼續(xù)執(zhí)行程序繼續(xù)執(zhí)行程序結(jié)束當(dāng)前程序。返回到控制臺(tái)的上一層中斷頂層讀算寫循環(huán)。結(jié)束當(dāng)前程序。返回到控制臺(tái)的上一層中斷頂層讀算寫循環(huán)。結(jié)束所有當(dāng)前活動(dòng)的斷點(diǎn)循環(huán)并返回到控制臺(tái)的頂層讀算寫循環(huán)。結(jié)束所有當(dāng)前活動(dòng)的斷點(diǎn)
5、循環(huán)并返回到控制臺(tái)的頂層讀算寫循環(huán)。添加監(jiān)視添加監(jiān)視回到最近一次監(jiān)視窗口的環(huán)境回到最近一次監(jiān)視窗口的環(huán)境設(shè)置設(shè)置/ /刪除斷點(diǎn)刪除斷點(diǎn)清除所有的斷點(diǎn)清除所有的斷點(diǎn)回到源程序上的最近一次的斷點(diǎn)回到源程序上的最近一次的斷點(diǎn)跟蹤命令跟蹤命令立即暫停立即暫停出錯(cuò)斷開出錯(cuò)斷開自動(dòng)運(yùn)行自動(dòng)運(yùn)行終止求值終止求值圖圖6-2 Debug6-2 Debug下拉菜單下拉菜單調(diào)試指示器按鈕顯示上一個(gè)斷點(diǎn)添加監(jiān)視設(shè)置或取消斷點(diǎn)切換重置為頂層退出當(dāng)前層繼續(xù)執(zhí)行跳出表達(dá)式下一個(gè)表達(dá)式下一層嵌套表達(dá)式Debug工具欄工具欄 6.2 6.2 監(jiān)視窗口監(jiān)視窗口 監(jiān)視窗口用于監(jiān)視變量、函數(shù)在程序運(yùn)行過程中的結(jié)果。選擇菜單監(jiān)視窗口用
6、于監(jiān)視變量、函數(shù)在程序運(yùn)行過程中的結(jié)果。選擇菜單D DebugebugW Watch Last Evaluationatch Last Evaluation。將彈出圖。將彈出圖6-36-3所示的所示的監(jiān)視監(jiān)視窗口。窗口。 圖圖6-3 6-3 監(jiān)視窗口監(jiān)視窗口 1. 1. 監(jiān)視窗口的工具欄監(jiān)視窗口的工具欄 監(jiān)視窗口的工具欄有四個(gè)圖像按鈕,從左至右依次是:監(jiān)視窗口的工具欄有四個(gè)圖像按鈕,從左至右依次是:添加監(jiān)視:將新的變量加入到監(jiān)視窗口。添加監(jiān)視:將新的變量加入到監(jiān)視窗口。 清除變量:清除監(jiān)視窗口內(nèi)的所有的變量。清除變量:清除監(jiān)視窗口內(nèi)的所有的變量。排序:將監(jiān)視窗口內(nèi)的變量名按字母順序排序。排序:
7、將監(jiān)視窗口內(nèi)的變量名按字母順序排序。復(fù)制到跟蹤復(fù)制到跟蹤/ /日志:將監(jiān)視窗口的內(nèi)容復(fù)制到跟蹤窗口。日志:將監(jiān)視窗口的內(nèi)容復(fù)制到跟蹤窗口。如果打開了日志選項(xiàng),監(jiān)視窗口中的這些內(nèi)容也將被復(fù)制到跟蹤日志文件。如果打開了日志選項(xiàng),監(jiān)視窗口中的這些內(nèi)容也將被復(fù)制到跟蹤日志文件。2. 2. 監(jiān)視窗口的快捷菜單監(jiān)視窗口的快捷菜單 選擇監(jiān)視列表中的某一項(xiàng)并單擊鼠標(biāo)右鍵,可顯示圖選擇監(jiān)視列表中的某一項(xiàng)并單擊鼠標(biāo)右鍵,可顯示圖6-46-4所示監(jiān)視窗口所示監(jiān)視窗口的快捷菜單。的快捷菜單。調(diào)用檢驗(yàn)功能,查看所選值。調(diào)用檢驗(yàn)功能,查看所選值。將所選變量的值復(fù)制到系統(tǒng)變量將所選變量的值復(fù)制到系統(tǒng)變量 * *objobj
8、* * 中。中。將所選變量值加上一個(gè)單引號(hào)前綴將所選變量值加上一個(gè)單引號(hào)前綴 ,打印到控制臺(tái)窗口。,打印到控制臺(tái)窗口。對(duì)所選變量調(diào)用符號(hào)服務(wù)對(duì)話框。對(duì)所選變量調(diào)用符號(hào)服務(wù)對(duì)話框。調(diào)用自動(dòng)匹配選項(xiàng)對(duì)話框,用所選變量名作自動(dòng)匹配參數(shù)。調(diào)用自動(dòng)匹配選項(xiàng)對(duì)話框,用所選變量名作自動(dòng)匹配參數(shù)。從監(jiān)視窗口中刪除所選變量。從監(jiān)視窗口中刪除所選變量。圖圖6-46-4監(jiān)視窗口的快捷菜單監(jiān)視窗口的快捷菜單 3. 3. 將變量加入到監(jiān)視窗口將變量加入到監(jiān)視窗口有三種途徑可以將新的變量加入到監(jiān)視窗口。有三種途徑可以將新的變量加入到監(jiān)視窗口。 (1 1) 點(diǎn)取工具欄上的添加監(jiān)視按鈕點(diǎn)取工具欄上的添加監(jiān)視按鈕 ,在隨后彈出
9、的圖,在隨后彈出的圖6-56-5所示的所示的添加添加監(jiān)視監(jiān)視窗口內(nèi)填入變量名,然后單擊窗口內(nèi)填入變量名,然后單擊OKOK按鈕。按鈕。 圖圖6-56-5添加監(jiān)視窗口添加監(jiān)視窗口 (2 2)亮顯要添加的變量名,然后點(diǎn)取工具欄上的添加監(jiān)視按鈕)亮顯要添加的變量名,然后點(diǎn)取工具欄上的添加監(jiān)視按鈕 ,隨,隨后彈出的圖后彈出的圖6-66-6所示的已填寫了該變量名的添加監(jiān)視窗口,然后單擊所示的已填寫了該變量名的添加監(jiān)視窗口,然后單擊OKOK按按鈕。鈕。(3 3)將光標(biāo)移至將要添加的變量名,單擊鼠標(biāo)右鍵,在隨后彈出的快捷)將光標(biāo)移至將要添加的變量名,單擊鼠標(biāo)右鍵,在隨后彈出的快捷菜單上選取菜單上選取Add W
10、atchAdd Watch菜單項(xiàng),將彈出已填寫了該變量名的添加監(jiān)視窗口,菜單項(xiàng),將彈出已填寫了該變量名的添加監(jiān)視窗口,然后單擊然后單擊OKOK按鈕。按鈕。 4. 4. 監(jiān)視變量的值監(jiān)視變量的值 監(jiān)視列表的每一行的格式是監(jiān)視列表的每一行的格式是 變量名變量名= =變量值變量值 ,例如:,例如:A = 1A = 1。如果程序。如果程序尚未運(yùn)行,變量的值是空的;隨著程序的運(yùn)行,在監(jiān)視窗口可以看到變量的尚未運(yùn)行,變量的值是空的;隨著程序的運(yùn)行,在監(jiān)視窗口可以看到變量的值也在不斷變化。值也在不斷變化。5. 5. 利用斷點(diǎn)和監(jiān)視窗口調(diào)試程序利用斷點(diǎn)和監(jiān)視窗口調(diào)試程序 假定在編輯器窗口已鍵入了圖假定在編輯器
11、窗口已鍵入了圖6-66-6所示的源程序。該程序的功能是根據(jù)用所示的源程序。該程序的功能是根據(jù)用戶輸入的兩個(gè)對(duì)角點(diǎn)繪制矩形。戶輸入的兩個(gè)對(duì)角點(diǎn)繪制矩形。 首先檢查該程序是否存在語法錯(cuò)誤。選擇菜單首先檢查該程序是否存在語法錯(cuò)誤。選擇菜單T ToolsoolsText in EditorText in Editor或或單擊按鈕,在單擊按鈕,在Build OutputBuild Output(輸出)窗口顯示(輸出)窗口顯示; Check done.; Check done.。說明該程序。說明該程序沒有語法錯(cuò)誤。沒有語法錯(cuò)誤。 選擇菜單選擇菜單T ToolsoolsLoad Text in Editor
12、Load Text in Editor或單擊按鈕或單擊按鈕 ,VisualLISPVisualLISP自自動(dòng)將控制切換到動(dòng)將控制切換到AutoCADAutoCAD界面。當(dāng)出現(xiàn)界面。當(dāng)出現(xiàn) 輸入矩形的一個(gè)角點(diǎn):輸入矩形的一個(gè)角點(diǎn): 的提示時(shí),輸?shù)奶崾緯r(shí),輸入入(0,0)(0,0)點(diǎn),該點(diǎn)是點(diǎn),該點(diǎn)是p1p1點(diǎn)的坐標(biāo);當(dāng)出現(xiàn)點(diǎn)的坐標(biāo);當(dāng)出現(xiàn) 輸入矩形的對(duì)角點(diǎn):輸入矩形的對(duì)角點(diǎn): 的提示時(shí),輸?shù)奶崾緯r(shí),輸入入(100,100)(100,100)點(diǎn),該點(diǎn)是點(diǎn),該點(diǎn)是p2p2點(diǎn)的坐標(biāo)。程序運(yùn)行結(jié)束,只得到了矩形的兩條邊,點(diǎn)的坐標(biāo)。程序運(yùn)行結(jié)束,只得到了矩形的兩條邊,顯然,這不是預(yù)期的運(yùn)行結(jié)果。顯然,這不
13、是預(yù)期的運(yùn)行結(jié)果。 下面演示如何利用監(jiān)視窗口調(diào)試程序。調(diào)試程序的步驟如下:下面演示如何利用監(jiān)視窗口調(diào)試程序。調(diào)試程序的步驟如下:(1 1)確定要監(jiān)視的變量。選擇菜單)確定要監(jiān)視的變量。選擇菜單D DebugebugA Add Watchdd Watch或單擊工具欄上的或單擊工具欄上的添加監(jiān)視按鈕添加監(jiān)視按鈕 ,在隨后彈出的添加監(jiān)視窗口內(nèi)填入變量名,在隨后彈出的添加監(jiān)視窗口內(nèi)填入變量名p1p1,然后,然后單擊單擊OKOK按鈕。用同樣的操作監(jiān)視變量按鈕。用同樣的操作監(jiān)視變量P2P2、P3P3、P4P4。圖圖6-66-6監(jiān)視監(jiān)視P1P1、P2P2、P3P3、P4P4點(diǎn)的值點(diǎn)的值(2 2)從圖)從圖6
14、-76-7所示監(jiān)視窗口可以看到:所示監(jiān)視窗口可以看到:P1 = 0.0 0.0 0.0P1 = 0.0 0.0 0.0、p2 = 100.0 0.0p2 = 100.0 0.0、p3 = 100.0 100.0 0.0p3 = 100.0 100.0 0.0、P4 = nil P4 = nil 100.0100.0。說明。說明P4P4點(diǎn)的點(diǎn)的X X坐標(biāo)是無定義的,而坐標(biāo)是無定義的,而X X坐標(biāo)是坐標(biāo)是(car pl)(car pl)的的返回值,檢查返回值,檢查(car pl)(car pl),carcar是正確的,亮顯是正確的,亮顯plpl,單擊添加監(jiān),單擊添加監(jiān)視按鈕視按鈕 ,監(jiān)視窗口內(nèi)出現(xiàn)
15、,監(jiān)視窗口內(nèi)出現(xiàn)PL = nilPL = nil,PLPL本不是該程序的變量,本不是該程序的變量,是是p1p1的誤寫。的誤寫。(3 3)修改源程序代碼,將)修改源程序代碼,將plpl改寫為改寫為p1p1;重新加載、運(yùn)行該程;重新加載、運(yùn)行該程序;直到該程序可以正常運(yùn)行,調(diào)試結(jié)束。序;直到該程序可以正常運(yùn)行,調(diào)試結(jié)束。6.3 6.3 在不設(shè)置斷點(diǎn)的情況下分步調(diào)試程序在不設(shè)置斷點(diǎn)的情況下分步調(diào)試程序 分步調(diào)試就是將一個(gè)完整的程序分為若干步,逐步調(diào)試。每步可以是分步調(diào)試就是將一個(gè)完整的程序分為若干步,逐步調(diào)試。每步可以是最內(nèi)層的一個(gè)表達(dá)式,也可以是一個(gè)復(fù)雜的表達(dá)式,還可以是多個(gè)表達(dá)式。最內(nèi)層的一個(gè)表
16、達(dá)式,也可以是一個(gè)復(fù)雜的表達(dá)式,還可以是多個(gè)表達(dá)式??梢酝ㄟ^設(shè)置斷點(diǎn)將程序分為若干段,也可以不用斷點(diǎn)而是通過步長(zhǎng)將程可以通過設(shè)置斷點(diǎn)將程序分為若干段,也可以不用斷點(diǎn)而是通過步長(zhǎng)將程序分為若干步。序分為若干步。 結(jié)合下例程序介紹幾種調(diào)試程序的方法。結(jié)合下例程序介紹幾種調(diào)試程序的方法。【例例6-16-1】 定義繪制矩形的命令,矩形的一個(gè)角點(diǎn)、寬、高和旋轉(zhuǎn)角為交定義繪制矩形的命令,矩形的一個(gè)角點(diǎn)、寬、高和旋轉(zhuǎn)角為交互輸入的參數(shù)。互輸入的參數(shù)。程序的源代碼如下:程序的源代碼如下:(defun c:rectr(/ w h alf p1 p2 p3 p4)(defun c:rectr(/ w h alf
17、p1 p2 p3 p4) (setq p1(getpoint (setq p1(getpoint 輸入矩形的一個(gè)角點(diǎn):輸入矩形的一個(gè)角點(diǎn):) w (getdist p1 w (getdist p1 輸入矩形的寬:輸入矩形的寬:) h (getdist p1 h (getdist p1 輸入矩形的高輸入矩形的高: ): ) alf (getangle p1 alf (getangle p1 輸入矩形的旋轉(zhuǎn)角輸入矩形的旋轉(zhuǎn)角: ): ) ) )Walfhp1p2p3p4 (setq p2(polar p1 alf w) (setq p2(polar p1 alf w) (setq p3(polar
18、 p2 (+ alf ( (setq p3(polar p2 (+ alf (* * 0.5 pi) h) 0.5 pi) h) (setq p4(polar p3 (+ alf pi) w) (setq p4(polar p3 (+ alf pi) w) (command pline p1 p2 p3 p4 c) (command pline p1 p2 p3 p4 c) (princ) (princ) )1. 1. 從第一個(gè)表達(dá)式開始,逐步調(diào)試程序從第一個(gè)表達(dá)式開始,逐步調(diào)試程序(1 1)選擇菜單)選擇菜單F FileileO Open Filepen File或單擊按鈕或單擊按鈕 ,將,
19、將 例例6-16-1所示源代碼錄所示源代碼錄入文本編輯窗口。選擇菜單入文本編輯窗口。選擇菜單D DebugebugA Add Watchdd Watch或單擊按鈕或單擊按鈕 ,監(jiān)視變量,監(jiān)視變量w w、h h、alfalf、p1p1、p2p2、p3p3、p4p4。選擇菜單。選擇菜單T ToolsoolsLoad Text in Load Text in E Editorditor或單擊或單擊按鈕按鈕 ,加載該程序。,加載該程序。(2 2)通過菜單)通過菜單D DebugebugStop OStop On ncece,使之處于打開的狀態(tài)。,使之處于打開的狀態(tài)。(3 3)單擊按鈕)單擊按鈕 ,切換
20、到,切換到AutoCADAutoCAD窗口,在窗口,在AutoCADAutoCAD的的CommandCommand:提示下,:提示下,鍵入鍵入rect3rect3命令。命令。Walfhp1p2p3p4 控制自動(dòng)切換到控制自動(dòng)切換到VisualLISPVisualLISP文本編輯窗口,監(jiān)視窗口內(nèi)的變文本編輯窗口,監(jiān)視窗口內(nèi)的變量值均為量值均為nilnil。此時(shí)光標(biāo)停在。此時(shí)光標(biāo)停在(defun(defun之前,整個(gè)程序被加亮顯示。之前,整個(gè)程序被加亮顯示。選取下拉菜單選取下拉菜單D Debugebug的的Step Step I Intonto項(xiàng)、項(xiàng)、F8F8功能鍵或單擊按鈕功能鍵或單擊按鈕 ,光
21、標(biāo)停在光標(biāo)停在(setq p1(setq p1之前,與之匹配的右括號(hào)之間被加亮顯示。單之前,與之匹配的右括號(hào)之間被加亮顯示。單擊按鈕擊按鈕 ,光標(biāo)停在,光標(biāo)停在(getpoint (getpoint 輸入矩形的一個(gè)角點(diǎn):輸入矩形的一個(gè)角點(diǎn):)之之前,并亮顯該表達(dá)式。注意,指示按鈕內(nèi)的前,并亮顯該表達(dá)式。注意,指示按鈕內(nèi)的II在在 ()() 之前。之前。 單擊按鈕單擊按鈕 ,程序切換到,程序切換到AutoCADAutoCAD窗口,出現(xiàn)窗口,出現(xiàn) 輸入矩形的輸入矩形的一個(gè)角點(diǎn):一個(gè)角點(diǎn): 的提示,輸入的提示,輸入(100,80)(100,80),程序切換到,程序切換到VisualLISPVisua
22、lLISP的文本編輯窗口。光標(biāo)停在的文本編輯窗口。光標(biāo)停在(getpoint (getpoint 輸入矩形的一個(gè)角點(diǎn):輸入矩形的一個(gè)角點(diǎn):)之后,仍然亮顯該表達(dá)式。注意,指示按鈕內(nèi)的之后,仍然亮顯該表達(dá)式。注意,指示按鈕內(nèi)的 I I 在在 ()() 之后。之后。 單擊按鈕單擊按鈕 ,光標(biāo)停在,光標(biāo)停在(getdist p1 (getdist p1 輸入矩形的寬:輸入矩形的寬:)之前,并亮顯該表達(dá)式。注意,指示按鈕內(nèi)的之前,并亮顯該表達(dá)式。注意,指示按鈕內(nèi)的II回到回到 ()() 之之前。監(jiān)視窗口內(nèi)的變量前。監(jiān)視窗口內(nèi)的變量p1=100.0 80.0 0.0p1=100.0 80.0 0.0。重
23、復(fù)類似的操。重復(fù)類似的操作,在作,在AutoCADAutoCAD窗口輸入矩形的寬度為窗口輸入矩形的寬度為200200、高度為、高度為150150,旋轉(zhuǎn)角,旋轉(zhuǎn)角為為3030。在操作過程中指示按鈕隨時(shí)顯示著光標(biāo)相對(duì)于表達(dá)式的位。在操作過程中指示按鈕隨時(shí)顯示著光標(biāo)相對(duì)于表達(dá)式的位置,監(jiān)視窗口顯示著這些變量的當(dāng)前值(注意,置,監(jiān)視窗口顯示著這些變量的當(dāng)前值(注意,alfalf的單位為弧的單位為弧度)。也說明單擊按鈕度)。也說明單擊按鈕 只執(zhí)行了一步表達(dá)式求值。只執(zhí)行了一步表達(dá)式求值。 當(dāng)光標(biāo)停在當(dāng)光標(biāo)停在(setq p3(polar p2 (+ alf (setq p3(polar p2 (+ al
24、f (* * 0.5 pi) h) 0.5 pi) h)之之前時(shí),單擊按鈕前時(shí),單擊按鈕 ,整個(gè)程序被加亮顯示,光標(biāo)停在整個(gè)程序,整個(gè)程序被加亮顯示,光標(biāo)停在整個(gè)程序的結(jié)尾,再單擊以上任一按鈕,程序運(yùn)行結(jié)束。的結(jié)尾,再單擊以上任一按鈕,程序運(yùn)行結(jié)束。 切換到切換到AutoCADAutoCAD窗口,顯示著剛才繪制的矩形。窗口,顯示著剛才繪制的矩形。 假定程序的第假定程序的第5 5行誤寫為行誤寫為 (getangl p1 (getangl p1 輸入矩形的旋轉(zhuǎn)輸入矩形的旋轉(zhuǎn)角角: ): ),仍舊用上述的方法調(diào)試該程序,當(dāng)執(zhí)行到,仍舊用上述的方法調(diào)試該程序,當(dāng)執(zhí)行到 輸入矩形的輸入矩形的旋轉(zhuǎn)角旋轉(zhuǎn)角
25、: : 時(shí),將出現(xiàn)提示時(shí),將出現(xiàn)提示 ; error: no function definition: ; error: no function definition: GETANGLGETANGL(沒有(沒有GETANGLGETANGL這個(gè)函數(shù)定義)這個(gè)函數(shù)定義) 。點(diǎn)取查找按鈕。點(diǎn)取查找按鈕 ,在隨后彈出的在隨后彈出的 FIND FIND 對(duì)話框的對(duì)話框的FiFin ndWhatdWhat編輯框輸入查找內(nèi)容為編輯框輸入查找內(nèi)容為 GETANGLGETANGL ,單擊,單擊 F Findind按鈕,找到按鈕,找到getanglgetangl并改正為并改正為getanglegetangle。
26、重新調(diào)試程序,直至程序正常運(yùn)行。重新調(diào)試程序,直至程序正常運(yùn)行。2. 2. 自動(dòng)分步調(diào)試程序自動(dòng)分步調(diào)試程序(1 1)自動(dòng)分步調(diào)試程序的步驟)自動(dòng)分步調(diào)試程序的步驟 將例將例6-16-1源代碼的文件裝入文本編輯窗口。監(jiān)視變量源代碼的文件裝入文本編輯窗口。監(jiān)視變量w w、h h、alfalf、p1p1、p2p2、p3p3、p4p4。加載該程序。選擇菜單。加載該程序。選擇菜單D DebugebugAnimatAnimate e。 在在AutoCADAutoCAD的的CommandCommand: 提示下,鍵入提示下,鍵入rect3rect3命令。命令。Visua Visua lLISPlLISP自
27、動(dòng)切換到文本編輯窗口。隨著光標(biāo)的位置、指示按鈕自動(dòng)切換到文本編輯窗口。隨著光標(biāo)的位置、指示按鈕 內(nèi)內(nèi)II和和 ()() 的變化,自動(dòng)地執(zhí)行每一個(gè)表達(dá)式的求值,監(jiān)視的變化,自動(dòng)地執(zhí)行每一個(gè)表達(dá)式的求值,監(jiān)視窗口內(nèi)的變量值也相應(yīng)地改變。如果遇到了錯(cuò)誤的函數(shù)調(diào)用,窗口內(nèi)的變量值也相應(yīng)地改變。如果遇到了錯(cuò)誤的函數(shù)調(diào)用,程序停止運(yùn)行,并報(bào)告程序停止運(yùn)行,并報(bào)告 ; error: no function definition: ; error: no function definition: 信息。找到并改正錯(cuò)誤的函數(shù)。繼續(xù)調(diào)試程序,直至程序正信息。找到并改正錯(cuò)誤的函數(shù)。繼續(xù)調(diào)試程序,直至程序正常運(yùn)行。常
28、運(yùn)行。(2 2)設(shè)置每步延遲的時(shí)間)設(shè)置每步延遲的時(shí)間 選擇菜單選擇菜單T ToolsoolsEnvironmant Environmant O OptionsptionsG General eneral O Options ptions 彈出圖彈出圖6-76-7所示所示General General O Optionsptions對(duì)話框。單對(duì)話框。單擊該對(duì)話框的擊該對(duì)話框的DiagnosticDiagnostic(診斷)卡,在(診斷)卡,在A Animation nimation delaydelay編輯框輸入每步延遲的時(shí)間(以毫秒為單位),編輯框輸入每步延遲的時(shí)間(以毫秒為單位),單擊確定
29、按鈕即可。單擊確定按鈕即可。圖圖6-76-7診斷選項(xiàng)卡診斷選項(xiàng)卡 6.4 6.4 斷點(diǎn)循環(huán)斷點(diǎn)循環(huán) 表達(dá)式是表達(dá)式是AutoLISPAutoLISP程序的基本單元,程序的基本單元,LISPLISP的工作實(shí)際上是不的工作實(shí)際上是不斷地對(duì)表達(dá)式進(jìn)行讀入、求值和輸出操作,在斷地對(duì)表達(dá)式進(jìn)行讀入、求值和輸出操作,在LISPLISP術(shù)語中,被稱術(shù)語中,被稱為讀算寫循環(huán)。為讀算寫循環(huán)。 如果不用調(diào)試工具而是正常地運(yùn)行如果不用調(diào)試工具而是正常地運(yùn)行AutoLISPAutoLISP程序時(shí),程序?qū)⒊绦驎r(shí),程序?qū)⑻幱陧攲拥淖x算寫循環(huán)。如果在處于頂層的讀算寫循環(huán)。如果在VisualLISPVisualLISP控制臺(tái)
30、窗口內(nèi)對(duì)表達(dá)控制臺(tái)窗口內(nèi)對(duì)表達(dá)式求值時(shí),也是處于頂層的讀算寫循環(huán)。式求值時(shí),也是處于頂層的讀算寫循環(huán)。 如果程序在運(yùn)行時(shí)被中斷或掛起,如果程序在運(yùn)行時(shí)被中斷或掛起,VisualLISPVisualLISP將控制轉(zhuǎn)交給將控制轉(zhuǎn)交給控制臺(tái),就進(jìn)入了斷點(diǎn)循環(huán)(控制臺(tái),就進(jìn)入了斷點(diǎn)循環(huán)(Break loopBreak loop)。斷點(diǎn)循環(huán)是一個(gè)單)。斷點(diǎn)循環(huán)是一個(gè)單獨(dú)的讀算寫循環(huán),它嵌套在原有的讀算寫循環(huán)內(nèi)。斷點(diǎn)循環(huán)也可獨(dú)的讀算寫循環(huán),它嵌套在原有的讀算寫循環(huán)內(nèi)。斷點(diǎn)循環(huán)也可以被中斷,這時(shí)將開始一個(gè)嵌套于該斷點(diǎn)循環(huán)內(nèi)的讀算寫循環(huán)。以被中斷,這時(shí)將開始一個(gè)嵌套于該斷點(diǎn)循環(huán)內(nèi)的讀算寫循環(huán)。斷點(diǎn)循環(huán)相對(duì)于頂
31、層循環(huán)嵌套的層數(shù)稱為該中斷的層數(shù)。斷點(diǎn)循環(huán)相對(duì)于頂層循環(huán)嵌套的層數(shù)稱為該中斷的層數(shù)。 進(jìn)入斷點(diǎn)循環(huán)時(shí),進(jìn)入斷點(diǎn)循環(huán)時(shí),VisualLISPVisualLISP將在控制臺(tái)提示將在控制臺(tái)提示_$_$前加一個(gè)數(shù)字來指出所處循環(huán)的層數(shù)。例如,當(dāng)首次進(jìn)前加一個(gè)數(shù)字來指出所處循環(huán)的層數(shù)。例如,當(dāng)首次進(jìn)入程序的斷點(diǎn)循環(huán)時(shí),提示為入程序的斷點(diǎn)循環(huán)時(shí),提示為_1_$_1_$。如果處于斷點(diǎn)循。如果處于斷點(diǎn)循環(huán)狀態(tài),就不能將控制切換到環(huán)狀態(tài),就不能將控制切換到AutoCADAutoCAD窗口。窗口。 從斷點(diǎn)循環(huán)退出,將恢復(fù)上一層循環(huán)。如果在該從斷點(diǎn)循環(huán)退出,將恢復(fù)上一層循環(huán)。如果在該斷點(diǎn)循環(huán)中修改了某變量的值,程序
32、繼續(xù)運(yùn)行時(shí)將使用斷點(diǎn)循環(huán)中修改了某變量的值,程序繼續(xù)運(yùn)行時(shí)將使用變量修改后的值。變量修改后的值。斷點(diǎn)循環(huán)分為斷點(diǎn)循環(huán)分為可繼續(xù)斷點(diǎn)循環(huán)可繼續(xù)斷點(diǎn)循環(huán)和和不可繼續(xù)斷點(diǎn)循環(huán)不可繼續(xù)斷點(diǎn)循環(huán)。1. 1. 可繼續(xù)的斷點(diǎn)循環(huán)可繼續(xù)的斷點(diǎn)循環(huán) 可繼續(xù)的斷點(diǎn)循環(huán)是指可以在程序中斷處,繼續(xù)向下執(zhí)行剩可繼續(xù)的斷點(diǎn)循環(huán)是指可以在程序中斷處,繼續(xù)向下執(zhí)行剩余的表達(dá)式。用以下方法進(jìn)入可繼續(xù)斷點(diǎn)循環(huán):余的表達(dá)式。用以下方法進(jìn)入可繼續(xù)斷點(diǎn)循環(huán):(1 1)打開)打開Stop OnceStop Once模式,碰到帶調(diào)試信息的表達(dá)式時(shí)。模式,碰到帶調(diào)試信息的表達(dá)式時(shí)。(2 2)遇到帶)遇到帶Debug on EntryDebu
33、g on Entry(進(jìn)入時(shí)調(diào)試)標(biāo)志的函數(shù)時(shí)。(進(jìn)入時(shí)調(diào)試)標(biāo)志的函數(shù)時(shí)。(3 3)遇到程序中設(shè)置的斷點(diǎn)時(shí)。)遇到程序中設(shè)置的斷點(diǎn)時(shí)。(4 4)單擊暫停按鈕進(jìn)入斷點(diǎn)循環(huán)時(shí)。)單擊暫停按鈕進(jìn)入斷點(diǎn)循環(huán)時(shí)。(5 5)在前一個(gè)斷點(diǎn)循環(huán)狀態(tài)下,執(zhí)行)在前一個(gè)斷點(diǎn)循環(huán)狀態(tài)下,執(zhí)行Step IntoStep Into、Step OverStep Over或或Step OutStep Out時(shí)。時(shí)。 如果程序在某函數(shù)中被中斷,可以訪問被該函數(shù)聲明的局部如果程序在某函數(shù)中被中斷,可以訪問被該函數(shù)聲明的局部變量,甚至可以在控制臺(tái)提示下用變量,甚至可以在控制臺(tái)提示下用setqsetq函數(shù)修改它們的值。函數(shù)修改它
34、們的值。2. 2. 不可繼續(xù)的斷點(diǎn)循環(huán)不可繼續(xù)的斷點(diǎn)循環(huán) 當(dāng)程序出現(xiàn)錯(cuò)誤導(dǎo)致崩潰時(shí),如果設(shè)置了當(dāng)程序出現(xiàn)錯(cuò)誤導(dǎo)致崩潰時(shí),如果設(shè)置了Break On ErrorBreak On Error選選項(xiàng),將激活一個(gè)不可繼續(xù)的斷點(diǎn)循環(huán)。此時(shí)可以訪問出錯(cuò)環(huán)境項(xiàng),將激活一個(gè)不可繼續(xù)的斷點(diǎn)循環(huán)。此時(shí)可以訪問出錯(cuò)環(huán)境中的所有變量,但不能繼續(xù)執(zhí)行程序或執(zhí)行任何單步調(diào)試程序中的所有變量,但不能繼續(xù)執(zhí)行程序或執(zhí)行任何單步調(diào)試程序的命令。的命令。 如果工具欄上的單步調(diào)試的按鈕如果工具欄上的單步調(diào)試的按鈕 、 、 或繼續(xù)運(yùn)行或繼續(xù)運(yùn)行的按鈕的按鈕 處于可用狀態(tài),說明此時(shí)進(jìn)入了可繼續(xù)的斷點(diǎn)循環(huán)。處于可用狀態(tài),說明此時(shí)進(jìn)入了可
35、繼續(xù)的斷點(diǎn)循環(huán)。 處于不可繼續(xù)的斷點(diǎn)循環(huán)時(shí),選取處于不可繼續(xù)的斷點(diǎn)循環(huán)時(shí),選取D Debugebug菜單的菜單的R Reset to eset to Top LevelTop Level項(xiàng)或單擊按鈕項(xiàng)或單擊按鈕 ,退出斷點(diǎn)循環(huán)并跳轉(zhuǎn)至控制臺(tái)頂,退出斷點(diǎn)循環(huán)并跳轉(zhuǎn)至控制臺(tái)頂層循環(huán);選取層循環(huán);選取D Debugebug菜單的菜單的Q Quit Currentuit Current項(xiàng)或單擊按鈕項(xiàng)或單擊按鈕 ,退,退出斷點(diǎn)循環(huán)并返回到上一層循環(huán)。出斷點(diǎn)循環(huán)并返回到上一層循環(huán)。6.5 6.5 利用斷點(diǎn)調(diào)試程序利用斷點(diǎn)調(diào)試程序 運(yùn)行的程序遇到斷點(diǎn)時(shí),將產(chǎn)生一個(gè)中斷。當(dāng)程序中斷時(shí)運(yùn)行的程序遇到斷點(diǎn)時(shí),將產(chǎn)
36、生一個(gè)中斷。當(dāng)程序中斷時(shí), ,可查看、分析變量的值,修改程序的源代碼。利用斷點(diǎn)可提高可查看、分析變量的值,修改程序的源代碼。利用斷點(diǎn)可提高調(diào)試程序的效率。調(diào)試程序的效率。1. 1. 有關(guān)斷點(diǎn)的操作有關(guān)斷點(diǎn)的操作(1 1)在程序中設(shè)置)在程序中設(shè)置/ /刪除斷點(diǎn)刪除斷點(diǎn) 只能在只能在VisualLISPVisualLISP的文本編輯器窗口內(nèi)設(shè)置斷點(diǎn)。斷點(diǎn)應(yīng)位的文本編輯器窗口內(nèi)設(shè)置斷點(diǎn)。斷點(diǎn)應(yīng)位于表達(dá)式的左、右括號(hào)上。設(shè)置斷點(diǎn)的步驟如下:于表達(dá)式的左、右括號(hào)上。設(shè)置斷點(diǎn)的步驟如下: 將光標(biāo)移到需要程序暫停的位置。例如,需要在某表達(dá)式將光標(biāo)移到需要程序暫停的位置。例如,需要在某表達(dá)式 之前暫停,則應(yīng)
37、將光標(biāo)移至與表達(dá)式的左括號(hào)相鄰的位置。之前暫停,則應(yīng)將光標(biāo)移至與表達(dá)式的左括號(hào)相鄰的位置。 選擇菜單選擇菜單D DebugebugT Toggle Breakpointoggle Breakpoint、單擊按鈕、單擊按鈕 或按或按F9F9鍵。如果該位置沒有斷點(diǎn),就加入一個(gè)斷點(diǎn),否則,刪除該鍵。如果該位置沒有斷點(diǎn),就加入一個(gè)斷點(diǎn),否則,刪除該斷點(diǎn)。單擊鼠標(biāo)右鍵在快捷菜單中選擇斷點(diǎn)。單擊鼠標(biāo)右鍵在快捷菜單中選擇Toggle BreakpointToggle Breakpoint項(xiàng)項(xiàng)也可以設(shè)置或刪除斷點(diǎn)。如果光標(biāo)不與括號(hào)相鄰,也可以設(shè)置或刪除斷點(diǎn)。如果光標(biāo)不與括號(hào)相鄰,Visual Visual L
38、ISPLISP暫時(shí)將光標(biāo)移到后面最近的右括號(hào)處,并通過對(duì)話框詢問暫時(shí)將光標(biāo)移到后面最近的右括號(hào)處,并通過對(duì)話框詢問用戶是否在該處設(shè)置斷點(diǎn)。用戶是否在該處設(shè)置斷點(diǎn)。 選擇菜單選擇菜單D DebugClear All ebugClear All B Breakpointsreakpoints項(xiàng),刪除已設(shè)置項(xiàng),刪除已設(shè)置的所有斷點(diǎn)。的所有斷點(diǎn)。(2 2)改變斷點(diǎn)的顏色)改變斷點(diǎn)的顏色 VisualLISPVisualLISP用高亮矩形顯示每一個(gè)斷點(diǎn),默認(rèn)情況下,活動(dòng)的斷點(diǎn)是紅色用高亮矩形顯示每一個(gè)斷點(diǎn),默認(rèn)情況下,活動(dòng)的斷點(diǎn)是紅色的。選擇菜單的。選擇菜單T ToolsoolsW Window Att
39、ributesindow AttributesC Configure Current onfigure Current ,通過隨后,通過隨后彈出的彈出的Window AttributesWindow Attributes對(duì)話框內(nèi)的對(duì)話框內(nèi)的WINDOW-TEXTWINDOW-TEXT下拉列表的下拉列表的:BPT-ACTIVE:BPT-ACTIVE項(xiàng)項(xiàng)可改變斷點(diǎn)的顏色??筛淖償帱c(diǎn)的顏色。(3 3)臨時(shí)禁用斷點(diǎn))臨時(shí)禁用斷點(diǎn) 斷點(diǎn)可以被臨時(shí)禁用和恢復(fù)使用。禁用斷點(diǎn)的步驟如下:斷點(diǎn)可以被臨時(shí)禁用和恢復(fù)使用。禁用斷點(diǎn)的步驟如下: 將光標(biāo)置于斷點(diǎn)處并單擊鼠標(biāo)右鍵。將光標(biāo)置于斷點(diǎn)處并單擊鼠標(biāo)右鍵。 從顯示
40、的快捷菜單上選擇從顯示的快捷菜單上選擇Breakpoints serviceBreakpoints service項(xiàng),將彈出圖項(xiàng),將彈出圖6-86-8所示斷所示斷點(diǎn)服務(wù)對(duì)話框。點(diǎn)服務(wù)對(duì)話框。圖圖6-86-8斷點(diǎn)服務(wù)對(duì)話框斷點(diǎn)服務(wù)對(duì)話框 在斷點(diǎn)服務(wù)對(duì)話框中單擊在斷點(diǎn)服務(wù)對(duì)話框中單擊D Disableisable按鈕可臨時(shí)禁用該斷點(diǎn);若該斷點(diǎn)已被按鈕可臨時(shí)禁用該斷點(diǎn);若該斷點(diǎn)已被禁用,圖禁用,圖6-96-9所示斷點(diǎn)服務(wù)對(duì)話框?qū)⒊霈F(xiàn)所示斷點(diǎn)服務(wù)對(duì)話框?qū)⒊霈F(xiàn)E Enablenable按鈕,單擊該按鈕,所選斷點(diǎn)按鈕,單擊該按鈕,所選斷點(diǎn)將改變?yōu)榭捎脿顟B(tài)。將改變?yōu)榭捎脿顟B(tài)。 默認(rèn)情況下,被禁用的斷點(diǎn)顯示為
41、藍(lán)色。用設(shè)置斷點(diǎn)顏色的方法也可以改默認(rèn)情況下,被禁用的斷點(diǎn)顯示為藍(lán)色。用設(shè)置斷點(diǎn)顏色的方法也可以改變被禁用斷點(diǎn)的顏色。變被禁用斷點(diǎn)的顏色。(4 4)瀏覽和編輯程序中的斷點(diǎn))瀏覽和編輯程序中的斷點(diǎn) 選擇菜單選擇菜單V ViewBreaiewBreak kpoints Windowpoints Window將看到圖將看到圖6-96-9所示的斷點(diǎn)對(duì)話框。所示的斷點(diǎn)對(duì)話框。圖圖6-96-9斷點(diǎn)對(duì)話框斷點(diǎn)對(duì)話框 該斷點(diǎn)窗口列出了所有編輯器窗口的斷點(diǎn)。其中有程序該斷點(diǎn)窗口列出了所有編輯器窗口的斷點(diǎn)。其中有程序6-1.lsp6-1.lsp的的3 3個(gè)斷個(gè)斷點(diǎn)、點(diǎn)、 6-2.lsp6-2.lsp的的2 2個(gè)斷
42、點(diǎn)。每項(xiàng)包含斷點(diǎn)的源文件名以及斷點(diǎn)在源文件中的個(gè)斷點(diǎn)。每項(xiàng)包含斷點(diǎn)的源文件名以及斷點(diǎn)在源文件中的位置,位置是以位置,位置是以0 0開始的西文字符數(shù)量,前面的開始的西文字符數(shù)量,前面的+號(hào)表示該斷點(diǎn)是活動(dòng)的,號(hào)表示該斷點(diǎn)是活動(dòng)的,- - 號(hào)表示該斷點(diǎn)是被禁用的。號(hào)表示該斷點(diǎn)是被禁用的。 單擊該對(duì)話框的單擊該對(duì)話框的Delete allDelete all按鈕可以刪除所有的斷點(diǎn);亮顯一項(xiàng),單擊按鈕可以刪除所有的斷點(diǎn);亮顯一項(xiàng),單擊S Showhow按鈕可顯示該斷點(diǎn)所在的源文件及其在源文件中的位置;單擊按鈕可顯示該斷點(diǎn)所在的源文件及其在源文件中的位置;單擊DeleteDelete按按鈕可刪除該斷點(diǎn);
43、單擊鈕可刪除該斷點(diǎn);單擊E Editdit按鈕可打開圖按鈕可打開圖6-96-9所示的斷點(diǎn)服務(wù)對(duì)話框,利用所示的斷點(diǎn)服務(wù)對(duì)話框,利用該對(duì)話框可以改變斷點(diǎn)可用或禁用的狀態(tài)。該對(duì)話框可以改變斷點(diǎn)可用或禁用的狀態(tài)。(5 5) 斷點(diǎn)的生命周期斷點(diǎn)的生命周期 可以在加載程序之前或之后設(shè)置斷點(diǎn)。如果在加載程序之后設(shè)置斷點(diǎn),可以在加載程序之前或之后設(shè)置斷點(diǎn)。如果在加載程序之后設(shè)置斷點(diǎn),該斷點(diǎn)只有在重新加載程序之后才有效。該斷點(diǎn)只有在重新加載程序之后才有效。2. 2. 在斷點(diǎn)處繼續(xù)運(yùn)行程序在斷點(diǎn)處繼續(xù)運(yùn)行程序 運(yùn)行的程序遇到斷點(diǎn)時(shí),將產(chǎn)生一個(gè)中斷,即斷點(diǎn)循環(huán)。單運(yùn)行的程序遇到斷點(diǎn)時(shí),將產(chǎn)生一個(gè)中斷,即斷點(diǎn)循環(huán)。
44、單擊分布調(diào)試按鈕擊分布調(diào)試按鈕 、 和和 可繼續(xù)運(yùn)行程序。如果在復(fù)雜的可繼續(xù)運(yùn)行程序。如果在復(fù)雜的表達(dá)式之內(nèi)還有一些斷點(diǎn),單擊按鈕表達(dá)式之內(nèi)還有一些斷點(diǎn),單擊按鈕 和和 ,首先在斷點(diǎn)處暫,首先在斷點(diǎn)處暫停。此外還有以下控制程序繼續(xù)運(yùn)行的工具欄按鈕、快捷鍵或停。此外還有以下控制程序繼續(xù)運(yùn)行的工具欄按鈕、快捷鍵或D Debugebug菜單的菜單項(xiàng)。菜單的菜單項(xiàng)。 ContinueContinue或或CtrlCtrl+ +F8F8:繼續(xù)執(zhí)行程序直至遇到下一個(gè)斷點(diǎn):繼續(xù)執(zhí)行程序直至遇到下一個(gè)斷點(diǎn)(如果有)或程序結(jié)束。(如果有)或程序結(jié)束。 Quit CurrentQuit Current或或CtrlC
45、trl+ +Q Q:結(jié)束當(dāng)前程序,返回到控制臺(tái)的:結(jié)束當(dāng)前程序,返回到控制臺(tái)的上一層斷點(diǎn)循環(huán)。上一層斷點(diǎn)循環(huán)。 Reset to Top LevelReset to Top Level或或CtrlCtrl+ +R R:結(jié)束當(dāng)前程序,結(jié)束所有:結(jié)束當(dāng)前程序,結(jié)束所有的斷點(diǎn)循環(huán)。的斷點(diǎn)循環(huán)。3. 3. 利用斷點(diǎn)調(diào)試程序?qū)嵗脭帱c(diǎn)調(diào)試程序?qū)嵗纠?-26-2】 定義繪制圖定義繪制圖6-106-10所示圖形的命令,所示圖形的命令,p0p0、d d、b b、t1t1、alfalf是交互輸是交互輸入的參數(shù)。入的參數(shù)。圖圖6-106-10軸的鍵槽部位截面軸的鍵槽部位截面 程序源代碼如下:程序源代碼如下:
46、(defun c:tuxing (/ p0 alf d b t1 r l b1 sit p1 p2 p3 p4 p5)(defun c:tuxing (/ p0 alf d b t1 r l b1 sit p1 p2 p3 p4 p5)(setq p0 (getpoint nEnter P0: )(setq p0 (getpoint nEnter P0: )(setq d (getdist p0 nEnter d: )(setq d (getdist p0 nEnter d: ) (setq b (getdist p0 nEnter b: ) (setq b (getdist p0 nEnte
47、r b: ) (setq tl (getdist p0 nEnter t1: ) (setq tl (getdist p0 nEnter t1: ) ;tl;tl應(yīng)改為應(yīng)改為t1t1 (setq alf (getangle p0 nEnter alf: ) (setq alf (getangle p0 nEnter alf: ) ;斷點(diǎn);斷點(diǎn)1 1的位置的位置 (setq r (setq r (* * 0.5 d) bl ( 0.5 d) bl (* * 0.5 b) 0.5 b) (setq l (sqrt (- ( (setq l (sqrt (- (* * r r) ( r r) (*
48、* b1 b1) b1 b1) (setq sit (tan b1 l) (setq sit (tan b1 l) ;tan;tan應(yīng)改為應(yīng)改為atanatan (setq p1 (polar p0 (+ alf sit) r) (setq p1 (polar p0 (+ alf sit) r) (setq p2 (polar p0 (+ pi alf) r) (setq p2 (polar p0 (+ pi alf) r) (setq p3 (polar p0 (- alf sit) r) (setq p3 (polar p0 (- alf sit) r) (setq p4 (polar p
49、3 (+ pi alf) (- (+ r l) t1) (setq p4 (polar p3 (+ pi alf) (- (+ r l) t1) (setq p5 (polar p1 (+ alf pi) (- (+ r l) t1) (setq p5 (polar p1 (+ alf pi) (- (+ r l) t1) (command pline p1 a s p2 p3 l p4 p5 c) (command pline p1 a s p2 p3 l p4 p5 c) ) 選擇菜單選擇菜單F FileileO Open Filepen File將例將例6-26-2所示源代碼的文件裝入文
50、所示源代碼的文件裝入文本編輯窗口。選擇菜單本編輯窗口。選擇菜單D DebugebugA Add Watchdd Watch或單擊按鈕或單擊按鈕 ,監(jiān)視,監(jiān)視變量變量p0p0、d d、b b、t1t1、alfalf、r r、l l、b1b1、sitsit、p1p1、p2p2、p3p3、p4p4、p5p5。 加載該程序,單擊按鈕加載該程序,單擊按鈕 ,在,在AutoCADAutoCAD的的Command:Command:提示下鍵入提示下鍵入TUXINGTUXING命令,程序停止運(yùn)行,出現(xiàn)提示命令,程序停止運(yùn)行,出現(xiàn)提示;error: bad argument ;error: bad argumen
51、t type: numberp: niltype: numberp: nil(錯(cuò)誤的參數(shù)類型,出現(xiàn)了無定義的參數(shù))(錯(cuò)誤的參數(shù)類型,出現(xiàn)了無定義的參數(shù)) 。 將光標(biāo)移至程序的第將光標(biāo)移至程序的第6 6行末尾,選擇菜單行末尾,選擇菜單D DebugebugT Toggle oggle BreakpointBreakpoint、按功能鍵、按功能鍵F9F9或單擊按鈕或單擊按鈕 ,在該處設(shè)置一個(gè)斷點(diǎn)。,在該處設(shè)置一個(gè)斷點(diǎn)。 單擊按鈕單擊按鈕 ,加載當(dāng)前文本編輯窗口內(nèi)的源程序。單擊,加載當(dāng)前文本編輯窗口內(nèi)的源程序。單擊按鈕按鈕 ,在,在Command:Command:提示下鍵入提示下鍵入TUXINGTU
52、XING命令,依次輸入命令,依次輸入p0p0、d d、b b、t1t1、alfalf的值之后,回到文本編輯窗口。光標(biāo)停留在斷的值之后,回到文本編輯窗口。光標(biāo)停留在斷點(diǎn)點(diǎn)1 1的位置,說明已執(zhí)行了的位置,說明已執(zhí)行了5 5個(gè)個(gè)getget表達(dá)式。表達(dá)式。 瀏覽監(jiān)視窗口,瀏覽監(jiān)視窗口,p0p0、d d、b b、alfalf已有具體的數(shù)值,而已有具體的數(shù)值,而T1=nilT1=nil,說明表達(dá)式(,說明表達(dá)式(setq tl (getdist p0 nEnter t1: setq tl (getdist p0 nEnter t1: ))有錯(cuò)誤,仔細(xì)檢查,發(fā)現(xiàn)誤將)有錯(cuò)誤,仔細(xì)檢查,發(fā)現(xiàn)誤將t1t1寫
53、為寫為tltl。改正之后,單擊。改正之后,單擊按鈕按鈕 ,單擊按鈕,單擊按鈕 ,在,在Command:Command:提示下鍵入提示下鍵入TUXINGTUXING命令,命令,依次輸入依次輸入p0p0等的數(shù)據(jù),當(dāng)程序停留在斷點(diǎn)等的數(shù)據(jù),當(dāng)程序停留在斷點(diǎn)1 1的位置時(shí),瀏覽監(jiān)的位置時(shí),瀏覽監(jiān)視窗口視窗口t1t1已有定義了。已有定義了。 單擊繼續(xù)按鈕單擊繼續(xù)按鈕 ,程序停止運(yùn)行,出現(xiàn)提示,程序停止運(yùn)行,出現(xiàn)提示; error: no ; error: no function definition: TANfunction definition: TAN(錯(cuò)誤,沒有定義函數(shù):(錯(cuò)誤,沒有定義函數(shù):TA
54、NTAN) ,正確的函數(shù)應(yīng)該是蘭色的,找到黑色的函數(shù)名正確的函數(shù)應(yīng)該是蘭色的,找到黑色的函數(shù)名tantan,改正為,改正為atanatan。 將光標(biāo)移至斷點(diǎn)將光標(biāo)移至斷點(diǎn)1 1處單擊按鈕處單擊按鈕 ,刪除斷點(diǎn),刪除斷點(diǎn)1 1。單擊按鈕。單擊按鈕 ,在,在Command:Command:提示下鍵入提示下鍵入TUXINGTUXING命令,依次命令,依次輸入輸入p0p0等的數(shù)據(jù),程序正常結(jié)束,并得到等的數(shù)據(jù),程序正常結(jié)束,并得到圖圖6-106-10所示圖形。所示圖形。圖圖6-106-10 在此例中,在斷點(diǎn)在此例中,在斷點(diǎn)1 1暫停時(shí),調(diào)試按鈕從暫停時(shí),調(diào)試按鈕從 到到 都處于可都處于可用狀態(tài),因?yàn)榇?/p>
55、時(shí)處于可繼續(xù)的斷點(diǎn)循環(huán)。用狀態(tài),因?yàn)榇藭r(shí)處于可繼續(xù)的斷點(diǎn)循環(huán)。 如果運(yùn)行該程序前,選擇菜單如果運(yùn)行該程序前,選擇菜單D DebugebugBreaBreak k On Error On Error,執(zhí)行,執(zhí)行到到tantan函數(shù)時(shí),因出現(xiàn)了無定義的函數(shù)而程序崩潰,但在該處函數(shù)時(shí),因出現(xiàn)了無定義的函數(shù)而程序崩潰,但在該處產(chǎn)生了一個(gè)不可繼續(xù)的斷點(diǎn)循環(huán)。此時(shí)只有調(diào)試按鈕產(chǎn)生了一個(gè)不可繼續(xù)的斷點(diǎn)循環(huán)。此時(shí)只有調(diào)試按鈕 和和是可用的。用戶只能選擇退到上一層斷點(diǎn)循環(huán)還是退到頂層斷是可用的。用戶只能選擇退到上一層斷點(diǎn)循環(huán)還是退到頂層斷點(diǎn)循環(huán)。點(diǎn)循環(huán)。 如果在如果在CommandCommand:提示下,鍵入:
56、提示下,鍵入TUXINGTUXING命令,在要求用戶輸入命令,在要求用戶輸入數(shù)據(jù)時(shí),按下數(shù)據(jù)時(shí),按下EscEsc鍵,程序停止運(yùn)行,此時(shí)也產(chǎn)生了一個(gè)不可鍵,程序停止運(yùn)行,此時(shí)也產(chǎn)生了一個(gè)不可繼續(xù)的斷點(diǎn)循環(huán)。繼續(xù)的斷點(diǎn)循環(huán)。6.6 6.6 跟蹤程序運(yùn)行跟蹤程序運(yùn)行 跟蹤程序運(yùn)行的工具有命令跟蹤、出錯(cuò)跟蹤和跟蹤堆棧。跟蹤程序運(yùn)行的工具有命令跟蹤、出錯(cuò)跟蹤和跟蹤堆棧。1. 1. 命令跟蹤命令跟蹤 如果打開命令跟蹤模式,如果打開命令跟蹤模式,VisualLISPVisualLISP將在窗口跟蹤有關(guān)將在窗口跟蹤有關(guān)AutoCADAutoCAD命令的執(zhí)命令的執(zhí)行情況,以便監(jiān)控程序是否在執(zhí)行行情況,以便監(jiān)控程
57、序是否在執(zhí)行AutoCADAutoCAD命令時(shí)出現(xiàn)了問題。命令時(shí)出現(xiàn)了問題。 例如,選擇菜單例如,選擇菜單D DebugebugTrace CoTrace Com mmandmand,在,在CommandCommand:提示下,鍵入:提示下,鍵入TUXINGTUXING命令(假定程序能夠正常運(yùn)行),將在圖命令(假定程序能夠正常運(yùn)行),將在圖6-116-11所示所示 TraceTrace 窗口顯示窗口顯示有關(guān)有關(guān)AutoCADAutoCAD命令的執(zhí)行情況的信息。命令的執(zhí)行情況的信息。圖圖6-116-11顯示有關(guān)顯示有關(guān)AutoCADAutoCAD命令的執(zhí)行情況的跟蹤窗口命令的執(zhí)行情況的跟蹤窗口
58、2. 2. 出錯(cuò)跟蹤出錯(cuò)跟蹤 出錯(cuò)跟蹤是用出錯(cuò)跟蹤是用Error TraceError Trace窗口錄跟蹤程序運(yùn)行的結(jié)果。在跟蹤窗口窗口錄跟蹤程序運(yùn)行的結(jié)果。在跟蹤窗口按鼠標(biāo)右鍵,將彈出跟蹤窗口的快捷菜單,見圖按鼠標(biāo)右鍵,將彈出跟蹤窗口的快捷菜單,見圖6-136-13。下面以例下面以例6-36-3為例,介紹利用為例,介紹利用Error TraceError Trace窗口調(diào)試程序的方法。窗口調(diào)試程序的方法?!纠?-36-3】定義求解一元二次方程的函數(shù)定義求解一元二次方程的函數(shù)一元二次方程的表達(dá)式為:一元二次方程的表達(dá)式為: 如果如果 a=0a=0,它不是一個(gè)二次方程;如果,方程有實(shí)數(shù)解,否
59、則無解。,它不是一個(gè)二次方程;如果,方程有實(shí)數(shù)解,否則無解。方程的求根公式為:方程的求根公式為:aacbbx242程序內(nèi)容如下:程序內(nèi)容如下: (defun roots(a b c / t1 t2 x1 x2) (defun roots(a b c / t1 t2 x1 x2) ;t1t1、t2t2、x1x1、x2x2是局部變量是局部變量 (if (/= a 0)(if (/= a 0) (progn (progn (setq t1 (- ( (setq t1 (- (* * b b) ( b b) (* * 4 a c) 4 a c) ; (if (= t1 0.0)(if (= t1 0.
60、0) (progn (progn (setq t2 (sqrt t1) (setq t2 (sqrt t1) ; (setq x1 (/ (+ -b t2) (setq x1 (/ (+ -b t2) (* * 2 a) 2 a) ;此處有錯(cuò);此處有錯(cuò) (setq x2 (/ (- -b t2) (setq x2 (/ (- -b t2) (* * 2 a) 2 a) ;此處有錯(cuò);此處有錯(cuò) (print (list x1 x2)(print (list x1 x2) ) ) (print n (print n根是復(fù)數(shù)根是復(fù)數(shù).).) ) ) ) ) (print n (print n不是一個(gè)二
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 玻璃吊橋led施工方案
- 弧形閘門專項(xiàng)施工方案
- 斜井隧道施工方案
- 水庫(kù)鉆孔注漿施工方案
- 涵洞水管架空施工方案
- 承接彩燈施工方案
- 小麥島內(nèi)部施工方案
- 電梯梯井施工方案
- 橡膠地面景觀施工方案
- 電梯采購(gòu)合同范本
- 2025年山東泰山財(cái)產(chǎn)保險(xiǎn)股份有限公司招聘筆試參考題庫(kù)含答案解析
- 高一英語完形填空專項(xiàng)訓(xùn)練100(附答案)及解析
- 2024年八年級(jí)語文下冊(cè)《經(jīng)典常談》第一章《說文解字》練習(xí)題卷附答案
- 華為基建項(xiàng)目管理手冊(cè)
- 建設(shè)工程規(guī)劃放線、驗(yàn)線申請(qǐng)表
- 二年級(jí)科學(xué)上冊(cè)期末考試質(zhì)量分析
- WE-100B300B600B1000B型萬能材料試驗(yàn)機(jī)使用說明書
- 相聲《治病》
- 盾構(gòu)施工標(biāo)準(zhǔn)化手冊(cè)
- 貴州省義務(wù)教育階段中小學(xué)生轉(zhuǎn)學(xué)申請(qǐng)表
評(píng)論
0/150
提交評(píng)論