作為非軟體出身的人,做CAD插件,如何避免BUG?請教各位專業人士
這里所謂的隱藏的錯誤,是指我在沒有意識的情況下犯得錯誤。舉兩個例子
1)增根問題
以前在計算方程求根時,用的傳遞矩陣。在數學原理上肯定是對的。本來我估計根也就是七八個,可軟體給出了幾百個根。這個原因是該是零的地方,它沒有成為零。又由于傳遞矩陣數量多,于是出現了“增根”。在計算機演算法里有處理方法,就是歸一化處理。但我在編程之初并沒有這種意識
2)32位和64位
軟體如果在32位的開發工具下寫的,到了64位的win系統下,就會出現不正常
我的目的是,軟體開發中,這類問題有多少?能不能給列出清單。如果不給出解決方法,至少讓我知道會出現什么問題,才能有意識的去避免、解決。最低希望是您給出的名稱是規范的,能上網查找進一步學習。
非常感謝!
uj5u.com熱心網友回復:
常見的比如 判斷浮點數和整數是否相等。
Dim a As Double
Dim b As Integer
Dim i As Integer
a = 100
b = 100
For i = 1 To 10
a = a / i
Next
For i = 1 To 10
a = a * i
Next
Debug.Print a, b, a = b
從數學角度上說,a最后還是100,和100是否相等 的判斷應該是true
最后的輸出: 100 100 False
uj5u.com熱心網友回復:
感謝
在VB6中,不同的資料型別在isXXXX這類判斷函式中,如判斷是否為空,是否賦初值等,不一樣。在我記憶中字符型資料和其他數字型資料不同。
在《visual basic6編程技術大全》中提到過不少。可惜這本書中文翻譯版看起來很累
uj5u.com熱心網友回復:
推薦一本《品悟C——拋棄C程式設計中的謬誤與惡習》雖然是C語言的,值得一看。網上可以下載到。
uj5u.com熱心網友回復:
感謝幫助
uj5u.com熱心網友回復:
百度搜相關關鍵字。uj5u.com熱心網友回復:
還有比如VB里的函式引數,默認是傳址的,就是c里面的指標。如果不特別宣告是byval的入參,在函式體內進行變化對函式體外的變數也會產生影響舉個栗子
Private Sub Command1_Click()
Dim a As String, b As String
a = "引數1": b = "引數2"
test a, b
Debug.Print a, b
End Sub
Private Sub test(ia As String, ByVal ib As String)
ia = "改變a"
ib = "改變b"
End Sub
uj5u.com熱心網友回復:
涉及指標地址的三個函式,以及有關的API,我都小心翼翼的避開了。因為我的水平還不行
呼叫函式,用callbyname
在適當的情況下,也用類模塊。畢竟能帶來好處
uj5u.com熱心網友回復:
如果“隱藏”的錯誤可以輕易避免的話,程式員這個職業會消失。uj5u.com熱心網友回復:
傳值/傳指標的問題是無法避開的,習慣就好。

我現在的VB代碼,函式或程序的引數,幾乎都是用ByVal傳遞的(當然“要回傳資料”的除外,這種必定是ByRef)。
不過有一個與你的想法相反: 我是盡量不用類模塊,而采用“標準模塊”。

