有在使用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的認識又更上一層樓囉!