• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:スロットルマシンぽいモノを作ろうとがんばってみましたが、)

スロットルマシンぽいモノを作ろうとがんばってみましたが、止めた後、また動かす方法がわかりません。

このQ&Aのポイント
  • スロットルマシンぽいモノを作ろうとがんばってみましたが、止めた後、また動かす方法がわかりません。
  • kbhit()関数の使い方がわるいのでしょうか?
  • なにとぞお知恵をお貸しください。

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

  • ベストアンサー
回答No.3

 kbhit()関数はキーバッファに入力があったかどうかを調べる関数です。  キーバッファの中を取り出したリはしないので、別途、getch()等でキーバッファの中身を取り出さないと、キー入力が残ったままになり、再度起動した場合もキー入力を検出します。  つまり、このプログラムではキーバッファは残ったままになるので、一度キー入力があれば、kbhit()はずっとキー入力を検出したままになるので、printf()の部分は永遠に実行されなくなります。  kbhit()の有無で動作の開始・停止を判断するのではなく、kbhit()をトリガーにトグルのフラグを設定し、フラグの値で開始・停止を判断させるようにすれば良いのではないでしょうか。もちろん、kbhit()でキー入力を検出したときは必ずキーバッファを読み出して空にするようにします。 int main(void) { int i,a; char sev1[] = "0123456789"; char sev2[] = "4567890123"; char sev3[] = "7890123456"; char num[] = "000"; int flag = 0; system("cls"); for(i=0;i<=10;i++){ timer(100000000); if(i==10){ i=0; } num[0]=sev1[i]; num[1]=sev2[i]; num[2]=sev3[i]; if(kbhit()){ flag ^= 1; while (kbhit()) { getch(); } } if (flag == 0) { printf("%c%c%c\r",num[0],num[1],num[2]); } } return 0; }

ForceFeed
質問者

お礼

if(kbhit()){ flag ^= 1; while (kbhit()) { getch(); ------------------------- kbhit();を二蓮ちゃんで使うんですね。 こういったプログラムの発想がぜんぜん浮かんできませんでした。 あと、今まで自分で作ってきたプログラムにビット演算子なんて使ったことがなくって、 何かすごい感動しちゃってます。 排他的論理和(XOR)って、2進数なら00は0で11は0で01と10は1ってらしいんですけど、 flag ^= 1;のところは、反転で0(空)にするって事でいいんでしょうか? 何か変な質問しちゃってすません。

その他の回答 (2)

回答No.2

/* kbhit() は標準入力のバッファー内にキーの値が残っていると 0 以外の値を返します。つまり再始動するには、バッファー内を空にして、kbhit() が 0 を返すようにすることが必要です。そのためには getch() で読み込ませます。 */ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main(void) { int flag = 1; /* 状態変更用のフラッグ */ while(1){ if(kbhit()){ getch(); /* バッファー内のキーを除去する */ flag = !flag; /* フラッグをトグルさせる */ } if(flag){ printf("running\r"); }else{ printf("waiting\r"); } } return 0; }

ForceFeed
質問者

お礼

kbhit()関数はもとよりgetch()関数の使い方など、いろいろテストして身に着けたいと思います。 ありがとうございます。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

#include <stdio.h> #include <stdlib.h> #include <conio.h> <>が全角であるため、コンパイルできません。 なぜ、「わざわざ」全角で書いたのでしょうか? 手元のソースコードを「そのまま」コピー&ペーストすればよいものを…。 これがために、そのソースの他の箇所が「本当に」手元にあるものと 同じかどうか、疑わしくなってしまっています。

ForceFeed
質問者

補足

以前、はじかれたので。 &lt;< &gt;> を使った特殊文字書くの邪魔くさかったので、大文字で書いてしまいました。

関連するQ&A