uj5u.com熱心網友回復:
請牢記:源代碼本身的書寫是否結構化或面向物件或符合設計模式或敏捷…并不重要,重要的是你是否使用結構化或面向物件或符合設計模式或敏捷…的方法命名識別符號、閱讀、修改、檢查、測驗源代碼。意思是你程式結構看上去再合理,再簡潔,也不一定比看上去一團亂麻的程式結構在運行或修改時更不易出錯,更方便修改,出錯了更容易找到哪里出錯和具體出錯的原因,更容易改正錯誤。
試對比
圖書館(對圖書的分類夠結構化了吧)
和
搜索引擎(可看作是扁平化任何結構資料,僅支持全文檢索)
哪個處理資訊更方便、更高效。
所以
與其費勁去重構代碼讓其看上去更簡潔、更合理
不如費勁學習grep、sed、awk、……這類全文搜索和批處理編輯的工具。
結構越復雜,越難修改,越難除錯。
有時(甚至大多數時候),看上去越合理、越簡潔的代碼,運行起來性能越差,出錯時查找原因越難,找到出錯原因后改正越費勁。
程式員要做的不是盡力避免錯誤,而是聚焦在快速發現并改正錯誤。真正以快速方式輕易解決錯誤,“快速的失敗”遠勝過“預防錯誤”。Fred George
前微軟C#編輯器的開發主管Jay Bazuzi列出的一些有助于找到正確方向的問題;他覺得前同事們應該用這些問題來問自己;實際上不管在哪里作業的開發者們都應該經常問問自己這些問題:
◆“要保證這個問題不會再出現,我該怎么做?”
◆“要想少出些Bug,我該怎么做?”
◆“要保證Bug容易被修復,我該怎么做?”
◆“要保持對變化的快速回應,我該怎么做?”
◆“要保證我的軟體的運行速度,我該怎么做?”
如果大多數團隊都能不時問一下自己,必定會從中得益,因為這些都是真正強而有力的問題。
uj5u.com熱心網友回復:
還有比如VB里的函式引數,默認是傳址的,就是c里面的指標。如果不特別宣告是byval的入參,在函式體內進行變化對函式體外的變數也會產生影響
舉個栗子
Private Sub Command1_Click()
Dim a As String, b As String
a = "引數1": b = "引數2"
test a, b
Debug.Print a, b
End Sub
Private Sub test(ia As String, ByVal ib As String)
ia = "改變a"
ib = "改變b"
End Sub
涉及指標地址的三個函式,以及有關的API,我都小心翼翼的避開了。因為我的水平還不行
呼叫函式,用callbyname
在適當的情況下,也用類模塊。畢竟能帶來好處
傳值/傳指標的問題是無法避開的,習慣就好。
我現在的VB代碼,函式或程序的引數,幾乎都是用ByVal傳遞的(當然“要回傳資料”的除外,這種必定是ByRef)。
不過有一個與你的想法相反: 我是盡量不用類模塊,而采用“標準模塊”。
能不能詳細解釋一下,為什么避免用類模塊?
uj5u.com熱心網友回復:
請牢記:源代碼本身的書寫是否結構化或面向物件或符合設計模式或敏捷…并不重要,重要的是你是否使用結構化或面向物件或符合設計模式或敏捷…的方法命名識別符號、閱讀、修改、檢查、測驗源代碼。
意思是你程式結構看上去再合理,再簡潔,也不一定比看上去一團亂麻的程式結構在運行或修改時更不易出錯,更方便修改,出錯了更容易找到哪里出錯和具體出錯的原因,更容易改正錯誤。
試對比
圖書館(對圖書的分類夠結構化了吧)
和
搜索引擎(可看作是扁平化任何結構資料,僅支持全文檢索)
哪個處理資訊更方便、更高效。
所以
與其費勁去重構代碼讓其看上去更簡潔、更合理
不如費勁學習grep、sed、awk、……這類全文搜索和批處理編輯的工具。
結構越復雜,越難修改,越難除錯。
有時(甚至大多數時候),看上去越合理、越簡潔的代碼,運行起來性能越差,出錯時查找原因越難,找到出錯原因后改正越費勁。
程式員要做的不是盡力避免錯誤,而是聚焦在快速發現并改正錯誤。真正以快速方式輕易解決錯誤,“快速的失敗”遠勝過“預防錯誤”。Fred George
前微軟C#編輯器的開發主管Jay Bazuzi列出的一些有助于找到正確方向的問題;他覺得前同事們應該用這些問題來問自己;實際上不管在哪里作業的開發者們都應該經常問問自己這些問題:
◆“要保證這個問題不會再出現,我該怎么做?”
◆“要想少出些Bug,我該怎么做?”
◆“要保證Bug容易被修復,我該怎么做?”
◆“要保持對變化的快速回應,我該怎么做?”
◆“要保證我的軟體的運行速度,我該怎么做?”
如果大多數團隊都能不時問一下自己,必定會從中得益,因為這些都是真正強而有力的問題。
《對圖書的分類夠結構化了吧》,我現在就是遇到類似的問題。大類、中類、小類這種情況。處理起來不僅僅有檢索,還要在不同類別中生成新實體,并且插入到相應位置
從道理上說,特別符合用繼承處理
但是,VB6不支持繼承,于是改用XML方式 ,
所有實體都變成為XML的結點(處理的東西符合一父多子,沒有橫向關聯)
對于繼承物件的方法、屬性:
屬性:利用Xpath,上溯父結點、父父結點等,將隸屬的屬性回寫到當前結點
方法:還是利用Xpath,上溯父結點、父父結點等,利用VB6中的callbyname,來預備當前結點的呼叫
不過,很麻煩
不知這樣處理是否合理?要注意些什么?
謝謝先!
uj5u.com熱心網友回復:
還有比如VB里的函式引數,默認是傳址的,就是c里面的指標。如果不特別宣告是byval的入參,在函式體內進行變化對函式體外的變數也會產生影響
舉個栗子
Private Sub Command1_Click()
Dim a As String, b As String
a = "引數1": b = "引數2"
test a, b
Debug.Print a, b
End Sub
Private Sub test(ia As String, ByVal ib As String)
ia = "改變a"
ib = "改變b"
End Sub
涉及指標地址的三個函式,以及有關的API,我都小心翼翼的避開了。因為我的水平還不行
呼叫函式,用callbyname
在適當的情況下,也用類模塊。畢竟能帶來好處
傳值/傳指標的問題是無法避開的,習慣就好。
我現在的VB代碼,函式或程序的引數,幾乎都是用ByVal傳遞的(當然“要回傳資料”的除外,這種必定是ByRef)。
不過有一個與你的想法相反: 我是盡量不用類模塊,而采用“標準模塊”。
能不能詳細解釋一下,為什么避免用類模塊?
我是“盡量不用”,而不是“拒絕使用類模塊”。
有一些時候,是用標準模塊也可、用類模塊也可,這是我就會選擇使用標準模塊。
比如說:要“管理一組資料”,需要實作這組資料中,各種“資料資訊”的讀取、修改、查詢等功能。
這時,可以“封裝”一個類模塊,提供一系列的Public屬性、函式或程序等,完成相應的功能;
同樣也可以“封裝一個模塊模塊”,提供一系列的Public程序或函式,完成相應的功能。
其實這兩種方案,整個架構沒什么太大的區別;
在“功能呼叫”上,也沒什么區別:只是一個需要通過“物件實體”來呼叫,一個是直接呼叫。
但從運行效率上來說,用標準模塊的方案要稍高一點兒。因為不用通過“物件”去繞個彎子。
具體應用環境,不能一概而論,也許你的應用場合,“適合用類模塊、標準模塊反而不適合”,這也并不排除。
PS: 趙四在10樓的回復,你就當他放P,無視就行了…………
uj5u.com熱心網友回復:
這個問題, 自從計算機程式出現就有人在研究了, 可惜的是至今還沒有答案.uj5u.com熱心網友回復:
還有比如VB里的函式引數,默認是傳址的,就是c里面的指標。如果不特別宣告是byval的入參,在函式體內進行變化對函式體外的變數也會產生影響
舉個栗子
Private Sub Command1_Click()
Dim a As String, b As String
a = "引數1": b = "引數2"
test a, b
Debug.Print a, b
End Sub
Private Sub test(ia As String, ByVal ib As String)
ia = "改變a"
ib = "改變b"
End Sub
涉及指標地址的三個函式,以及有關的API,我都小心翼翼的避開了。因為我的水平還不行
呼叫函式,用callbyname
在適當的情況下,也用類模塊。畢竟能帶來好處
傳值/傳指標的問題是無法避開的,習慣就好。
我現在的VB代碼,函式或程序的引數,幾乎都是用ByVal傳遞的(當然“要回傳資料”的除外,這種必定是ByRef)。
不過有一個與你的想法相反: 我是盡量不用類模塊,而采用“標準模塊”。
能不能詳細解釋一下,為什么避免用類模塊?
我是“盡量不用”,而不是“拒絕使用類模塊”。
有一些時候,是用標準模塊也可、用類模塊也可,這是我就會選擇使用標準模塊。
比如說:要“管理一組資料”,需要實作這組資料中,各種“資料資訊”的讀取、修改、查詢等功能。
這時,可以“封裝”一個類模塊,提供一系列的Public屬性、函式或程序等,完成相應的功能;
同樣也可以“封裝一個模塊模塊”,提供一系列的Public程序或函式,完成相應的功能。
其實這兩種方案,整個架構沒什么太大的區別;
在“功能呼叫”上,也沒什么區別:只是一個需要通過“物件實體”來呼叫,一個是直接呼叫。
但從運行效率上來說,用標準模塊的方案要稍高一點兒。因為不用通過“物件”去繞個彎子。
具體應用環境,不能一概而論,也許你的應用場合,“適合用類模塊、標準模塊反而不適合”,這也并不排除。
PS: 趙四在10樓的回復,你就當他放P,無視就行了…………
非常同意“能不用就不用”,我的原則是:怎么簡單怎么來
用類模塊,也有帶來省事的時候。比如界面
要輸入若干個資料,這些資料大部分有關聯;有少部分資料變動要引發全體變動;幾乎所有資料要驗證。同時還希望,只要有一個資料(或者幾個)輸入了,該改的就立刻變化,而不是所有數輸入后,再用命令按鈕一道重算。
采用在類模塊里,將物件宣告為控制元件。這種方法可以帶來不少便利。
這里,確實也可以用標準模塊寫sub子程式。不僅代碼多了,而且不能利用控制元件自帶判斷功能
uj5u.com熱心網友回復:
P有時是能熏死人的!所以不能對所有的P都無視。uj5u.com熱心網友回復:
問題太多了,比如:不能比較兩個浮點數相等。另外,計算方法要學學。還有很多邏輯問題,總之,要多看書。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/50017.html
標籤:VB基礎類
下一篇:新手入門求教,如何在啟動form之初,將游標焦點鎖定在某一texbox?以texbox輸入正確才能跳轉到其他texbox的控制實作?
