我在网上找到的曲线拟合源码不会调用 在此请教各位大虾
这是我下载的源码Option Explicit
Public Sub Iapcir(X() As Double, Y() As Double, ByVal n As Integer, ByRef a() As Double, ByVal m As Integer, ByRef rdblAverageX As Double, ByRef dt() As Double)
Dim I As Integer, J As Integer, K As Integer
Dim Z As Double, P As Double, C As Double, G As Double, Q As Double, D1 As Double, D2 As Double
Dim S(19) As Double, T(19) As Double, B(19) As DoubleFor I = 0 To m - 1
a(I) = 0
Next IIf m > n Then m = n
If m > 20 Then m = 20Z = 0#For I = 0 To n - 1
rdblAverageX = rdblAverageX + X(I)
Z = Z + X(I) / (1# * n)
Next I
rdblAverageX = rdblAverageX / nB(0) = 1#
D1 = 1# * n
P = 0#
C = 0#For I = 0 To n - 1
P = P(X(I) - Z)
C = C + Y(I)
Next IC = C / D1
P = P / D1
a(0) = C * B(0)If m > 1 Then
T(1) = 1#
T(0) = (-1) * P
D2 = 0#
C = 0#
G = 0#
For I = 0 To n - 1
Q = X(I) - Z - P
D2 = D2 + Q * Q
C = C + Y(I) * Q
G = G(X(I) - Z) * Q * Q
Next IC = C / D2
P = G / D2
Q = D2 / D1
D1 = D2
a(1) = C * T(1)
a(0) = C * T(0) + a(0)
End IfFor J = 2 To m - 1
S(J) = T(J - 1)
S(J - 1) = (-1) * P * T(J - 1) + T(J - 2)If J >= 3 Then
For K = J - 2 To 1 Step -1
S(K) = (-1) * P * T(K) + T(K - 1) - Q * B(K)
Next K
End IfS(0) = (-1) * P * T(0) - Q * B(0)D2 = 0#
C = 0#
G = 0#For I = 0 To n - 1
Q = S(J)For K = J - 1 To 0 Step -1
Q = Q * (X(I) - Z) + S(K)
Next KD2 = D2 + Q * Q
C = C + Y(I) * Q
G = G(X(I) - Z) * Q * Q
Next IC = C / D2
P = G / D2
Q = D2 / D1
D1 = D2
a(J) = C * S(J)
T(J) = S(J)For K = J - 1 To 0 Step -1
a(K) = C * S(K) + a(K)
B(K) = T(K)
T(K) = S(K)
Next K
Next Jdt(0) = 0#
dt(1) = 0#
dt(2) = 0#For I = 0 To n - 1
Q = a(m - 1)For K = m - 2 To 0 Step -1
Q = a(K) + Q * (X(I) - Z)
Next KP = Q - Y(I)If Abs(P) > dt(2) Then
dt(2) = Abs(P)
End If
dt(0) = dt(0) + P * P
dt(1) = dt(1) + Abs(P)
Next IEnd Sub
原帖提示这样调用函数
Call Iapcir(X, Y,50, a, 3, X1, dt)我是这样调用的Dim X(3), Y(3), a(3), x1, dt(3) As Double
Private Sub cmdcalc_Click()
Call Iapcir(X, Y, 4, a(), 4, x1, dt)
End Sub
运行是会给出错误提示
类型不匹配:缺少数组或用户定义类型
指示在 Call Iapcir(X, Y, 4, a(), 4, x1, dt) 这句的X上

解决方案 »

  1.   

    Dim X(3) as Double
    Dim Y(3) as Double
    ....
    要一个一个声明
      

  2.   

    yangxie5201314:
    应该是可以了 谢谢你 
    我用c用多了
      

  3.   

    你的函数是这样定义的Public Sub Iapcir(X() As Double, _              '双精度数组
                      Y() As Double, _              '双精度数组
                      ByVal n As Integer, _         '整形变量
                      ByRef a() As Double, _        '双精度数组
                      ByVal m As Integer, _         '整形变量
                      ByRef rdblAverageX As Double, _  '双精度变量
                      ByRef dt() As Double)             '双精度数组
        '...
    End Sub你是这样用的   Dim X(3), Y(3), a(3), x1, dt(3) As Double
       Private Sub cmdcalc_Click()
       Call Iapcir(X, Y, 4, a(), 4, x1, dt)
       End Sub
       '说明
       'X 为变体类型数组
       'Y 为变体类型数组
       'a 为变体类型数组
       'x1 为变体类型变量
       'dt 双精度数组
       Iapcir(X, _     '变体类型数组
              Y, _     '变体类型数组
              4, _     '实数(默认为32位的空间,因为传递过去的值比较小,程序只取低16位,所以不会出错)
              a(), _   '这里的数组不应该这么用,不需要 ()
              4, _     '实数
              x1, _    '变体类型变量
              dt)      '双精度数组   '建议用法
       Dim X(3) As Double, Y(3) As Double, a(3) As Double, x1 As Double, dt(3) As Double
       Iapcir(X, _     '双精度数组
               Y, _     '双精度数组
               Cint(4), '整形变量(即使是负数也不会出错,因为32位的负数与16位的负数字节位不一样的)
               a, _     '双精度数组
              CInt(4), '整形变量
               x1, _    '双精度变量
               dt)      '双精度数组
       '注意,VB中只要不在变量后声明类型,就会默认类型为变体类型
       '很简单的一个范例就可以测试出这个理论
       Private Sub Command1_Click()
          Dim x, y As Long
          On Error Resume Next
          x = Null
          If Err.Number <> 0 Then
             Err.Clear
             MsgBox "设置 X 为 NULL 失败,说明 X 不是变体类型"
          Else
             MsgBox "设置 X 为 NULL 成功,说明 X 为变体类型"
          End If
       
          y = Null
          If Err.Number <> 0 Then
             Err.Clear
             MsgBox "设置 A 为 NULL 失败,说明 A 不是变体类"
          Else
             MsgBox "设置 A 为 NULL 成功,说明 A 为变体类型"
          End If
       End Sub