jack800417 發表於 2011-10-6 18:00

如何在innoBASIC 裡面使用GOTO?(已解決)

請問一下老師:
我有兩種執行程式,一.直走二.轉彎
一.
If Distance1 =22 Then
MyMotor.ForwardAB(400,410)
PAUSE 500
......(判斷)
MyMotor.ForwardAB(430,400)
PAUSE 500
End If

二.轉彎
If Distance1 >50 Then
MyMotor.ForwardAB(410,0)
PAUSE 2000
MyMotor.ForwardAB(0,0)
PAUSE 500
MyMotor.ForwardAB(400,410)
PAUSE 2000
MyMotor.ForwardAB(0,0)
PAUSE 500
MyMotor.ForwardAB(410,0)
PAUSE 2000
MyMotor.ForwardAB(0,0)
End If

我想要在執行直走程序的時,走出壕溝,感測器感測到的距離大於50,跳到轉彎的程序。
原本兩種程序試放在一起的,但是發現會有執行上順序的誤差,有時需要直走的時候他給我右轉,有時要右轉時就一直給我直走
所以想要以這種跳副程式的指令GOTO來連結,
請問老師,這樣要怎麼+入GOTO呢?

jack800417 發表於 2011-10-6 18:04

如果用GOTO的話,把轉彎程序當成副程式((平常不執行)),當超音波感測超過50,就跳到轉彎程序,轉彎程序執行完再跳回直走程序

magiccar 發表於 2011-10-7 00:38

跟一般的Basic作法一樣:

Sub main()
Do
 ...
 ...
 If Distance1 =22 Then
  MyMotor.ForwardAB(400,410)
  PAUSE 500
  ......(判斷) 
  GotoS_Name
Goto_Return:
  MyMotor.ForwardAB(430,400)
  PAUSE 500
 End If
 ...
 ...
Loop  ’<-防止程式跨到你設定的副程式段落
S_Name :
 If Distance1 >50 Then
  MyMotor.ForwardAB(410,0)
  ...
  ...
 End If
 Goto Goto_Return

但你用副程式的架構不是更簡單嗎?
Sub main()
 ...
 ...
 If Distance1 =22 Then
  MyMotor.ForwardAB(400,410)
  PAUSE 500
  ......(判斷) 
  S_Name() ’<-直接呼叫副程式
  MyMotor.ForwardAB(430,400)
  PAUSE 500
 End If
 ...
 ...
End Sub


Sub S_Name()
 If Distance1 >50 Then
  MyMotor.ForwardAB(410,0)
  ...
  ...
 End If
End Sub  ’<-結束後直接跳回原呼叫程式下一行

jack800417 發表於 2011-10-11 12:39

老師,我用goto,直走程序沒問題但是他不會跳轉到S_Name執行轉彎程序,他還是一直前進
DO

If Distance1 =22 Then
MyMotor.ForwardAB(400,410)
PAUSE 500
ElseIf Distance2 <22 Then
MyMotor.ForwardAB(400,430)
PAUSE 500
ElseIf Distance1 >22 Then
MyMotor.ForwardAB(430,400)
ElseIf Distance1 >50 Then

GotoS_Name
Goto_Return:

MyMotor.ForwardAB(430,400)
PAUSE 500
End If

Loop
S_Name :
If Distance1 >50 Then
MyMotor.ForwardAB(410,0)
PAUSE 2000
MyMotor.ForwardAB(0,0)
PAUSE 500
MyMotor.ForwardAB(400,410)
PAUSE 2000
MyMotor.ForwardAB(0,0)
PAUSE 500
MyMotor.ForwardAB(410,0)
PAUSE 2000
MyMotor.ForwardAB(0,0)
End If
Goto Goto_Return

如果使用第二種"副程式的架構"變成連感測器都不會感測了{:soso_e101:}
Sub MAIN()
.....
.....
If Distance1 =22 Then
MyMotor.ForwardAB(400,410)
PAUSE 500
ElseIf Distance2 <22 Then
MyMotor.ForwardAB(400,430)
PAUSE 500
ElseIf Distance1 >22 Then
MyMotor.ForwardAB(430,400)
ElseIf Distance1 >50 Then

S_Name()

MyMotor.ForwardAB(430,400)
PAUSE 500
End If

