请教:如何避免隐藏的错误

yiyiyicz 2017-12-03 10:08:02
作为非软件出身的人,做CAD插件,如何避免BUG?请教各位专业人士
这里所谓的隐藏的错误,是指我在没有意识的情况下犯得错误。举两个例子
1)增根问题
以前在计算方程求根时,用的传递矩阵。在数学原理上肯定是对的。本来我估计根也就是七八个,可软件给出了几百个根。这个原因是该是零的地方,它没有成为零。又由于传递矩阵数量多,于是出现了“增根”。在计算机算法里有处理方法,就是归一化处理。但我在编程之初并没有这种意识
2)32位和64位
软件如果在32位的开发工具下写的,到了64位的win系统下,就会出现不正常

我的目的是,软件开发中,这类问题有多少?能不能给列出清单。如果不给出解决方法,至少让我知道会出现什么问题,才能有意识的去避免、解决。最低希望是您给出的名称是规范的,能上网查找进一步学习。
非常感谢!
...全文
389 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzjxucxx 2018-01-16
  • 打赏
  • 举报
回复
问题太多了,比如:不能比较两个浮点数相等。另外,计算方法要学学。还有很多逻辑问题,总之,要多看书。
赵4老师 2017-12-10
  • 打赏
  • 举报
回复
P有时是能熏死人的!所以不能对所有的P都无视。
熊孩子开学喽 2017-12-09
  • 打赏
  • 举报
回复
这个问题, 自从计算机程序出现就有人在研究了, 可惜的是至今还没有答案.
舉杯邀明月 2017-12-09
  • 打赏
  • 举报
回复
引用 11 楼 yiyiyicz 的回复:
[quote=引用 9 楼 Chen8013 的回复:] [quote=引用 7 楼 yiyiyicz 的回复:] [quote=引用 6 楼 chewinggum 的回复:] 还有比如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 在适当的情况下,也用类模块。毕竟能带来好处[/quote] 传值/传指针的问题是无法避开的,习惯就好。  我现在的VB代码,函数或过程的参数,几乎都是用ByVal传递的(当然“要回传数据”的除外,这种必定是ByRef)。 不过有一个与你的想法相反: 我是尽量不用类模块,而采用“标准模块”。  [/quote] 能不能详细解释一下,为什么避免用类模块?[/quote] 我是“尽量不用”,而不是“拒绝使用类模块”。 有一些时候,是用标准模块也可、用类模块也可,这是我就会选择使用标准模块。 比如说:要“管理一组数据”,需要实现这组数据中,各种“数据信息”的读取、修改、查询等功能。  这时,可以“封装”一个类模块,提供一系列的Public属性、函数或过程等,完成相应的功能;  同样也可以“封装一个模块模块”,提供一系列的Public过程或函数,完成相应的功能。 其实这两种方案,整个架构没什么太大的区别; 在“功能调用”上,也没什么区别:只是一个需要通过“对象实例”来调用,一个是直接调用。 但从运行效率上来说,用标准模块的方案要稍高一点儿。因为不用通过“对象”去绕个弯子。 具体应用环境,不能一概而论,也许你的应用场合,“适合用类模块、标准模块反而不适合”,这也并不排除。 PS: 赵四在10楼的回复,你就当他放P,无视就行了…………
yiyiyicz 2017-12-09
  • 打赏
  • 举报
回复
引用 13 楼 Chen8013 的回复:
[quote=引用 11 楼 yiyiyicz 的回复:] [quote=引用 9 楼 Chen8013 的回复:] [quote=引用 7 楼 yiyiyicz 的回复:] [quote=引用 6 楼 chewinggum 的回复:] 还有比如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 在适当的情况下,也用类模块。毕竟能带来好处[/quote] 传值/传指针的问题是无法避开的,习惯就好。  我现在的VB代码,函数或过程的参数,几乎都是用ByVal传递的(当然“要回传数据”的除外,这种必定是ByRef)。 不过有一个与你的想法相反: 我是尽量不用类模块,而采用“标准模块”。  [/quote] 能不能详细解释一下,为什么避免用类模块?[/quote] 我是“尽量不用”,而不是“拒绝使用类模块”。 有一些时候,是用标准模块也可、用类模块也可,这是我就会选择使用标准模块。 比如说:要“管理一组数据”,需要实现这组数据中,各种“数据信息”的读取、修改、查询等功能。  这时,可以“封装”一个类模块,提供一系列的Public属性、函数或过程等,完成相应的功能;  同样也可以“封装一个模块模块”,提供一系列的Public过程或函数,完成相应的功能。 其实这两种方案,整个架构没什么太大的区别; 在“功能调用”上,也没什么区别:只是一个需要通过“对象实例”来调用,一个是直接调用。 但从运行效率上来说,用标准模块的方案要稍高一点儿。因为不用通过“对象”去绕个弯子。 具体应用环境,不能一概而论,也许你的应用场合,“适合用类模块、标准模块反而不适合”,这也并不排除。 PS: 赵四在10楼的回复,你就当他放P,无视就行了………… [/quote] 非常同意“能不用就不用”,我的原则是:怎么简单怎么来 用类模块,也有带来省事的时候。比如界面 要输入若干个数据,这些数据大部分有关联;有少部分数据变动要引发全体变动;几乎所有数据要验证。同时还希望,只要有一个数据(或者几个)输入了,该改的就立刻变化,而不是所有数输入后,再用命令按钮一道重算。 采用在类模块里,将对象声明为控件。这种方法可以带来不少便利。 这里,确实也可以用标准模块写sub子程序。不仅代码多了,而且不能利用控件自带判断功能
赵4老师 2017-12-08
  • 打赏
  • 举报
