现在一BYTE数组A(25) ,要求写一函数SUM(), 通过此函数 将A数组中连续的某几个元素传入函数,而后将这几个元素的部分连续单元求和 并将结果通过参数F返回SUMA的实现方式分两种,调用形式分别如下1、call SUMA(A(),D,E,F) D为求和元素中的第一个元素的索引号,E为求和元素的个数 ,F存放求和结果 1、call SUMA(A(3),8,F) 从A(3)开始的8个单元求和,F存放求和结果 这是调用形式,当然第一个参数也可能是A(5) A(6)等,第二个参数不一定是8,当然也可以是9,10等其他值 。
Option Explicit
Dim A(0 To 19) As IntegerPrivate Sub Command1_Click()
Me.Caption = CStr(funSum(A, 3, 10))
End SubPrivate Sub Form_Load()
Dim intP As Integer
For intP = 0 To 19
A(intP) = CInt(Rnd * 100)
Next intP
End Sub
'***********************************************************************************************************
'过程功能:求和
'参数说明:B():源数组
' :intA:求和起点
' :intB:求和个数
'返回说明:返回求和值
'***********************************************************************************************************
Private Function funSum(ByRef B() As Integer, ByVal intA As Integer, ByVal intB As Integer) As Long
Dim intP As Integer
On Error GoTo errFun
funSum = 0
If UBound(B) - LBound(B) = 0 Then Exit Function '数组是空数组,退出函数
If intA < LBound(B) Then Exit Function '求和起点小于数组的下限,不符合要求,退出函数
If (intA + intB + 1) > (UBound(B) - LBound(B) + 1) Then Exit Function '起点+长度超过数组范围,不符合要求,退出函数
For intP = intA To intA + intB - 1
funSum = funSum + B(intP)
Next intP
Exit Function
errFun:
funSum = 0
End Function
Dim i As Integer, f As Integer
For i = 1 To 100
A(i) = i
Next
Call SUMA(A(3), 8, f)
Debug.Print f
End SubSub SUMA(X As Byte, E As Integer, f As Integer)
Dim i As Integer
For i = X To X + E - 1
f = f + A(i)
Next
End Sub
第一种很容易实现sub suma(a() as byte,d as long,e as long ,f as long)
dim i as long
f=0
for i=d to e
f=f+a(i)
next
end sub第二种调用,VB里不好实现,但是如果使用copymemory API,也是可以实现,但是其会跳过VB的数组的边界检查,可能会非法内存访问Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Sub Command1_Click()
Dim A(10) As Long
Dim f As Long
Dim i As Long
For i = 0 To 10
A(i) = i
Next
Call SumA(A(3), 3, 5, f)
Print f
End Sub
Private Sub SumA(ByRef A As Long, d As Long, e As Long, f As Long) '假设数组为单元为long类型
Dim i As Long
Dim v As Long
Dim pSrc As Long '脏指针,源数据
Dim pDes As Long '脏指针,目标数据
f = 0
pSrc = VarPtr(A)
pDes = VarPtr(v)
For i = d To e
CopyMemory ByVal pDes, ByVal pSrc, 4
f = f + v
pSrc = pSrc + 4
Next
End Sub
Private Sub SumA(ByRef A As Long, d As Long, f As Long) '假设数组为单元为long类型
'd 累加元素个数
’本函数的调用者必须控制好调用的参数值不能超出数组范围,否则可能会非法内存访问,或者得到错误结果(单元超出数组范围时) Dim i As Long
Dim v As Long
Dim pSrc As Long '脏指针,源数据
Dim pDes As Long '脏指针,目标数据
f = 0
pSrc = VarPtr(A)
pDes = VarPtr(v)
For i = 1 To d
CopyMemory ByVal pDes, ByVal pSrc, 4
f = f + v
pSrc = pSrc + 4
Next
End Sub