嵌套if语句跳过其他ifs
问题描述:
嘿家伙我是一个老屁,这是我的第一篇文章,所以请善待。我正在使用基于测量机器上的基础的专有语言。为了测试目的,我故意将前两项检查设置为失败。尺寸X的第一组ifs很好。当代码运行并且它到达Size_Y时,如果操作符选择“不,我不想重新测量”(返回7),则代码跳转到最后一端。我怀疑我不适当地嵌套我的Ifthens,但我看不到它。嵌套if语句跳过其他ifs
Private Sub CheckSpec
'give operator a message if the measure is out of spec
StartAgain:
If Size_X <= 3.125 OR Size_X >= 3.125 then 'actual spec
'Warn that measure is not in spec and ask for remeasure
BoxPick=Msgbox("Measurement in Zone " & Zone & " for Die Size in X is not in spec. Do you want to measure it again?" , 4 , "Measurment NOT Within Tolerance")
If BoxPick = 6 THEN 'if operator wants to remeasure, measure again and start checks over
Call Measure_Die
GoTo StartAgain
ElseIF BoxPick <> 7 Then 'If value returned is NOT 6 or 7, throw error
OperatorMsg "An error has occured. Contact the tool owner"
Call Unload
ElseIF BoxPick = 7 Then 'If operator chooses not to remeasure then keep going
Else
End If
Elseif Size_Y <= 1.925 OR Size_Y >= 1.925 then
'Warn that measure is not in spec and ask for remeasure
BoxPick=Msgbox("Measurement in Zone " & Zone & " for Die Size in X is not in spec. Do you want to measure it again?" , 4 , "Measurment NOT Within Tolerance")
If BoxPick = 6 THEN 'if operator wants to remeasure, measure again and start checks over
Call Measure_Die
GoTo StartAgain
ElseIF BoxPick <> 7 Then 'If value returned is NOT 6 or 7, throw error
OperatorMsg "An error has occured. Contact the tool owner"
Call Unload
ElseIF BoxPick = 7 Then 'If operator chooses not to remeasure keep going
Else
End If
Elseif Centration_X <= 0.175 OR Centration_X >= 0.225 then
'Warn that measure is not in spec and ask for remeasure
BoxPick=Msgbox("Measurement in Zone " & Zone & " for Die Size in X is not in spec. Do you want to measure it again?" , 4 , "Measurment NOT Within Tolerance")
If BoxPick = 6 THEN 'if operator wants to remeasure, measure again and start checks over
Call Measure_Die
GoTo StartAgain
ElseIF BoxPick <> 7 Then 'If value returned is NOT 6 or 7, throw error
OperatorMsg "An error has occured. Contact the tool owner"
Call Unload
ElseIF BoxPick = 7 Then 'If operator chooses not to remeasure keep going
Else
End If
Elseif Centration_Y <= 0.95 OR Centration_Y >= 1.0 then
'Warn that measure is not in spec and ask for remeasure
BoxPick=Msgbox("Measurement in Zone " & Zone & " for Die Size in X is not in spec. Do you want to measure it again?" , 4 , "Measurment NOT Within Tolerance")
If BoxPick = 6 THEN 'if operator wants to remeasure, measure again and start checks over
Call Measure_Die
GoTo StartAgain
ElseIF BoxPick <> 7 Then 'If value returned is NOT 6 or 7, throw error
OperatorMsg "An error has occured. Contact the tool owner"
Call Unload
ElseIF BoxPick = 7 Then 'If operator chooses not to remeasure keep going
Else
End If
Else
End If
Print #1, Column & "," & Row & "," & Level & "," & Zone & "," & Size_X & "," & Size_Y & "," & Centration_X & "," & Centration_Y & "," & RightNow
End Sub 'CheckSpec
答
当你有一个像
If (2 + 2 == 4) then
do something
ElseIf (3 + 3 == 6) then
code never gets here, even though it is true
End If
的表达也许是最快的变化是改变你的主要elseif的语句是自己如果块
来自:
Elseif Size_Y <= 1.925 OR Size_Y >= 1.925 then
到:
End If 'Size_X block check end
If Size_Y <= 1.925 OR Size_Y >= 1.925 then
,然后从:
Elseif Centration_Y <= 0.95 OR Centration_Y >= 1.0 then
到:
End If 'Size Y block end
If Centration_Y <= 0.95 OR Centration_Y >= 1.0 then
答
,如果你已经在IF的“真实”的部分之一,您无法进入ELSEIF块的另一部分块。你已经在这个区块内,剩下的唯一地方就是最后的END-IF。
此外,在大多数情况下,GOTO
不是最好的办法。
考虑这样的事情,重构需要:
Public Enum MeasureResponse
StartOver
KeepGoing
UnloadApp
End Enum
Private Function CheckTolerance(ByVal measureValue As Decimal, ByVal lowTolerance As Decimal, ByVal highTolerance As Decimal) As MeasureResponse
Dim result As MeasureResponse = MeasureResponse.KeepGoing
If measureValue <= lowTolerance Or measureValue >= highTolerance Then
Select Case MessageBox.Show("Measurement in Zone Z for Die Size in X is not in spec. Do you want to measure it again?", "Measurement NOT Within Tolerance", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
Case Windows.Forms.DialogResult.Yes
Call Measure_Die()
result = MeasureResponse.StartOver
Case Windows.Forms.DialogResult.Cancel
result = MeasureResponse.UnloadApp
End Select
End If
Return result
End Function
然后你CheckSpec函数可以是这个样子:
Private Sub CheckSpec()
For i As Integer = 1 To 4
Dim checkItem As Decimal = Choose(i, size_X, size_Y, centration_X, centration_Y)
Dim lowTolerance As Decimal = Choose(i, 3.125, 1.925, 0.175, 0.95)
Dim highTolerance As Decimal = Choose(i, 3.125, 1.925, 0.225, 1.0)
Select Case CheckTolerance(checkItem, lowTolerance, highTolerance)
Case MeasureResponse.StartOver
i = 0
Case MeasureResponse.UnloadApp
Exit Sub
End Select
Next
Print #1, Column & "," & Row & "," & Level & "," & Zone & "," & Size_X & "," & Size_Y & "," & Centration_X & "," & Centration_Y & "," & RightNow
End Sub
这是在VB.Net,但它应该是平移,以VB6或其他基本语言是你正在使用的。
您使用的示例容差也没有意义。 Size_X <= 3.125 OR Size_X >= 3.125
每次都会变得真实。我假设这是为了测试目的。
欢迎使用stackoverflow!我格式化了一下。它实际上看起来很像我的Visual Basic ... – MPelletier 2012-02-24 15:11:35