回复
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。 意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。 试对比 图书馆(对图书的分类够结构化了吧) 和 搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索) 哪个处理信息更方便、更高效。 所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。 结构越复杂,越难修改,越难除错。 有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。 程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George 前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题;他觉得前同事们应该用这些问题来问自己;实际上不管在哪里工作的开发者们都应该经常问问自己这些问题: ◆“要保证这个问题不会再出现,我该怎么做?” ◆“要想少出些Bug,我该怎么做?” ◆“要保证Bug容易被修复,我该怎么做?” ◆“要保持对变化的快速响应,我该怎么做?” ◆“要保证我的软件的运行速度,我该怎么做?” 如果大多数团队都能不时问一下自己,必定会从中得益,因为这些都是真正强而有力的问题。
yiyiyicz 2017-12-08
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。 意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。 试对比 图书馆(对图书的分类够结构化了吧) 和 搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索) 哪个处理信息更方便、更高效。 所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。 结构越复杂,越难修改,越难除错。 有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。 程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George 前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题;他觉得前同事们应该用这些问题来问自己;实际上不管在哪里工作的开发者们都应该经常问问自己这些问题: ◆“要保证这个问题不会再出现,我该怎么做?” ◆“要想少出些Bug,我该怎么做?” ◆“要保证Bug容易被修复,我该怎么做?” ◆“要保持对变化的快速响应,我该怎么做?” ◆“要保证我的软件的运行速度,我该怎么做?” 如果大多数团队都能不时问一下自己,必定会从中得益,因为这些都是真正强而有力的问题。
《对图书的分类够结构化了吧》,我现在就是遇到类似的问题。大类、中类、小类这种情况。处理起来不仅仅有检索,还要在不同类别中生成新实例,并且插入到相应位置 从道理上说,特别符合用继承处理 但是,VB6不支持继承,于是改用XML方式 , 所有实例都变成为XML的结点(处理的东西符合一父多子,没有横向关联) 对于继承对象的方法、属性: 属性:利用Xpath,上溯父结点、父父结点等,将隶属的属性回写到当前结点 方法:还是利用Xpath,上溯父结点、父父结点等,利用VB6中的callbyname,来预备当前结点的调用 不过,很麻烦 不知这样处理是否合理?要注意些什么 谢谢先!
yiyiyicz 2017-12-08
  • 打赏
  • 举报
回复
引用 9 楼 Chen8013 的回复:
[quote=引用 7 楼 yiyiyicz 的回复:] [quote=引用 6 楼 chewinggum 的回复:] 还有比如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 在适当的情况下,也用类模块。毕竟能带来好处[/quote] 传值/传指针的问题是无法避开的,习惯就好。  我现在的VB代码,函数或过程的参数,几乎都是用ByVal传递的(当然“要回传数据”的除外,这种必定是ByRef)。 不过有一个与你的想法相反: 我是尽量不用类模块,而采用“标准模块”。  [/quote] 能不能详细解释一下,为什么避免用类模块?
舉杯邀明月 2017-12-07
  • 打赏
  • 举报
回复
引用 7 楼 yiyiyicz 的回复:
[quote=引用 6 楼 chewinggum 的回复:] 还有比如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 在适当的情况下,也用类模块。毕竟能带来好处[/quote] 传值/传指针的问题是无法避开的,习惯就好。  我现在的VB代码,函数或过程的参数,几乎都是用ByVal传递的(当然“要回传数据”的除外,这种必定是ByRef)。 不过有一个与你的想法相反: 我是尽量不用类模块,而采用“标准模块”。 
赵4老师 2017-12-07
  • 打赏
  • 举报
回复
如果“隐藏”的错误可以轻易避免的话,程序员这个职业会消失。
yiyiyicz 2017-12-06
  • 打赏
  • 举报
回复
引用 6 楼 chewinggum 的回复:
还有比如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 在适当的情况下,也用类模块。毕竟能带来好处
脆皮大雪糕 2017-12-05
  • 打赏
  • 举报
回复
还有比如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

赵4老师 2017-12-05
  • 打赏
  • 举报
回复
百度搜相关关键字。
yiyiyicz 2017-12-04
  • 打赏
  • 举报
