VB实时错误9,下标越界
程序调整时显示下表越界,调试显示出错在红色区域,请大侠帮忙看看。谢谢了Call subroutinefrk
Dim h As Single
Dim AA() As Single
Dim BB() As Single
Dim f() As Single
ReDim AA(h) As Single
ReDim BB(h) As Single
ReDim f(h) As Single
AA(h) = (b + m * h) * h
BB(h) = b + 2# * m * h
dh = 0.02 * (he - hs)
g = 9.8
m1 = Sqr(1# + m * m)
c1 = q * q / g
c2 = n * n * q * q
For i = 1 To 50
h1 = hs
f1 = f(h1)f(h1) = (1 - c1 * BB(h1) / AA(h1) ^ 3) / (i - c2 * (b + 2 * h1 * m1) ^ (4 / 3) / AA(h1) ^ (10 / 3))
s = 0#
h2 = h1 + dh
f2 = f(h2)
f(h2) = (1 - c1 * BB(h2) / AA(h2) ^ 3) / (i - c2 * (b + 2 * h2 * m1) ^ (4 / 3) / AA(h2) ^ (10 / 3))
If ((h2 - he) * dh < 0#) Then
ds = 0.5 * (f1 + f2) * dh
s = s + ds
Else
dh = he - h1
End If
Print "h2="; Format(h2, "0.000")
Print "ds="; Format(ds, "0.000")
Print "s="; Format(s, "0.000")
h1 = h2
f1 = f2
If Abs(h2 - he) < 0.001 Then Exit For --------------------编程问答-------------------- For i = 0 To 49
--------------------编程问答--------------------
还是不行啊 --------------------编程问答-------------------- ReDim f(h) As Single
的前面h=50 --------------------编程问答--------------------
加完之后,显示实时错误6,溢出,程序显示错误出在紧接的下一句即f(h1) = (1 - c1 * BB(h1) / AA(h1) ^ 3) / (i - c2 * (b + 2 * h1 * m1) ^ (4 / 3) / AA(h1) ^ (10 / 3))
--------------------编程问答-------------------- h1 = hs
hs是多少你告诉计算机了么?
感情是你啥都不会啊
--------------------编程问答-------------------- 这里不做各种毕业设计,作业 --------------------编程问答-------------------- 这么写是错误的:
f1 = f(h1)f(h1) = (1 - c1 * BB(h1) / AA(h1) ^ 3) / (i - c2 * (b + 2 * h1 * m1) ^ (4 / 3) / AA(h1) ^ (10 / 3))
似乎应该是:
f1 = f(h1)
f(h1) = (1 - c1 * BB(h1) / AA(h1) ^ 3) / (i - c2 * (b + 2 * h1 * m1) ^ (4 / 3) / AA(h1) ^ (10 / 3))
--------------------编程问答--------------------
Call subroutinefrk
Dim h As Single
Dim AA() As Single
Dim BB() As Single
Dim f() As Single
ReDim AA(h) As Single
ReDim BB(h) As Single
ReDim f(h) As Single
AA(h) = (b + m * h) * h
BB(h) = b + 2# * m * h
dh = 0.02 * (he - hs)
g = 9.8
m1 = Sqr(1# + m * m)
c1 = q * q / g
c2 = n * n * q * q
For i = 1 To 50
h1 = hs
f1 = f(h1)
f(h1) = (1 - c1 * BB(h1) / AA(h1) ^ 3) / (i - c2 * (b + 2 * h1 * m1) ^ (4 / 3) / AA(h1) ^ (10 / 3))
s = 0#
h2 = h1 + dh
f2 = f(h2)
f(h2) = (1 - c1 * BB(h2) / AA(h2) ^ 3) / (i - c2 * (b + 2 * h2 * m1) ^ (4 / 3) / AA(h2) ^ (10 / 3))
If ((h2 - he) * dh < 0#) Then
ds = 0.5 * (f1 + f2) * dh
s = s + ds
Else
dh = he - h1
End If
Print "h2="; Format(h2, "0.000")
Print "ds="; Format(ds, "0.000")
Print "s="; Format(s, "0.000")
h1 = h2
f1 = f2
If Abs(h2 - he) < 0.001 Then Exit For
Next
hs在前面已经赋值了,只是这里没有写出来而已。说实话,对于编程我确实是个大菜鸟,所以才来这里请教高手嘛。 --------------------编程问答--------------------
你说的那个错误我没有犯啊,只是帖子在编辑的时候出了点问题,我的程序格式跟你说的是一样的。不过也谢谢提醒! --------------------编程问答--------------------
这应该不算是做吧,只是我的程序出了问题,不知道该怎么弄了,所以来请教高手嘛。程序我是会自己写的,不会让高手帮忙写的,只是这个小问题情高手指点一下啊。不过你说的很对,求人不如求己嘛,谢谢了! --------------------编程问答-------------------- 自己写的代码居然啥也不会,你是神仙啊?
嘴还挺硬,拿我等当傻瓜啊?
--------------------编程问答-------------------- 把代码给全,下表越界的情况很多,否则无法调试。而且瞧这变量用的,看着头疼眼晕。 --------------------编程问答--------------------
问题出在红色区域,“实时错误9,下标越界”,谢谢了
--------------------编程问答-------------------- 全部程序已经发了,请教高手帮忙看一下啊 --------------------编程问答-------------------- Dim h As Single
Dim m!, n!, i!, q!, b!, hs!, l!, g!, hk!, h0!, dh!, he!
Private Sub Command1_Click()
m = Val(InputBox("边坡粗糙系数m", "", "2.0000"))
n = InputBox("粗糙系数n", "", "0.0250")
i = InputBox("底坡i", "", "0.0016")
q = InputBox("流量Q", "", "10.0000")
b = InputBox("底宽b", "", "6.0000")
l = InputBox("渠道长度", "", "500")
hs = InputBox("开始断面水深hs", "", "1.5000")
h5 = 0.5
g = 9.8
Do '正常水深的迭代
h0 = (n ^ 2 * q ^ 2 / i) ^ 0.3 * (b + 2 * h5 * Sqr(1 + m ^ 2)) ^ 0.4 / (b + m * h5)
If Abs(h0 - h5) < 0.001 Then Exit Do
h5 = h0
Loop
Print "h0="; Format(h0, "0.000")
Do '临界水深的迭代
hk = (q ^ 2 * (b + 2 * m * h5) / g) ^ (1 / 3) / (b + m * h5)
If Abs(hk - h5) < 0.001 Then Exit Do
h5 = hk
Loop
Print "hk="; Format(hk, "0.000")
If k = 1 Then '末端断面水深的判断
he = 1.01 * h0
ElseIf k = 2 Then
he = 0.99 * h0
ElseIf k = 3 Then
he = 1.01 * hk
Else
he = 0.99 * hk
End If
Call subroutinefrk
Dim h As Single
Dim AA() As Single
Dim BB() As Single
Dim f() As Single
ReDim AA(h) As Single
ReDim BB(h) As Single
ReDim f(h) As Single
AA(h) = (b + m * h) * h
BB(h) = b + 2# * m * h
dh = 0.02 * (he - hs)
g = 9.8
m1 = Sqr(1# + m * m)
c1 = q * q / g
c2 = n * n * q * q
For i = 1 To 50
h1 = hs
f1 = f(h1)
f(h1) = (1 - c1 * BB(h1) / AA(h1) ^ 3) / (i - c2 * (b + 2 * h1 * m1) ^ (4 / 3) / AA(h1) ^ (10 / 3))
s = 0#
h2 = h1 + dh
f2 = f(h2)
f(h2) = (1 - c1 * BB(h2) / AA(h2) ^ 3) / (i - c2 * (b + 2 * h2 * m1) ^ (4 / 3) / AA(h2) ^ (10 / 3))
If ((h2 - he) * dh < 0#) Then
ds = 0.5 * (f1 + f2) * dh
s = s + ds
Else
dh = he - h1
End If
Print "h2="; Format(h2, "0.000")
Print "ds="; Format(ds, "0.000")
Print "s="; Format(s, "0.000")
h1 = h2
f1 = f2
If Abs(h2 - he) < 0.001 Then Exit For
Next i
End Sub
Public Function subroutinefrk() '12种水面曲线的类型的判断的函数
If (i > 0#) Then
If (h0 > hk) Then
If (hs > h0) Then
Print "M1型水面曲线"
k = 1
ElseIf (hs > hk And hs < h0) Then
Print "M2型水面曲线"
k = 2
Else
Print "M3型水面曲线"
k = 4
End If
ElseIf (Abs(h0 - hk) < 0.0001) Then
Print "C1型水面曲线"
Else
Print "C3型水面曲线"
End If
Else
If (hs > hk) Then
Print "S1型水面曲线"
ElseIf (hs > h0 And hs < hk) Then
Print "S2型水面曲线"
k = 1
Else
Print "S1型水面曲线"
k = 2
End If
End If
If (i = 0) Then
If (hs > hk) Then
Print "H2型水面曲线"
k = 3
Else
Print "H3型水面曲线"
k = 4
End If
End If
If i < 0 Then
If (hs > hk) Then
Print "A2型水面曲线"
k = 3
Else
Print "A3型水面曲线"
k = 4
End If
End If
End Function
Dim AA() As Single
Dim BB() As Single
Dim f() As Single
ReDim AA(h) As Single
ReDim BB(h) As Single
ReDim f(h) As Single
代码中 dim h, h=0, ReDim f(h) As Single, f数组只有一个f(0),
而在:
h1 = hs
f1 = f(h1)
计算值 h1=1.5, 即f(1)越界(m n i q b hs l 我都是按默认值算的)
错误就是 h 没有赋值。
--------------------编程问答-------------------- 编译器已经提示的很明显了 --------------------编程问答-------------------- 你的代码......
我给 h = 50
运行后溢出,原因:
AA(h) = (b + m * h) * h
h=50 则 AA(50)=数值, 而 AA(0) to AA(49) = 0,
f(h1) = (1 - c1 * BB(h1) / AA(h1) ^ 3) / (i - c2 * (b + 2 * h1 * m1) ^ (4 / 3) / AA(h1) ^ (10 / 3))
AA(h1)=0 , 分母为 0 溢出。 自己改代码吧。我实在看不出你的思路。 --------------------编程问答--------------------
Dim h As Single
Dim AA() As Single
Dim BB() As Single
Dim f() As Single
ReDim AA(h) As Single
ReDim BB(h) As Single
ReDim f(h) As Single
'h究竟为那个数值,这里只能认为是0
AA(h) = (b + m * h) * h
BB(h) = b + 2# * m * h
dh = 0.02 * (he - hs)
g = 9.8
m1 = Sqr(1# + m * m)
c1 = q * q / g
c2 = n * n * q * q
'For循环中的h1是啥东东?
For i = 1 To 50
h1 = hs
Print hs
f1 = f(h1)
f(h1) = (1 - c1 * BB(h1) / AA(h1) ^ 3) / (i - c2 * (b + 2 * h1 * m1) ^ (4 / 3) / AA(h1) ^ (10 / 3))
s = 0#
h2 = h1 + dh
f2 = f(h2)
f(h2) = (1 - c1 * BB(h2) / AA(h2) ^ 3) / (i - c2 * (b + 2 * h2 * m1) ^ (4 / 3) / AA(h2) ^ (10 / 3))
If ((h2 - he) * dh < 0#) Then
ds = 0.5 * (f1 + f2) * dh
s = s + ds
Else
dh = he - h1
End If
Print "h2="; Format(h2, "0.000")
Print "ds="; Format(ds, "0.000")
Print "s="; Format(s, "0.000")
h1 = h2
f1 = f2
If Abs(h2 - he) < 0.001 Then Exit For
Next i
1)h究竟为那个数值,这里只能认为是0
2)For循环中的h1是啥东东? --------------------编程问答--------------------
h相当于方程中的未知数x,而h1,h2则相当于他的两个解,下面的for循环就是对h1,h2的循环 --------------------编程问答-------------------- 感情这大哥新开了个贴呀.
你先把你的计算过程和楼上的说清楚,别怕字多,说清楚了,你那代码别人也就能修改了.
你不知道从那里弄的程序,自己又差太远,别人也不知道你算的是什么,没法呀. --------------------编程问答--------------------
以前开的帖子的程序跟我改完后的程序相差太远,又不能修改,所以无奈开了个新帖,请见谅啊。这个程序是我自己写的,所以比较糟糕。
计算过程:
我只说出问题的那段吧
dh = 0.02 * (he - hs)
g = 9.8
m1 = Sqr(1# + m * m)
c1 = q * q / g
c2 = n * n * q * q均可通过已知数计算得到
通过h1(h1=hs,其中hs为已知数)可以通过公式AA(h) = (b + m * h) * h(即将h1代入公式),BB(h) = b + 2# * m * h,f(h) = (1 - c1 * BB(h) / AA(h) ^ 3) / (i - c2 * (b + 2 * h * m1) ^ (4 / 3) / AA(h) ^ (10 / 3))和h2 = h1 + dh分别计算得AA(h1),BB(h1),f(h1)和h2,同时通过上述公式和h2可以计算AA(h2),BB(h2),f(h2),然后令f1 = f(h1),f2 = f(h2),接着ds = 0.5 * (f1 + f2)* dh可得到ds数值,通过s = s + ds可得到此时s的值,然后print : ds ,s,h2三个数值。此时一个循环完成。接下的循环就是令h1=h2进行下一个循环,得到ds ,s ,h2三个数值。一直进行50个循环。完成 --------------------编程问答--------------------
--------------------编程问答--------------------
AA(h) = (b + m * h) * h
BB(h) = b + 2# * m * h
dh = 0.02 * (he - hs) '计算dh,其中he和hs均为已知
g = 9.8
m1 = Sqr(1# + m * m) 'm1为中间变量,此式为计算m1
c1 = q * q / g 'c1为中间变量,此式为计算c1
c2 = n * n * q * q 'c2为中间变量,此式为计算c2
For i = 1 To 50
h1 = hs '对h1进行赋值
Print hs '打印hs
f1 = f(h1) ’f1为中间变量,并对f1进行赋值
f(h1) = (1 - c1 * BB(h1) / AA(h1) ^ 3) / (i - c2 * (b + 2 * h1 * m1) ^ (4 / 3) / AA(h1) ^ (10 / 3)) '通过h1代入计算得到f(h1)
s = 0#
h2 = h1 + dh '因为h1此时为已知(上面已对其进行赋值),计算得到h2
f2 = f(h2) 'f2同f1
f(h2) = (1 - c1 * BB(h2) / AA(h2) ^ 3) / (i - c2 * (b + 2 * h2 * m1) ^ (4 / 3) / AA(h2) ^ (10 / 3)) 'f(h2)同f(h1)
If ((h2 - he) * dh < 0#) Then '对计算得到的h2进行判别
ds = 0.5 * (f1 + f2) * dh '通过计算得到的f1和f2来计算ds
s = s + ds '通过ds来计算s
Else
dh = he - h1
End If
Print "h2="; Format(h2, "0.000")
Print "ds="; Format(ds, "0.000")
Print "s="; Format(s, "0.000")
h1 = h2 '为下一个循环做准备,令h1=h2,此时h1被赋值,h2为上面计算得到
f1 = f2 '同上
If Abs(h2 - he) < 0.001 Then Exit For '对所有计算得到的h2进行判别
Next i
Dim h As Single
Dim AA() As Single
Dim BB() As Single
Dim f() As Single
ReDim AA(h) As Single
ReDim BB(h) As Single
ReDim f(h) As Single
从这里可知,h初始化为0,所以,f(h)只能为f(0)。
h1 = hs '对h1进行赋值当hs大于0.5的时候,f(hs)即下标越界,这是肯定的。
f1 = f(h1) 'f1为中间变量,并对f1进行赋值
--------------------编程问答-------------------- 是不是应该Redim f(50), AA(50),BB(50),然后给AA(), BB()赋值,然后再进入 For 循环。
AA()= 0,则 c1 * BB(h) / AA(h) 肯定溢出。 --------------------编程问答-------------------- 是不是应该Redim f(50), AA(50),BB(50),然后给AA(), BB()赋值,然后再进入 For 循环。
AA()= 0,则 c1 * BB(h) / AA(h) 肯定溢出。 --------------------编程问答-------------------- 希望楼主认真校验下代码中的数组下标,数组变量,数组值。
我看了半天,头大了。 --------------------编程问答-------------------- 这种混淆过的代码。。。从来不看,,愁人 --------------------编程问答-------------------- h的值不一定是50就能解决问题。
dh = 0.02 * (he - hs)
所以步阶不一定就是1.
哎,乱的很,看起来挺累,可能没理解吧。
--------------------编程问答-------------------- f(h1)f(h1) 这是什么写法,没见过唉... --------------------编程问答-------------------- LZ是似乎应该使用递归方法来解决问题.
此外VB语言中f(h1)是指元素为h1+1个的变量f数组,它与LZ想表示的数学函数是两码事.
补充:VB , 基础类