圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 5067|回復: 8

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

  [複製鏈接]
jack800417 發表於 2011-10-6 18:00 | 顯示全部樓層 |閱讀模式
請問一下老師:
我有兩種執行程式,一.直走  二.轉彎
一.
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
  ......(判斷) 
  Goto  S_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

Goto  S_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
老師,我用goto,直走程序沒問題但是他不會跳轉到S_Name執行轉彎程序,他還是一直前進
DO

關於"如果使用第二種"副程式的架構"變成連感測器都不會感測了"
是否是你的Distance1不是全域變數,因此數值無法回應感測器的值,
可以用上傳檔的功能把全部程式碼(.inb)的檔案上傳,我幫你看看!
 樓主| jack800417 發表於 2011-10-12 12:19 | 顯示全部樓層
本帖最後由 jack800417 於 2011-10-12 12:20 編輯

這是副程式架構的程式碼
嘗試跳轉之副程式架構.inb (2.29 KB, 下載次數: 3)

這是使用GOTO
嘗試跳轉之GOTO.inb (2.32 KB, 下載次數: 0)


magiccar 發表於 2011-10-12 13:22 | 顯示全部樓層
jack800417 發表於 2011-10-12 12:19
這是副程式架構的程式碼

錯在”條件重疊”,如果”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
YA~我成功了~
原來是條件重複那裡出錯了~謝謝老師
另外,我想請問老師 SonarA 如果打出去的波, ...

是的,所以這個是無效的值,要用程式過濾掉。

對了!這個主題如果有答案,請在原發文頁面1樓處選”編輯”,進去在原標題後加上”(已解決)”
讓大家知道這個主題是有答案的,這次我幫你改,下次發問就要自已改了,謝謝!
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

QQ|Archiver|手機版|小黑屋|圓創力科技有限公司 IOP Robotic Technology Co.,Ltd Tel: 07-3924582 Fax: 07-3924001

GMT+8, 2024-4-24 07:50 , Processed in 0.023917 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回復 返回頂部 返回列表