当前位置:编程学习 > VB >>

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
--------------------编程问答--------------------
引用 1 楼 dbcontrols 的回复:
For i = 0 To 49

还是不行啊 --------------------编程问答-------------------- ReDim f(h) As Single
的前面h=50 --------------------编程问答--------------------
引用 3 楼 dbcontrols 的回复:
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
--------------------编程问答--------------------
引用 5 楼 dbcontrols 的回复:
h1 = hs
hs是多少你告诉计算机了么?
感情是你啥都不会啊

hs在前面已经赋值了,只是这里没有写出来而已。说实话,对于编程我确实是个大菜鸟,所以才来这里请教高手嘛。 --------------------编程问答--------------------
引用 7 楼 zdingyun 的回复:
这么写是错误的:

VB code
    
    f1 = f(h1)f(h1) = (1 - c1 * BB(h1) / AA(h1) ^ 3) / (i - c2 * (b + 2 * h1 * m1) ^ (4 / 3) / AA(h1) ^ (10 / 3))

似乎应该是:

VB code

    f1 = f(h1)
    f(h1) = (1 - c1……

你说的那个错误我没有犯啊,只是帖子在编辑的时候出了点问题,我的程序格式跟你说的是一样的。不过也谢谢提醒! --------------------编程问答--------------------
引用 6 楼 dbcontrols 的回复:
这里不做各种毕业设计,作业

这应该不算是做吧,只是我的程序出了问题,不知道该怎么弄了,所以来请教高手嘛。程序我是会自己写的,不会让高手帮忙写的,只是这个小问题情高手指点一下啊。不过你说的很对,求人不如求己嘛,谢谢了! --------------------编程问答-------------------- 自己写的代码居然啥也不会,你是神仙啊?
嘴还挺硬,拿我等当傻瓜啊?

引用 10 楼 blazing_angel 的回复:
引用 6 楼 dbcontrols 的回复:
这里不做各种毕业设计,作业

这应该不算是做吧,只是我的程序出了问题,不知道该怎么弄了,所以来请教高手嘛。程序我是会自己写的,不会让高手帮忙写的,只是这个小问题情高手指点一下啊。不过你说的很对,求人不如求己嘛,谢谢了!
--------------------编程问答-------------------- 把代码给全,下表越界的情况很多,否则无法调试。而且瞧这变量用的,看着头疼眼晕。 --------------------编程问答--------------------
引用 12 楼 z_wenqian 的回复:
把代码给全,下表越界的情况很多,否则无法调试。而且瞧这变量用的,看着头疼眼晕。
 
问题出在红色区域,“实时错误9,下标越界”,谢谢了

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 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
代码中 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是啥东东? --------------------编程问答--------------------
引用 18 楼 zdingyun 的回复:
VB code
    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究竟为那个数值,这里只能认……

h相当于方程中的未知数x,而h1,h2则相当于他的两个解,下面的for循环就是对h1,h2的循环 --------------------编程问答-------------------- 感情这大哥新开了个贴呀.

你先把你的计算过程和楼上的说清楚,别怕字多,说清楚了,你那代码别人也就能修改了.

你不知道从那里弄的程序,自己又差太远,别人也不知道你算的是什么,没法呀. --------------------编程问答--------------------
引用 20 楼 spt_petrolor 的回复:
感情这大哥新开了个贴呀.

你先把你的计算过程和楼上的说清楚,别怕字多,说清楚了,你那代码别人也就能修改了.

你不知道从那里弄的程序,自己又差太远,别人也不知道你算的是什么,没法呀.

以前开的帖子的程序跟我改完后的程序相差太远,又不能修改,所以无奈开了个新帖,请见谅啊。这个程序是我自己写的,所以比较糟糕。
计算过程:
我只说出问题的那段吧
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进行赋值
       f1 = f(h1)                   'f1为中间变量,并对f1进行赋值
当hs大于0.5的时候,f(hs)即下标越界,这是肯定的。
--------------------编程问答-------------------- 是不是应该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 ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,