下面是我根據流程圖撰寫的一段代碼,但是運行程式無回應,不知道哪里的錯誤?我是學機械的,編程能力有限,還請大神們多多幫忙,幫我看一下邏輯上有什么錯誤嗎?跪謝!
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
框圖如下:
uj5u.com熱心網友回復:
啥叫程式無回應?這類東西只能靠自己根據流程圖來逐步除錯,看看程式的執行程序是否和流程圖一致....
uj5u.com熱心網友回復:
在回圈結構內加一句:DoEventsuj5u.com熱心網友回復:
我單步除錯是可以運行的,因為我這段程式的主體是一個大回圈,最后一起運行大回圈的時候,程式就長時間沒有回應了。所以我現在想問的是,是不是我的程式邏輯出了什么問題,心在緊靠我自己的能力我也看不出來,所以請大家幫忙!
uj5u.com熱心網友回復:
長時間回圈沒結束,程式就會沒回應。如果是死回圈,要么輸入值不正確、要么是代碼錯誤,這要靠你自己去發現。
如果僅僅是回圈時間長了點,如#2所言加DoEvents。按下面的方式,界面的計數器始終在重繪。
'順便在表單上加個 Label,假定叫 lblLoopCount'
Dim iLoopCount As Long '定義一個回圈計數變數'
Do
iLoopCount = iLoopCount + 1
lblLoopCount = iLoopCount
DoEvents '<- 加上這幾句'
...
Loop Until ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/99670.html
標籤:VB基礎類
上一篇:我有個程式原來用的很好 突然里面不能保存了 肯能是環境問題 求助大神 謝謝
下一篇:StrConv 問題
