我在网上找到的曲线拟合源码不会调用 在此请教各位大虾
这是我下载的源码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上
这是我下载的源码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上
Dim Y(3) as Double
....
要一个一个声明
应该是可以了 谢谢你
我用c用多了
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