下面是我根据流程图编写的一段代码,但是运行程序无响应,不知道哪里的错误?我是学机械的,编程能力有限,还请大神们多多帮忙,帮我看一下逻辑上有什么错误吗?跪谢!
Dim Dw0 As Double, dm0 As Double, Z0 As Double, Dw1 As Double, dm1 As Double, z1 As Double, t As Double, fc As Double
Dim Dwmin As Double, dmmin As Double, Zmin As Double, Dwmax As Double, dmmax As Double, Zmax As Double
Dim wj As Double, nj As Double, kd As Double, e1 As Double, e2 As Double, p2 As Double, p1 As Double, g As Double
Dim I As Long, str1 As String, str2 As String, str3 As String, SS As Double, f1 As Double, f0 As Double
Dim FF0 As Double, FF1 As Double, tj1 As Double, tj2 As Double
wj = CDbl(Text3.Text)
nj = CDbl(Text2.Text)
kd = CDbl(Text4.Text)
'计算变量的最小值
Dwmin = 0.3 * (wj - nj)
dmmin = 0.5 * (wj + nj)
e1 = Dwmin / dmmin
g = Round(e1, 2)
p1 = (Atn(e1 / Sqr(-e1 * e1 + 1))) * 180 / 3.1415926
Zmin = (180 / 2 / p1) + 1
'计算变量的最大值
Dwmax = 0.6 * (wj - nj)
dmmax = 0.515 * (wj + nj)
e2 = Dwmin / dmmin
p2 = (Atn(e2 / Sqr(-e2 * e2 + 1))) * 180 / 3.1415926
Zmax = (186 / 2 / p2) + 1
'给三个变量赋初值
Dw0 = Dwmin
dm0 = dmmin
Z0 = Zmax
'选取载荷系数fc
Call openRs("select [fc] from zhxs_fc where [bz] = " & Round(e1, 2))
fc = rs.Fields(0)
rs.Close
'Do
  I = 0
  str1 =Grad_unit_1(Dw0, dm0, Z0, fc, t)
  Dw1 = CDbl(Left(str1, InStrRev(str1, "%") - 1))
  dm1 = Mid(str1, InStrRev(str1, "%") + 1, InStrRev(str1, "@") - InStrRev(str1, "%") - 1)
  z1 = Right(str1, Len(str1) - InStrRev(str1, "@"))
  SS = S(Dw1, dm1, z1, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax) 
  '判断是否满足第一个收敛条件
  If SS > 0.0001 Then
    Do
      I = I + 1
      Dw0 = Dw1
      dm0 = dm1
      Z0 = z1
      t = 0.4 * t
      str2 = Grad_S(Dw0, dm0, Z0, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax, t)
      Dw1 = CDbl(Left(str2, InStrRev(str2, "%") - 1))
      dm1 = Mid(str2, InStrRev(str2, "%") + 1, InStrRev(str2, "@") - InStrRev(str2, "%") - 1)
      z1 = Right(str2, Len(str2) - InStrRev(str2, "@"))
      If I = 1 Then
        t = 0.8
        str3 = Grad_unit_1(Dw0, dm0, Z0, fc, t)
        Dw1 = CDbl(Left(str3, InStrRev(str3, "%") - 1))
        dm1 = Mid(str3, InStrRev(str3, "%") + 1, InStrRev(str3, "@") - InStrRev(str3, "%") - 1)
        z1 = Right(str3, Len(str3) - InStrRev(str3, "@"))
        SS = S(Dw1, dm1, z1, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax)
     Else
        SS = S(Dw1, dm1, z1, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax)
    End If
    Loop Until SS <= 0.0001
    f0 = f(Dw0, Z0, fc)
    f1 = f(Dw1, z1, fc)
  Else
    f0 = f(Dw0, Z0, fc)
    f1 = f(Dw1, z1, fc)
End If
tj1 = f1 - f0
'判断是否满足第二个收敛条件
If tj1 >= 10 ^ (-8) Then
  FF0 = FF(Dw0, Z0, fc)
  FF1 = FF(Dw1, z1, fc)
  If FF1 < FF0 Then
     tj2 = Sqr((Dw1 - Dw0) ^ 2 + (dm1 - dm0) ^ 2 + (Z0 - z1) ^ 2)
     If tj2 <= t Then
        t = (2 * t + tj2) / 3
     Else
        t = 0.98 * t
     End If
  Else
     t = 0.5 * t
  End If
Else
  Text6.Text = Str(Dw1)
  Text7.Text = Str(dm1)
  Text8.Text = Str(z1)
  Text9.Text = FF(Dw1, z1, fc)
End If
Loop Until tj1 < 10 ^ (-8)
End Sub
框图如下:

解决方案 »

  1.   

    在循环结构内加一句:DoEvents
      

  2.   

    长时间循环没结束,程序就会没响应。
    如果是死循环,要么输入值不正确、要么是代码错误,这要靠你自己去发现。
    如果仅仅是循环时间长了点,如#2所言加DoEvents。按下面的方式,界面的计数器始终在刷新。
    '顺便在窗体上加个 Label,假定叫 lblLoopCount'
    Dim iLoopCount As Long '定义一个循环计数变量'Do
        iLoopCount = iLoopCount + 1
        lblLoopCount = iLoopCount
        DoEvents '<- 加上这几句'
        ...
    Loop Until ...