回复
引用 3 楼 bakw 的回复:
推荐一本《品悟C——抛弃C程序设计中的谬误与恶习》虽然是C语言的,值得一看。 网上可以下载到。
感谢帮助
笨狗先飞 2017-12-03
  • 打赏
  • 举报
回复
推荐一本《品悟C——抛弃C程序设计中的谬误与恶习》虽然是C语言的,值得一看。 网上可以下载到。
yiyiyicz 2017-12-03
  • 打赏
  • 举报
回复
引用 1 楼 chewinggum 的回复:
常见的比如 判断浮点数和整数是否相等。

    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
感谢 在VB6中,不同的数据类型在isXXXX这类判断函数中,如判断是否为空,是否赋初值等,不一样。在我记忆中字符型数据和其他数字型数据不同。 在《visual basic6编程技术大全》中提到过不少。可惜这本书中文翻译版看起来很累
脆皮大雪糕 2017-12-03
  • 打赏
  • 举报
回复
常见的比如 判断浮点数和整数是否相等。

    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
该内存不能为“read”或“written解决方案 运行某些程序的时候,有时会出现内存错误的提示,然后该程序就关闭。 “0x????????”指令引用的“0x????????”内存。该内存不能为“read”。 “0x????????”指令引用的“0x????????”内存,该内存不能为“written”。 一般出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了。 故障分析 硬件方面: 一般来说,内存出现问题的可能性并不大,主要方面是:内存条坏了、内存质量有问题,还有就是 2 个不 同牌子不同容量的内存混插,也比较容易出现不兼容的情况,同时还要注意散热问题,特别是超频后。你 可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度。 假如是双内存,而且是不同品牌的内存条混插或者买了二手内存时,出现这个问题,这时,就要检查是不 是内存出问题了或者和其它硬件不兼容。 软件方面: 先简单说说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在其一位置时,因为没有足够空间, 就会发生溢出现象。举个例子:一个桶子只能将一斤的水,当放入两斤的水进入时,就会溢出来。而系统 则是在屏幕上表现出来。这个问题,经常出现在 windows2000 和 XP 系统上,Windows 2000/XP 对硬件的 要求是很苛刻的,一旦遇到资源死锁、溢出或者类似 Windows 98 里的非法操作,系统为保持稳定,就会出 现上述情况。另外也可能是硬件设备之间的兼容性不好造成的。 几个例子 例一:打开 IE 浏览器或者没过几分钟就会出现"0x70dcf39f"指令引用的"0x00000000"内存。该内存不能为 “read”。要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中 一个窗口即将关闭”的信息框,关闭该提示信息后,IE浏览器也被关闭。 解决方法:修复或升级 IE 浏览器,同时打上补丁。看过其中一个修复方法是,Win2000 自升级,也就是 Win2000升级到Win2000,其实这种方法也就是把系统还原到系统初始的状态下。比如你的IE升级到了6.0, 自升级后,会被IE5.0代替。 例二:在windows xp下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”指令引用的“0x00000078”内 存。该内存不能为“written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。 解决方法:这可能是系统的兼容性问题,winXP 的系统,右键“AutoRun.exe”文件,属性,兼容性,把“用 兼容模式运行这个程序”项选择上,并选择“Windows 98/Me”。win2000如果打了SP的补丁后,只要开始, 运行,输入:regsvr32 c:\winnt\apppatch\slayerui.dll。右键,属性,也会出现兼容性的选项。 例三:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”指令引用的 “0xffffffff”内存。该内存不能为“read” 的提示。 解决方法:当使用的输入法为微软拼音输入法 2003,并且隐藏语言栏时(不隐藏时没问题)关闭 RealOne 就会出现这个问题,因此在关闭 RealOne 之前可以显示语言栏或者将任意其他输入法作为当前输入法来解 决这个问题。 例四:我的豪杰超级解霸自从上网后就不能播放了,每次都提示“Ox060692f6”(每次变化)指令引用的 “Oxff000011”内存不能为“read”,终止程序请按确定。 解决方法:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。还不行,只好 换就用别的播放器试试了。 例五:双击一个游戏的快捷方式,“Ox77f5cdO”指令引用“Oxffffffff”内存,该内存不能为“read” ,并且提示 Client.dat程序错误。 解决方法:重装显卡的最新驱动程序,然后下载并且安装DirectX9.0。 例六:一个朋友发信息过来,我的电脑便出现了错误信息:“0*772b548f”指令引用的“0*00303033”内存,该 内存不能为“written”,然后QQ自动下线,而再打开QQ,发现了他发过来的十几条的信息。 解决方法:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本, 就没事了。 例七:我的笔记本电脑用的XP系统,有时关闭网页时会弹出tbrowser.exe遇到问题需要关闭,然后有弹出 0x03e7c738指令引用的0x03e7c738内存,该内存不能为read,请问是怎么回事? 解决方法:先查杀一下病毒,另外如果你安装了浏

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