现在一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等其他值 。

解决方案 »

  1.   


    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
      

  2.   

    1、call SUMA(A(3),8,F) 从A(3)开始的8个单元求和,F存放求和结果 这是调用形式,当然第一个参数也可能是A(5) A(6)等,第二个参数不一定是8,当然也可以是9,10等其他值 。是第二项,序号写错了 更正如下:  2、call SUMA(A(3),8,F) 从A(3)开始的8个单元求和,F存放求和结果 这是调用形式,当然第一个参数也可能是A(5) A(6)等,第二个参数不一定是8,当然也可以是9,10等其他值 。
      

  3.   

     Dim A(1 To 100) As BytePrivate Sub Form_Load()
       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
      

  4.   

    你的只能用 C++、Java 等支持函数重载的高级语言才能实现。VB中是不支持这样做的。
      

  5.   


    第一种很容易实现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
      

  6.   

    8L 第二种方法的d e 是开始和结束元素下标按照LZ的调用要求,修改如下:
    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
      

  7.   

    byte数组,上述9L的pSrc = pSrc + 4 必须改为pSrc = pSrc + 1