[教學] until 迴圈的用法以及等待指令while(); until();

有在使用NXC的朋友們,想必都知道until() 這個語法。然而,until() 並不是正規的C語言語法,相信許多人都會對它的功能及用法感到困惑。

事實上,until() 跟 while() 一樣,是根據條件做判斷的迴圈,不同的地方在於跳出迴圈的條件,while迴圈會等待錯誤的條件,而until迴圈則是等待正確的條件。

也就是說,while(condition) 等於 until(!condition) 。

以下面的程式碼為例,兩個程式碼功能完全一樣,都是A馬達正轉直到超音波偵測到的距離小於20公分時停止:

task main ()
{
       SetSensorLowspeed(IN_4);
       while( SensorUS(IN_4) > 20 )
       {
             OnFwd(OUT_A,75);
       }
       Off(OUT_A);
}

task main ()
{
       SetSensorLowspeed(IN_4);
       until( SensorUS(IN_4) < 20)
       {
             OnFwd(OUT_A,75);
       }
       Off(OUT_A);
}

看出差別了嗎? 功能一樣,但跳出迴圈的條件剛好相反。

另外,或許您曾經看過 until();  while(); 這樣的寫法,這又是什麼意思呢?照理來講,until() 與 while() 後面不是不能加分號的嗎?然而實際上compile 是會過的,這並不是BricxCC 有問題。事實上,這是可以接受的寫法,它們是等待指令。

讓我們改寫上面的範例:

task main ()
{
       SetSensorLowspeed(IN_4);
       OnFwd(OUT_A,75);  
       while( SensorUS(IN_4) > 20);
       Off(OUT_A);
}

task main ()
{
       SetSensorLowspeed(IN_4);
       OnFwd(OUT_A,75);
       until( SensorUS(IN_4) < 20);
       Off(OUT_A);
}

這兩個範例的功能跟前兩個完全一樣,只是寫法不同而已。看不懂?換個寫法你就懂了:

其實,while( SensorUS(IN_4) > 20); 等於 while( SensorUS(IN_4) > 20) { }
而 until( SensorUS(IN_4) < 20); 等於 until( SensorUS(IN_4) < 20) { }

也就是說,while( SensorUS(IN_4) > 20); 代表的是一個while的空迴圈,當 SensorUS(IN_4) > 20時,它什麼都不會做,直到條件成立(<20)後跳出迴圈,until也是一樣的原理。因此,它們的功用等於等待指令。

最後一點要澄清的是,若是沒有 Off 指令,馬達是不會停止的。這也就是為什麼我們不用把 OnFwd 指令包在迴圈裡,但馬達還是會一直轉到條件成立為止。

看完了本篇說明,希望您對NXC的認識又更上一層樓囉!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *