(1)将变量n定义为长整型或实型。
(2)将错误语句中的乘数2后面加上长整型类型符&或者实型符号!、#均可。
(3)避免大数相乘,将错误语句改为t = (2 * n) ^ 2 / (2 * n - 1) / (2 * n + 1)。
2.1.2数据计算溢出
在VB运算中,数据溢出现象比较多,有时感觉数据运算结果范围并未超过类型规定的数据范围,却也会提示数据溢出,例如:
Dim x As Long
X=33*1000
x的值并没有超过长整型的范围,运行却会提示溢出错误。
直接赋值x=33000时,就正常运行没有错误。
原来在计算赋给X的值时,VB会使用一个临时变量。在此过程中,它使用的是一个与表达式中数据类型相同的临时变量。
在上面的例子中,由于相乘的两个数都为整型(Integer),VB将使用一个整型的临时变量。当乘积超过32K(整型的极限)时,就会产生溢出错误。修正的方法是给表达式中的某个值指定一个类型标识符,强制VB使用一个足以容纳计算结果的临时变量。
如::x=33*1000&
尽管1000不是Long型数,但VB将使用一个Long型临时变量来保存结果。
然而,还要注意这段代码:x=33*1000*100&
由于VB试图将表达式前一部分的积赋给一整型临时变量,将仍然会发生溢出错误,尽管在表达式中已经声明了一个Long型数。
修正的方法是把最大的数声明为Long 或者是把VB将计算为Long型的数用括号括起来:
x=33*1000&*100
x=33*(1000*100&)
2.1.3 整型变量溢出
一个整形变量值是固定宽度的(本文特指32bit),所以它的上限是一定的。在整形变量里面储存一个比它上限还大的数值叫做整形变量上溢。整形变量上溢发生后是不可能被检测的,程序根本就没有办法说明运算结果是不是有问题。在计算数组指针和缓冲区大小的时候,就会十分危险。幸亏保护内存是不能直接写的,大部分整形变量上溢并不是传统意义上的溢出,但是可以导致这一类的溢出,一般是缓冲区溢出。
包含无符号整形变量的运算是不允许产生上溢的,因为上溢发生会使得运算结果不能用无符号整数表示它的结果实际是对最大可表示无符号整数加1的一次取模。例如:有两个无符号整形变量, a 和 b ,而且都是32 bit长度的。我们给 a 赋个32 bit能容纳的最大值,b 赋成 1 。把 a 和 b 加起来然后存到另外一个无符号整形变量里面,长度是32 bit的。 a = 0xffffffff b = 0x1 r = a + b 好,既然 r 的结果是不能用32 bit无符号整数来表示,那么按照 ISO 标准就成了对0x100000000的取模 r = (0xffffffff + 0x1) % 0x100000000 r = (0x100000000) % 0x100000000 = 0 用取模运算来削减运算结果基本上保证只用到整形变量的低32位,于是整形变量上溢让运算结果的顶端消失了。通常称这个叫“循环”,而且是补 0 的。
2.2 慎用变体型变量
很多教师在讲授VB程序设计的过程中不注重强调变量的显式声明,而且在安装VB时,它的默认设置并不要求对变量进行显式声明,所以学生们都不是很注意这个问题。由于VB程序设计课程不强调在程序编写之前画出流程图,所以大部分学生习惯于在程序编写之前不对程序所要使用的变量进行通盘考虑,而是在最后需要使用的时候才将变量插进来。而VB规定所有未定义的变量默认为Variant型。例如下面的程序段,其中的变量i将作为Variant处理。
Private Sub Command1_Click()
Dim MyArray(5) As Single
For i = 0 To 5
a(i) = inputbox("请输入第" & i & "个元素的值")
Next i
End Sub
还有一些同学在变量声明中没有包含As<类型>子句,那么该变量也被创建为Variant型。例如下面两个变量声明将产生相同的结果:
Dim MyVarialble
Dim MyVarialble As Variant
对于用户创建的Function过程来讲,这一原则也同样使用。定义一个函数时,如果不包含As<类型>子句,函数的返回值将始终是Variant。下面两个函数定义也产生相同的结果:
Private Function MyFunction()
Private Function MyFunction() as Variant
这一点也是我们讲课时经常忽略的。
上一页 [1] [2] [3] [4] [5] [6] [7] 下一页
浅谈VB中的变量使用 第6页下载如图片无法显示或论文不完整,请联系qq752018766