No.3ベストアンサー
- 回答日時:
関数へのポインタを使って、
///////////////////////////////////////////
typedef void ( * mfunc ) ( void ) ;
void func1();
void func2();
void func3();
mfunc pfunc = func1; /* デフォルト func1 */
int fin = 0; /* 1なら終了処理を行う */
while(1){
/* 押されたキーに応じて実行する関数を切り替える */
if( kbhit() ){
c = getch();
switch(c){
case 'p':
pfunc = func2; /* 関数へのポインタを付け替える */
break;
case 'q':
fin = 1; /* while を抜けて終了処理にすすむ */
break;
case 'r':
pfunc = func3; /* 関数へのポインタを付け替える */
break;
default:
pfunc = func1; /* 関数へのポインタを付け替える */
break;
}
}
if( fin ){
break; /* 終了処理に進む */
}
else{
pfunc(); /* 関数を実行する */
}
}
/* 終了処理 */
ほげほげ;
////////////////////////////////////////
こんなつくりなら、
> ・qを押せばCtrl+cとは違い、正常な手続きを持ってプログラムを終了する。
> ・押したキーに従い、while(1)文の中で呼び出される関数を変更する。
を満足できますよね。
ありがとうございます!
うまく実装することができました。
kbhitは自作しないとだめなのですね。。。
下記のサイトを参考にして作りました。
http://www.ie.u-ryukyu.ac.jp/viewvc/y05/j05058/e …
大変勉強になりました。ご回答してくださった皆さま本当にありがとうございました!
No.2
- 回答日時:
OSはなんでしょうか。
unix系の場合
1. ioctlを使ってgetchar等を入力待ちにさせない。
2. select を使って入力文字を確認してからgetcharする。
1 だとMSDOSでもできたような。
PC98時代は当然ハードスキャン、Windowsだと WndProcがキー等の
割り込みエントリーなのでそもそもwhile(1)で回す必要がない(回せない)
No.1
- 回答日時:
この手の処理はよくやりますので、私の場合ですが・・・
while(1)でなく、
int loopflag;
loopflag=0;
while(!loopflag){
if(/* q が押されたことを検出する処理*/){
loopflag=1;
}
}
などのように、無条件ループでなく、ループの終了条件を設定する方法は如何でしょうか?
ループ後に、loopflag の値によって、どの条件でループを抜けたかが判別できると思います。
素早いご回答ありがとうございます。
非常に参考になります。
なるほど教えていただいた方法で多彩な条件分岐ができそうです。
ところでqが押されたことを検出する処理というのはたとえばどのようなものがあるのでしょうか?
scanf等を使うとそこで止まってしまいます。
今調べていると、WindowsやJava等ではそのような関数が用意されているようなのですが、Linuxの標準関数でキー入力検出ができるの関数は用意されているのでしょうか?
TimeOut等を設定するのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
入力した文字列から母音だけを...
-
CをC++に訳して~
-
do-while文が禁止される理由
-
Delphiで・・・
-
ループを途中で抜けたいのですが。
-
break文でループを一気に抜ける...
-
Jump文について
-
初学者向け無限ループ検出ツー...
-
UWSCにてある一定の動作を無限...
-
ライントレース 変数の使い方...
-
For~Nextステートメントの終了...
-
while doについて
-
ループについて
-
c言語について
-
2÷3などの余りについて
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
信頼区間の1.96や1.65ってどこ...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
break文でループを一気に抜ける...
-
For文の終了値を関数にしても問...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
for文while文の無限ループの違...
-
C言語forループが完結した場合...
-
エクセルでC言語のfor文と同じ...
-
入力した数値を倍々するプログラム
-
Cプログラムが終了しない
-
n重のfor文にするには?
-
UWSCにてある一定の動作を無限...
-
PIC のプログラムについて ど...
-
Excel VBAで年度をまたぐ期間の...
-
アルゴリズムです!四つの数字...
-
Delphiで・・・
-
While文の終わりにセミコロンが...
-
ループの特定入力終了
-
For~Nextステートメントの終了...
おすすめ情報