• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ROBOTC の bSoundActive 変数)

ROBOTCのbSoundActive変数とは?

このQ&Aのポイント
  • ROBOTCのbSoundActive変数は、LEGO MINDSTORMSのサウンド機能が使えるかどうかを判定するための変数です。
  • bSoundActive変数は、音を再生中であればtrue、再生していなければfalseとなります。
  • 実際にプログラム上でbSoundActiveを使用する際は、==trueを省略しても問題ありませんが、明示的に指定することで可読性を高めることができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • hidebun
  • ベストアンサー率50% (92/181)
回答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; } ではどうだったのか、というのは興味はあります。 検証ができない今(となっては?)言えるのは、それぐらいです。

Lef_
質問者

お礼

遅くなってすみません。 厳密に検証したわけではないのですが、以来他にもbool型に状態を記録するとうまくいかないのにint型で代用するとうまくいったという事例があり、私の中ではbool型の実装に不具合があるのではという結論で落ち着きました。 このような形で締め切ってしまい申し訳ございません。わざわざ付き合っていただいてありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

> nxtDisplayTextLine関数があるので、正しい使い方かは分かりませんが、 そういう時には、Googleで関数名を検索するだけで、使用例がほぼ見つかります。 調べてみましょう。 >(int型の変数の表示はこの方法で正しく表示されるようです) 正しい書式に従った記載方法ではないと、検証自体の意味がなくなってしまいます。 > 参考までに、最終的にチェックに合格したプログラムです。whileループの方が実行されます。 プログラムの実行開始時には、音が既に鳴っている状態なのでしょうか。 作成者の意図した動作でない限り、プログラムは言語を問わず、バグを含んだ状態です。 それゆえのご質問かと思いますが、その辺りも、先生に問い合わせてみましょう。 それから、本筋からそれてしまいますが、このwhile文は、breakしませんね。 音が鳴っている・いないにかかわらず、PlayImmediateTone関数をwait10Msec(1)しながら、 永遠に呼びつづけることになりますが、それで良いのでしょうか? (音が鳴りっ放しになる?) ・音がなっていなかったら鳴らす ・音がなっていたらちょっと待つ のような制御をしたい、というわけではないのでしょうか? であれば、 while(true) {   if(bSoundActive) {   } else {   } } のような制御構造になると思うのです。

Lef_
質問者

補足

> nxtDisplayTextLine関数 使用例ではprintfと同様に%dなどを使用していますが、まだ見ていなかった当時は感で書いて「とりあえず動作するから」と安易に考えていました。 確かに、想定外の使い方であれば誤作動してもおかしくありませんね。 課題は「フローチャートに従ってプログラムを書け」というもので、できあがったプログラムは「超音波センサで障害物の距離(SensorValue(sonarSensor))を取得し、距離に応じた周波数のビープ音を鳴らす」というものでした。 ここでの if(bSoundActive) は、「サウンド機能が使用可能かどうか」を調べるものであると説明されていました。 何か不具合があってサウンド機能が使用できないときに、elseの方が実行されるという設計なのでしょう。 breakしないとのことですが、手動で停止させるまで繰り返すので、問題ありません。 このプログラムは正しく動作します。(だからこそチェックに合格したのです。) ただ、「bSoundActiveは果たして何を示す変数だったのか」、「==trueを省略できなかった理由は何か」という点に疑問が残ったので、質問させていただきました。

全文を見る
すると、全ての回答が全文表示されます。
  • hidebun
  • ベストアンサー率50% (92/181)
回答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)になっていたりしませんか?

Lef_
質問者

補足

