授業で LEGO MINDSTORMS を使っています。
ROBOTC for MINDSTORMSのシステム変数にbSoundActiveがありますが、これは何を意味している変数なのですか?
http://www.robotc.net/support/nxt/MindstormsWebH …
ROBOTCの英文ヘルプからすると「音を再生中ならばtrue、再生していなければfalse」という意味だと思うのですが、「サウンド機能が使える状態ならばtrue、使えなければfalse」との説明を受けました。
その変数はむしろbPlaySoundsかbSoundQueueAvailableではないでしょうか。
また、C系はC++の経験が少しある程度で、普段はPHPやHSPを使っているため、ROBOTCも半分PHPの感覚でプログラミングしていました。
if (bSoundActive) { A; } else { B; }
では何度実行してもパースエラーなくBが実行されたので、プログラムのこの位置でbSoundActiveはfalseなのだなぁと思ったのですが、同じ場所で==trueをつけた場合、
if (bSoundActive==true) { A; } else { B; }
ではAが実行されてしまいます。今度はbSoundActiveはtrueと判断せざるを得ません。
この変数はbool型なので、普通==trueは省略してもよいと思うのですが、それだと不都合があるのですか?
No.3ベストアンサー
- 回答日時:
> 課題は「フローチャートに従ってプログラムを書け」というもので、できあがったプログラムは「超音波センサで障害物の距離(SensorValue(sonarSensor))を取得し、距離に応じた周波数のビープ音を鳴らす」というものでした。
なるほど。
>ここでの if(bSoundActive) は、「サウンド機能が使用可能かどうか」を調べるものであると説明されていました。
>何か不具合があってサウンド機能が使用できないときに、elseの方が実行されるという設計なのでしょう。
ドキュメントから、「サウンド再生中であればフラグが立つもの」であって、
「サウンド機能が使用可能であればフラグが立つもの」ではないと思います。
Googleで検索したら、いくつかプログラムが見つかりましたが、
どれも「いま音が出ているかどうか?」をチェックする目的で使用しているようでした。
例えば以下は、スターウォーズの曲を鳴らすプログラムです。
http://www.robotc.net/blog/?cat=5&paged=3
特定の音をPlayToneで時間長を指定して鳴らし、鳴り終わる(falseになる)のを
while(bSoundActive);で待ちます。
「今音が出ていない」ことをフラグから読み取り、駆動が進むプログラムです。
> このプログラムは正しく動作します。(だからこそチェックに合格したのです。)
ですから、なぜ正しく動作したのか、私にはわかりません。
最初に音が鳴っている状態からスタートしたのでなければ、このプログラムは、
何もせずに終わるのが正しい動作だからです。
1点だけ、
if(bSoundActive == false) { A; } else { B; }
ではどうだったのか、というのは興味はあります。
検証ができない今(となっては?)言えるのは、それぐらいです。
遅くなってすみません。
厳密に検証したわけではないのですが、以来他にもbool型に状態を記録するとうまくいかないのにint型で代用するとうまくいったという事例があり、私の中ではbool型の実装に不具合があるのではという結論で落ち着きました。
このような形で締め切ってしまい申し訳ございません。わざわざ付き合っていただいてありがとうございました。
No.2
- 回答日時:
> nxtDisplayTextLine関数があるので、正しい使い方かは分かりませんが、
そういう時には、Googleで関数名を検索するだけで、使用例がほぼ見つかります。
調べてみましょう。
>(int型の変数の表示はこの方法で正しく表示されるようです)
正しい書式に従った記載方法ではないと、検証自体の意味がなくなってしまいます。
> 参考までに、最終的にチェックに合格したプログラムです。whileループの方が実行されます。
プログラムの実行開始時には、音が既に鳴っている状態なのでしょうか。
作成者の意図した動作でない限り、プログラムは言語を問わず、バグを含んだ状態です。
それゆえのご質問かと思いますが、その辺りも、先生に問い合わせてみましょう。
それから、本筋からそれてしまいますが、このwhile文は、breakしませんね。
音が鳴っている・いないにかかわらず、PlayImmediateTone関数をwait10Msec(1)しながら、
永遠に呼びつづけることになりますが、それで良いのでしょうか?
(音が鳴りっ放しになる?)
・音がなっていなかったら鳴らす
・音がなっていたらちょっと待つ
のような制御をしたい、というわけではないのでしょうか?
であれば、
while(true) {
if(bSoundActive) {
} else {
}
}
のような制御構造になると思うのです。
この回答への補足
> nxtDisplayTextLine関数
使用例ではprintfと同様に%dなどを使用していますが、まだ見ていなかった当時は感で書いて「とりあえず動作するから」と安易に考えていました。
確かに、想定外の使い方であれば誤作動してもおかしくありませんね。
課題は「フローチャートに従ってプログラムを書け」というもので、できあがったプログラムは「超音波センサで障害物の距離(SensorValue(sonarSensor))を取得し、距離に応じた周波数のビープ音を鳴らす」というものでした。
ここでの if(bSoundActive) は、「サウンド機能が使用可能かどうか」を調べるものであると説明されていました。
何か不具合があってサウンド機能が使用できないときに、elseの方が実行されるという設計なのでしょう。
breakしないとのことですが、手動で停止させるまで繰り返すので、問題ありません。
このプログラムは正しく動作します。(だからこそチェックに合格したのです。)
ただ、「bSoundActiveは果たして何を示す変数だったのか」、「==trueを省略できなかった理由は何か」という点に疑問が残ったので、質問させていただきました。
No.1
- 回答日時:
>「音を再生中ならばtrue、再生していなければfalse」という意味だと思うのですが
確かにそのように読めます。説明者にドキュメントを見せて、確認を求めてはいかがでしょうか?
また、「自分でもこのようなプログラムを書いて確認してみたのだが」と、単に相手の揚げ足を取るのではなく、客観的に判断できる論拠を示すことが大切かと思います。
> 今度はbSoundActiveはtrueと判断せざるを得ません。
printfなどで、実際に変数の値を確認することはできませんか?
事象から、判断せざるを得ない、というよりも、実際の値を見る方が、より正確でしょう。
> この変数はbool型なので、普通==trueは省略してもよいと思うのですが、それだと不都合があるのですか?
true/falseがどこかで再定義されて、例えば、
#define true 0
#define false 1
などのようになっていると、不都合があるでしょうが、ドキュメントの使用例を見ると、
while(bSoundActive) {
}
などとなっているので、trueは0ではないと思います。
trueの値, falseの値、bSoundActiveの値をif文の直前で確認してみましたか?
==trueが誤って代入文(=true)になっていたりしませんか?
この回答への補足
ご回答ありがとうございます。
そうですね、今度ヘルプを見せて確認してみようと思います。
> printfなどで、実際に変数の値を確認することはできませんか?
文字列を本体液晶画面に出力するnxtDisplayTextLine関数があるので、正しい使い方かは分かりませんが、
nxtDisplayTextLine(1, ""+bSoundActive);
とすると0と表示されました。(int型の変数の表示はこの方法で正しく表示されるようです)
> ==trueが誤って代入文(=true)になっていたりしませんか?
参考までに、最終的にチェックに合格したプログラムです。whileループの方が実行されます。
現在実行できる環境にないので、再確認はできませんが、条件文の==trueを取るとelse側が実行され、腑に落ちなくて仕方がなかった記憶があります。
task main(){
int nSonarValue = 0;
if (bSoundActive==true) { // when TRUE
while (true) {
nSonarValue = SensorValue(sonarSensor); // Get SensorValue
nxtDisplayTextLine(1,"SonarValue: "); // Display text
nxtDisplayTextLine(2," "+nSonarValue);
PlayImmediateTone(nSonarValue*100,1); wait10Msec(1); // Play sound and Wait
}
} else { // when FALSE
nxtDisplayTextLine(1,"Sound Disable"); // Display text
wait10Msec(200);
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
COBOLのピリオド
-
JCLの基本について教えてください
-
360度を超える角度
-
Matlabについて質問2
-
変数の値が勝手に変化する原因
-
3次関数を作るプログラム
-
65536は2の何乗なのでしょうか?
-
PICマイコンのコピー(クローン...
-
正しい五十音順について
-
フローチャートで 変数に代入す...
-
Excelで4096点以上のFFTの方法
-
EXCELなどで「返す」という表現
-
Dドライブ、アンインストール
-
VC++コンソールアプリでウイン...
-
フローチャートの菱形が狭い。。。
-
Bluestacks内でダウンロードし...
-
CとFORTRANの計算速度はどちら...
-
C++ でファイルを消す関数(??)
-
COBOLの連絡領域について
-
iTunesがノートンにブロックさ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数の値が勝手に変化する原因
-
JCLの基本について教えてください
-
Sublime Text 3でのFortranプロ...
-
【JAVA】数字をひし形に出力す...
-
360度を超える角度
-
ProC 固定SQLでNULLってどう表...
-
COBOLのピリオド
-
Fortran90についての質問です。
-
3つの整数のうち奇数のみを表示...
-
main関数終了時のreturnの意味は?
-
fortran if文
-
fortranについて
-
4桁の数値を逆に表示されるプ...
-
3次関数を作るプログラム
-
PICのプログラムでsrandを使う...
-
整数格子点を列挙するプログラム
-
ロトカ=ヴォルテラ方程式 をC...
-
Fortran90のプログラムについて
-
Segmentation fault
-
Fortran "実引数の型が仮引数の...
おすすめ情報