vb6.0第五课
一、参数
1、 形参:出现在sub过程和function过程中。
2、实参:调用参数时传递值
二、参数按值和按地址传递
在VB中传递参数有两种方式:按值传递、按地址传递。其中按地址传递,又称为“引用”。
1、按值传递参数
按值传递使用Byval定义参数。使用时,程序为形参在内存中临时分配一个内存单元,并将实参的值传递到这个内存单元中。当过程中改变形参的值时,则只是改变形参内存单元中的值,实参的值不会改变。
如:
Private sub test( byval a as integer, byval b as integer)
A=a+20
B=b+0
Print “a=” & a , “b=”& b
End sub
Private sub cmdtest_click()
Dim num1 as integer , num2 as integer
Num1=10
Num2=10
Print “num1=” & num1 , “num2=” & num2
Call test(num1,num2)
Print “num1=” & num1 , “num2=” & num2
End sub
上述代码中,test过程中修改了形参a 和 b 的值,a和b是按值传递参数的,单击“cmdtest”后,形参a和b的改变没有影响实参num1和num2的取值。
2、按地址传递参数
按地址取值使用byref定义参数。在定义过程中,如果没有byval ,默认的是按地址传递参数。
按地址传递参数,是指把形参变量的内存地址传递给被调用的过程。形参和实参具有相同的地址,即形参和实参共享同一段存储单元。
Private sub test(a as integer, b as integer)
………. 别的都相同
测试结果:形参a和b的改变影响了实参num1 和num2的取值。如下图所有
按值传递参数、按地址传递参数应用场合,参考以下几条规则:
(1)对于整型、长整型或单精度参数,如果不希望过程修改实参的值,则采用传值方式。而为了提高效率,字符串和数组应采用传地址方式。此外,用户定义的类型和控件只能通过地址传送。
(2)对于其他数据类型,可以采用两种方式传送。但是建议此类参数最好用传值方式传送,这样可以避免错用参数。
(3)用函数过程可以通过过程名返回值,但只能返回一个值;子过程不能过程过程名返回值,但可以通过参数返回值,并可以返回多个值。但需要子过程返回值时,其相应的参数要用传地址方式。
数组参数:在定义过程中,用数组作为形参出现在过程的形参列表。语法如下:
形能数组名() [As 数据类型]
说明:实参列表中的数组不需要使用括号“()”,过程传递数组只能按地址传递,即形参和实参共有同一段内存单元。
如:
Private function average( age() as integer , n as integer ) as integer
Dim I as integer, aver as integer, sum as integer
For I =0 to n-1
Sum=sum+age(i)
Next i
Aver=sum/n
Average=aver
End function
Private sub command1_click()
Dim employees() as integer ‘定义一个用于存储员工年龄的数组
Redim employees(6)
Employees(0)=20
Employees(1)=28
Employees(2)=30
Employees(3)=24
Employees(4)=25
Employees(5)=35
text1=average(employees,6)
end sub
上述数组employees作为实参传递给形参age,形参age需要改变数组的维界。因此实参employees必须用“dim employees() as integer”语句声明为动态数组。
三、对象参数
除了变量和数组作为实参传递给过程中的形参,VB还允许对象(如窗体、控件等)作为实参传递给过程中的形参。
对象参数可以用引用方式,也可以用传递的方式,即在定义过程中,在对象参数的前面加byval.
如下例为通过子过程objectena设置textbox和commandbutton控件不可用。
Private sub objectena( obj1 as object , obj2 as object)
obj1.enabled=false
obj2.enabled=false
end sub
private sub form1_load()
objectena text1,command1
end sub
四、嵌套过程
sub mysub1()
...
end sub
sub mysub2()
call mysub1
end sub
private sub form1_load()
call mysub2
end sub
上述代码中,mysub2过程调用mysub1过程,而form1_load事件过程又调用了mysub2过程
CSDN-Ada助手: Python入门 技能树或许可以帮到你:https://edu.csdn.net/skill/python?utm_source=AI_act_python
做而论道_CS: 溢出,才是补码运算所需要说明的知识点。 但是,溢出的原因、判断是否溢出的方法,这两者的关系,计算机专家,都没有讲清楚。 该讲的,不讲。 不该讲的,乱讲。 思维正常的人,学习计算机的知识时,会觉得难度很大,就是这个道理。
做而论道_CS: 正负数,变换成为补码之后,仍然是普通的二进制数。 补码的加法运算,和普通二进制数的加法运算,完全相同。 补码,全部的位,都是数值,根本就没有什么符号位。 所谓的“符号位也参加运算”,就是废话。 补码的位数,是固定的。八位就是八位,16 位就是 16 位。 相加之后,产生的进位(无论是 1 或是 0)都不属于补码。所以,进位(或是模),都不必提起。 就是说,补码它本身,就不包括进位。 所以,也就没有什么 “丢弃不丢弃” 的事。 计算机专家,就是一嘴的废话!
做而论道_CS: 补码的来源,与 “取反加一”,毫无关系。 补码的原理,可以用十进制来说明。 假定,只使用两位数:0~99。 此时,-1 就可以用 +99 代替。 如:24-1 = 23 24 + 99 = (一百) 23 忽略进位,只取两位,这两种算法的功能相同。 三角函数中,也有:减 90°与加 270°等价。 限定了位数,数值的变化,就有了周期性。 正数(补码),可以代表负数; 加法,也就可以代替减法。 ----------------- 计算机,有 8 位机、16 位机。。。 每次运算,就只用到 8、16 位二进制数。 即:参加运算的位数,也是限定的。 那么,45-45 = 0,八位机将如下计算: 0010 1101 + xxxx xxxx = 0000 0000。 其中的 xxxx xxxx,就是【-45 的八位补码】。 这个补码,到底是什么? 你自己也能推导出来。 先移项:xxxx xxxx = 0000 0000-0010 1101, 可得出:xxxx xxxx = (借位 1) 1101 0011, 取八位:xxxx xxxx = 1101 0011。 至此,就求出了 [-14]补 = 1101 0011。 求负数的补码,就这么简单。 ----------------- 实际上,任意负数(-X)的补码,都是:0 - X。 你用二进制简单算一下,立刻就能得到结果。 (-128 的 8 位补码,也就是这样求出来的。) 同理,任意正数(+X)的补码,也都是:0 + X。 这还用算? 0 + X,不就是 X 吗? 即,正数的补码,就是 X 本身! ----------------- 在现代计算机中,只配置了加法器。 任何负数,都必须先转换成正数,再做加法。 这个正数,计算机专业就称之为【补码】。 怎么求 -X 对应的正数(补码)? 你用 X-X = 0 就能推出来。 这个公式,太初级了,还需要证明吗? 专家(如盖茨之流)从小就迷上了计算机,学都没正经上。 这些基本的常识,显然都很模糊。 而且,大家都知道:老外的算术能力很差。 用二进制计算:0-X,也许得掰出脚趾头。 没办法,他们只好自己胡编乱造了: 真值机器数符号位原码反码取反加一符号位不变模...。 我们的老师水平也太洼,就知道忽悠学生、抓你挂科。
CSDN-Ada助手: 推荐 Python入门 技能树:https://edu.csdn.net/skill/python?utm_source=AI_act_python