ご回答ありがとうございます。 そうですね、今度ヘルプを見せて確認してみようと思います。 > 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

  • includeしたファイルに変数を持ち込むには?

    hoge.phpでセットした変数を、そのあとにincludeした別ファイルに持ち込むことは出来るのでしょうか? 以下のような処理がしたいと思っているのですが、この状態でhoge.phpを実行すると$a=NULLとして処理されてしまいます。 inc.php  <?php    if ($a=="値") {     //TRUE処理    } else {     //FALSE処理    }  ?> hoge.php  <?php   $a = "値";   include "./inc.php";  ?>

    • 締切済み
    • PHP
  • PHPでの変数の扱い方

    PHPで(1)、(2)共にtrueになります。 (1)、(2)についてどうしてこうなるのか簡単に解説してもらえませんか。 また(1)が正しく動作するようにするにはどう修正すればいいですか。 (1) $value=0; if($value == '-'){ print("true"); }else{ print("false"); } (2) $value='-'; if($value == 0){ print("true"); }else{ print("false"); }

    • ベストアンサー
    • PHP
  • Ajaxで変数が受け取れない

    function chk() { var up_file = false; httpObj = createXMLHttpRequest(displayData); if (httpObj) { httpObj.open("POST","file_chk.php",true); httpObj.setRequestHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8"); httpObj.send("chk=(ファイル名)"); } function displayData() { if ((httpObj.readyState == 4) && (httpObj.status == 200)) { if (httpObj.responseText == "true") { up_file = true; } } } alert(up_file); } } 以上のようなソースのJavaScriptプログラムがあります。Ajaxを使ったもので、phpのプログラムでファイルの有無を調べるというものです。 まず最初に有無の確認用の変数up_fileを設定し、phpを使ったAjaxで検査、Ajaxが作動すると関数displayData()が実行され、ファイルがあればup_fileの値を初期値falseからtrueへ上書きするというものです。 ところがファイルがちゃんとあるのにup_fileの中身はflaseのままなのです。ソースにalertを書いた場所でfalseが返ってきます。その前のスコープ内に入れると、Ajaxで問い合わせるので数回falseが出た後最終的にtrueになります。なのにその1つ後のスコープ内、つまり関数displayData()を抜けた大元の関数chk()内に置くとfalseになってしまうのです。trueにする時varを使ってないのでグローバル変数の書き換えすら可能なはずなのですが・・・。 なぜ変数up_fileの上書きが出来ないのでしょうか?

  • グローバル変数以外も変数は残り続ける?

    https://okwave.jp/qa/q9323518.html の続き var stoppingNow = false; がグローバル変数になっていないので仕様上はページ読み込み時に実行されて処理が終わった瞬間に この変数は削除されて使えなくなると聞いたのですが、 なぜかpauseBtnを押した後に、playBtnを押すと問題なく使えてしまいます。 グローバルにない変数は、stoppingNow = true;を実行してもそんな変数もうないとなるはずなのですよね? それともグローバルにない変数も残っていて、代入の処理よりも上、ないしは親のスコープにあれば使えるのが仕様なのですか? (function () { var stoppingNow = false; var pauseBtn = document.getElementById('js-pause-btn'); pauseBtn.addEventListener('click', function () { clearTimeout(it); stoppingNow = true; }); var playBtn = document.getElementById('js-play-btn'); playBtn.addEventListener('click', function () { if (stoppingNow === true) { iterative(); stoppingNow = false; } }); } myChange(); })();

  • php if問題について

    php の問題でどうしてこの答えになるかわかりません。 教えて下さい if(【 A 】) { print("true"); } else { print("false"); } 【1】"php" > "perl" 【2】0 != "0" 【3】5 - 6 + 1 【4】"false" 【5】0 + "false" 【6】"543a" < 56 【7】abs(-6) > 10 / 2 あなたの回答: 【2】【3】 正答: 【1】【4】【7】

    • ベストアンサー
    • PHP
  •  php if文について

    phpの問題をといていてどうしてもわからないので教えて下さい。 お願いいたします。 if(【 A 】) { print("true"); } else { print("false"); } 【1】"php" > "perl" 【2】0 != "0" 【3】5 - 6 + 1 【4】"false" 【5】0 + "false" 【6】"543a" < 56 【7】abs(-6) > 10 / 2 あなたの回答: 【1】【4】 正答: 【1】【4】【7】 回答が1,4,7なのかわかりません。 教えて下さい。

    • ベストアンサー
    • PHP
  • php問題について

    php の問題でどうしてこの答えになるかわかりません。 教えて下さい if(【 A 】) { print("true"); } else { print("false"); } 【1】"php" > "perl" 【2】0 != "0" 【3】5 - 6 + 1 【4】"false" 【5】0 + "false" 【6】"543a" < 56 【7】abs(-6) > 10 / 2 あなたの回答: 【2】【3】 正答: 【1】【4】【7】 どうして1がせいかいなのかわかりません。 教えて下さい

    • ベストアンサー
    • PHP
  • コマンドプロンプトで変数が数字であることを判定する方法

    コマンドプロンプトで変数の中身が数字であることを判定することは可能でしょうか。 変数の内容が0000や1020ならばTRUE、00A0なんかだとFALSEに するIF文を作りたいのです。

  • ISSETで変数に値が入っていないか確認するのですが

    ISSETで変数に値が入っていないか確認するのですが <? $a = ''; if (isset($a)) { echo "何か入っています。"; } else { echo "空っぽです。"; } ?> 上のコードで「何か入っています。」がエコーされてしまいます。issetは値が入っていなければFALSEを返すと思ったのですが違うようなのでちょっと混乱してしまったのですが、これがマニュアルに書いてある「NULL に設定されている変数を調べた場合、 isset() はFALSE を返します。 」、ということなのでしょうか?

    • ベストアンサー
    • PHP
  • issetで変数チェック

    php初心者です issetで変数の中に値が入っているか調べたいのですがphp5.4でフォームから文字列を送るとfalseになってしまいます。 文字列が入っているかチェックしたいのですがどうしたらいいでしょうか? if(isset($_POST['title'])&&$_POST['title']!=''){ $title = $_POST['title']; }else{ $title = ''; } よろしくお願いします

    • ベストアンサー
    • PHP