Sub S_Name()

If Distance1 >50 Then
MyMotor.ForwardAB(410,0)
PAUSE 2000
MyMotor.ForwardAB(0,0)
PAUSE 500
MyMotor.ForwardAB(400,410)
PAUSE 2000
MyMotor.ForwardAB(0,0)
PAUSE 500
MyMotor.ForwardAB(410,0)
PAUSE 2000
MyMotor.ForwardAB(0,0)
End If

End Sub
老師,我們是那裡出錯嗎?


magiccar 發表於 2011-10-12 01:37

RE: 如何在innoBASIC 裡面使用GOTO?

jack800417 發表於 2011-10-11 12:39 static/image/common/back.gif
老師,我用goto,直走程序沒問題但是他不會跳轉到S_Name執行轉彎程序,他還是一直前進
DO



關於"如果使用第二種"副程式的架構"變成連感測器都不會感測了"
是否是你的Distance1不是全域變數,因此數值無法回應感測器的值,
可以用上傳檔的功能把全部程式碼(.inb)的檔案上傳,我幫你看看!

jack800417 發表於 2011-10-12 12:19

本帖最後由 jack800417 於 2011-10-12 12:20 編輯

這是副程式架構的程式碼


這是使用GOTO



magiccar 發表於 2011-10-12 13:22

jack800417 發表於 2011-10-12 12:19 static/image/common/back.gif
這是副程式架構的程式碼




錯在”條件重疊”,如果”Distance1”值為70,因 ”ElseIf Distance1 >22 Then” 條件先執且成立,
所以在執行下一行 ”MyMotor.ForwardAB(430,400)” 之後就跳到 ”End If" 了。

                If Distance1 =22 Then
                        MyMotor.ForwardAB(400,410)
                        PAUSE 500
                ElseIf Distance2 <22 Then
                        MyMotor.ForwardAB(400,430)
                        PAUSE 500
                ElseIf Distance1 >22 Then               <-如果此”大於22”條件已滿足,就不會再執行”大於50”的ElseIf程式段
                        MyMotor.ForwardAB(430,400)
                ElseIf Distance1 >50 Then
                        S_Name()
                        MyMotor.ForwardAB(430,400)
                        PAUSE 500
                End If

可改成
                If Distance1 =22 Then
                        MyMotor.ForwardAB(400,410)
                        PAUSE 500
                ElseIf Distance2 <22 Then
                        MyMotor.ForwardAB(400,430)
                        PAUSE 500
                ElseIf Distance1 >22 And Distance1 =<50 Then
                        MyMotor.ForwardAB(430,400)
                ElseIf Distance1 >50 Then
                        S_Name()
                        MyMotor.ForwardAB(430,400)
                        PAUSE 500
                End If

或交換判斷次序
                If Distance1 =22 Then
                        MyMotor.ForwardAB(400,410)
                        PAUSE 500
                ElseIf Distance2 <22 Then
                        MyMotor.ForwardAB(400,430)
                        PAUSE 500
                ElseIf Distance1 >50 Then   <- 如果Distancd1值為40,因判斷>50不成立,所以會再判斷>22的條件
                        S_Name()
                        MyMotor.ForwardAB(430,400)
                        PAUSE 500
                ElseIf Distance1 >22 Then
                        MyMotor.ForwardAB(430,400)
                End If


jack800417 發表於 2011-10-12 17:01

YA~我成功了~{:soso_e113:}
原來是條件重複那裡出錯了~謝謝老師
另外,我想請問老師 SonarA 如果打出去的波,太遠沒有接收到的話,那個數值是0嗎?

magiccar 發表於 2011-10-12 21:12

jack800417 發表於 2011-10-12 17:01 static/image/common/back.gif
YA~我成功了~
原來是條件重複那裡出錯了~謝謝老師
另外,我想請問老師 SonarA 如果打出去的波, ...
是的,所以這個是無效的值,要用程式過濾掉。

對了!這個主題如果有答案,請在原發文頁面1樓處選”編輯”,進去在原標題後加上”(已解決)”
讓大家知道這個主題是有答案的,這次我幫你改,下次發問就要自已改了,謝謝!
頁: [1]
查看完整版本: 如何在innoBASIC 裡面使用GOTO?(已解決)