陳曉紅,沈東華
(1.南通大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,江蘇 南通 226019;2.南通市公安局 港閘分局,江蘇 南通 226000)
VB程序的調(diào)試技術(shù)及應(yīng)用實(shí)例研究
陳曉紅1,沈東華2
(1.南通大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,江蘇 南通 226019;2.南通市公安局 港閘分局,江蘇 南通 226000)
在編寫(xiě)程序的過(guò)程中,出現(xiàn)錯(cuò)誤在所難免。文章介紹了如何根據(jù)VB的錯(cuò)誤類(lèi)型,準(zhǔn)確地發(fā)現(xiàn)并排除錯(cuò)誤。最后,結(jié)合調(diào)試工具,文章分析了如何更好地對(duì)應(yīng)用實(shí)例進(jìn)行調(diào)試。
錯(cuò)誤類(lèi)型;調(diào)試工具;調(diào)試窗口
“高級(jí)語(yǔ)言程序設(shè)計(jì)VB”是非計(jì)算機(jī)類(lèi)理工科本科生的基礎(chǔ)必修課。學(xué)生一般需要在一個(gè)學(xué)期內(nèi)掌握VB的基本理論知識(shí),學(xué)會(huì)編寫(xiě)簡(jiǎn)單的程序,并需要通過(guò)全國(guó)或省級(jí)計(jì)算機(jī)等級(jí)考試(二級(jí)VB)。
學(xué)好這門(mén)課的關(guān)鍵在于多上機(jī)實(shí)踐,多編寫(xiě)程序。在編程過(guò)程中,代碼中存在錯(cuò)誤是在所難免的。這些錯(cuò)誤可能會(huì)阻礙程序的正常運(yùn)行,有些可能不影響程序的運(yùn)行卻得不到正確的結(jié)果。有些學(xué)生上機(jī)遇到錯(cuò)誤,就一籌莫展了,對(duì)VB的學(xué)習(xí)也失去了信心,主要原因在于沒(méi)有學(xué)會(huì)VB調(diào)試技術(shù)。遵循VB的調(diào)試技術(shù),可以跟蹤到程序內(nèi)部,觀察程序的運(yùn)行過(guò)程,觀察變量和屬性是如何隨著語(yǔ)句的執(zhí)行而改變,從而發(fā)現(xiàn)并排除程序中的錯(cuò)誤。
編程時(shí)遇到的錯(cuò)誤五花八門(mén),為了更有效地運(yùn)用調(diào)試手段排除錯(cuò)誤,文章把遇到的錯(cuò)誤分為以下3類(lèi)。
1.1 編譯錯(cuò)誤
編譯錯(cuò)誤是由于違背了VB的語(yǔ)法規(guī)則,錯(cuò)誤地書(shū)寫(xiě)語(yǔ)句而造成的。例如,拼錯(cuò)了某個(gè)關(guān)鍵字,表達(dá)式書(shū)寫(xiě)不完整,英文標(biāo)點(diǎn)符號(hào)錯(cuò)用為中文標(biāo)點(diǎn)符號(hào),If語(yǔ)句沒(méi)有end if語(yǔ)句與之相對(duì)應(yīng)等。
在編譯程序時(shí),VB系統(tǒng)能夠進(jìn)行“自動(dòng)語(yǔ)法檢測(cè)”,逐一發(fā)現(xiàn)程序中的語(yǔ)法錯(cuò)誤,并彈出對(duì)話(huà)框,給出“編譯錯(cuò)誤”的提示,以方便對(duì)出錯(cuò)行進(jìn)行修改。
1.2 運(yùn)行錯(cuò)誤
運(yùn)行錯(cuò)誤是指在程序運(yùn)行過(guò)程中,執(zhí)行非法語(yǔ)句而引發(fā)的錯(cuò)誤。例如,數(shù)組下標(biāo)越界、數(shù)據(jù)溢出、類(lèi)型不匹配、無(wú)效屬性值、除數(shù)為零等。
這類(lèi)錯(cuò)誤在編寫(xiě)形式上符合語(yǔ)法規(guī)則,所以不會(huì)在編譯時(shí)被發(fā)現(xiàn)。在程序運(yùn)行時(shí),系統(tǒng)一旦檢測(cè)到運(yùn)行錯(cuò)誤,就會(huì)顯示出相應(yīng)的錯(cuò)誤信息,等待編程人員修改。
1.3 邏輯錯(cuò)誤
如果程序在編譯和運(yùn)行時(shí)均未發(fā)現(xiàn)錯(cuò)誤,卻沒(méi)有得到預(yù)期的運(yùn)行結(jié)果,那么,程序發(fā)生了邏輯錯(cuò)誤。對(duì)于這類(lèi)錯(cuò)誤,VB系統(tǒng)通常無(wú)法自動(dòng)檢測(cè),也不會(huì)給出錯(cuò)誤提示,需要借助調(diào)試工具,分析程序的運(yùn)行過(guò)程才能排查出來(lái),加以改正。
2.1 斷點(diǎn)設(shè)置
程序中的語(yǔ)句都可以設(shè)置為斷點(diǎn),在一段程序中可以設(shè)置多個(gè)斷點(diǎn)。設(shè)置斷點(diǎn)的方法是:將光標(biāo)移至需設(shè)置斷點(diǎn)的程序行,按下F9鍵。
程序運(yùn)行到斷點(diǎn)語(yǔ)句處將暫停,進(jìn)入中斷狀態(tài),這時(shí)可以查看程序運(yùn)行到此處的運(yùn)行狀態(tài),查看變量和屬性的值,和預(yù)期的目標(biāo)值相比較,可以判斷這一部分程序的執(zhí)行是否符合用戶(hù)的意圖。
2.2 單步調(diào)試
單步調(diào)試就是以“逐語(yǔ)句”的方式執(zhí)行程序。單步調(diào)試的方法:在程序的設(shè)計(jì)態(tài)或運(yùn)行態(tài)按下F8鍵。
每執(zhí)行一次單步調(diào)試,程序的執(zhí)行就向前推進(jìn)一步,就中斷一次,因此,可以逐個(gè)語(yǔ)句地檢查每個(gè)語(yǔ)句的執(zhí)行狀態(tài),特別是遇到選擇或循環(huán)語(yǔ)句時(shí),便于檢測(cè)這些語(yǔ)句中的條件判斷結(jié)果,便于發(fā)現(xiàn)程序中存在的邏輯錯(cuò)誤。
2.3 調(diào)試窗口
調(diào)試工作的目標(biāo)十分明確,就是跟蹤程序的執(zhí)行過(guò)程,在中斷狀態(tài)下通過(guò)調(diào)試窗口來(lái)查看變量和屬性的值,以達(dá)到迅速發(fā)現(xiàn)錯(cuò)誤位置的目的。VB中提供了以下幾種調(diào)試窗口。
2.3.1 本地窗口
在程序中斷時(shí),本地窗口可以自動(dòng)顯示當(dāng)前過(guò)程中過(guò)程級(jí)變量的值以及當(dāng)前模塊中模塊級(jí)對(duì)象、變量的值。
在本地窗口中,允許修改變量的當(dāng)前值。這一技巧的使用,有時(shí)能提高調(diào)試的工作效率。例如,在if語(yǔ)句中,可以修改變量使之滿(mǎn)足判斷條件,調(diào)試then語(yǔ)句塊程序;然后,再修改變量使之不滿(mǎn)足判斷條件,調(diào)試else語(yǔ)句塊程序。
2.3.2 立即窗口
在程序中斷時(shí),在立即窗口輸入變量名或表達(dá)式,并按Enter鍵,就可以查看其當(dāng)前值。本地窗口中無(wú)法查看的全局變量和表達(dá)式的值,在立即窗口中也能查看。但立即窗口查看變量或表達(dá)式時(shí),每次都需要手動(dòng)輸入,比起其他兩種調(diào)試窗口,略顯不便。
2.3.3 監(jiān)視窗口
在使用監(jiān)視窗口前,首先要添加需要監(jiān)視的表達(dá)式。在設(shè)計(jì)時(shí),和程序中斷時(shí),都可以進(jìn)行添加。在中斷時(shí),使用監(jiān)視窗口,可以一目了然地監(jiān)測(cè)到指定的表達(dá)式的值、數(shù)據(jù)類(lèi)型、所屬過(guò)程或模塊。監(jiān)視窗口的優(yōu)點(diǎn)在于,可以在一個(gè)界面上顯示所有過(guò)程中需監(jiān)測(cè)的表達(dá)式值;而本地窗口主要顯示的是當(dāng)前過(guò)程中的變量值。
本文選取了江蘇省計(jì)算機(jī)等級(jí)考試(二級(jí)VB)的一條改錯(cuò)真題,來(lái)詳細(xì)介紹調(diào)試工具的使用。
題目如下:找到介于300~900之間的由3個(gè)不同數(shù)字組成的完全平方數(shù)。所謂完全平方數(shù)是指其平方根為整數(shù)的數(shù)。例如,324的各位數(shù)字不同,且平方根是18,所以324是符合要求的數(shù)。程序界面如圖1所示。
圖1 程序運(yùn)行界面
拿到改錯(cuò)題,首先要泛讀并分析一下,本程序中的pf ()函數(shù)過(guò)程用于判斷平方根是否為整數(shù),vf()函數(shù)過(guò)程用于判斷是否由不同數(shù)字組成。而Command1_Click()事件過(guò)程用于輸出在指定范圍內(nèi)符合要求的數(shù)。然后,進(jìn)入調(diào)試改錯(cuò)。需要注意的是,在調(diào)試時(shí),可能會(huì)刪除或者覆蓋掉部分必要的代碼,所以在調(diào)試前應(yīng)該先將程序備份。
首先,單擊Command1,此時(shí)程序出現(xiàn)運(yùn)行錯(cuò)誤:溢出。究竟在何處產(chǎn)生“溢出”呢?需要深入到程序內(nèi)部監(jiān)測(cè)。選擇“單步調(diào)試”,配合“監(jiān)視窗口”的方法進(jìn)行調(diào)試。選擇Command1_Click()中的變量i,p,pf()過(guò)程中的變量n,vf()過(guò)程中的變量n,k,a(k),a(i),a(j)進(jìn)行監(jiān)測(cè)。
開(kāi)始單步運(yùn)行前,可以使Command1_Click()中循環(huán)變量i的初值設(shè)置為符合條件的數(shù)324,來(lái)監(jiān)測(cè)輸入符合的數(shù),在哪一步出錯(cuò),致使得不到正確的輸出。就本題而言,需要發(fā)現(xiàn)pf()函數(shù)能正確執(zhí)行,而在vf()函數(shù)中無(wú)法執(zhí)行到n<0,所以,修改第一處,將n<0改為n=0。繼續(xù)單步運(yùn)行,通過(guò)監(jiān)測(cè)窗口,觀察變量的變化,發(fā)現(xiàn)Command1_Click()中的i和vf()中的n同步變化,而本題中Command1_Click()中的i變量應(yīng)保留本身的值,所以修改第二處,將vf()過(guò)程中的形參n改為按值傳遞。這樣,符合條件的數(shù)324,就能得到正確輸出。
保存修改后的程序,并將循環(huán)變量i恢復(fù)為300,然后運(yùn)行,發(fā)現(xiàn)程序能運(yùn)行,但輸出卻多了一些不符合要求的值,如400等。再使用技巧,將循環(huán)變量i,改為400,監(jiān)測(cè)為何能輸出。單步執(zhí)行到vf()中,發(fā)現(xiàn)是因?yàn)楫?dāng)兩數(shù)相等時(shí),未及時(shí)退出過(guò)程,導(dǎo)致一定會(huì)執(zhí)行到vf=True.。修改第三處,將Exit For改為Exit Function。最后,保存程序并運(yùn)行,發(fā)現(xiàn)此時(shí)程序已能正確運(yùn)行,調(diào)試成功。
要想學(xué)好VB程序調(diào)試,需要不斷探究和摸索,在調(diào)試過(guò)程中積累經(jīng)驗(yàn)。靈活地運(yùn)用VB程序調(diào)試工具,可以快速地發(fā)現(xiàn)并排除程序中的錯(cuò)誤。
[1]成耀,鄭國(guó)平,魯松. 如何讓學(xué)生掌握VB上機(jī)調(diào)試之我見(jiàn)[J]. 山東工業(yè)技術(shù),2013(12):210.
[2]吳中寧. VB程序調(diào)試[J].電腦知識(shí)與技術(shù),2007(11):749-751.
[3]宋翔.VB程序?qū)Φ恼{(diào)試和常見(jiàn)錯(cuò)誤的捕獲及錯(cuò)誤處理方法[J].陜西教育(高教版),2011(7):208,214.
Research on debugging technology of VB program and its application
Chen Xiaohong1, Shen Donghua2
(1.Computer Science and Technology College of Nantong University, Nantong 226019, China; 2.Gangzha Branch of Nantong Public Security Bureau, Nantong 226000, China)
During the process of compiling programs, it is difficult to avoid errors.This article introduces how to find and eliminate errors according to the error types of VB. Finally, how to better debug the program instance combining with the debugging tools is analyzed in this paper.
error type; debugging tools; debugging window
2015年度省第四期“333工程”科研項(xiàng)目資助計(jì)劃;項(xiàng)目編號(hào):BRA2015116。
陳曉紅(1981— ),女,江蘇南通,碩士,講師;研究方向:數(shù)據(jù)挖掘。