- ベストアンサー
whileの途中で手続きを変化するプログラム
表題の件について質問させていただきます。 while(1)を含むプログラムを走らせている途中で何かしら入力するとそれに伴って処理を変更するプログラムを作成したいと思います。 具体的には ・qを押せばCtrl+cとは違い、正常な手続きを持ってプログラムを終了する。 ・押したキーに従い、while(1)文の中で呼び出される関数を変更する。 といったことを行いたいです。 このようなことは可能なのでしょうか? ご指導をお願いいたします。
- みんなの回答 (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)文の中で呼び出される関数を変更する。 を満足できますよね。
その他の回答 (2)
- eroermine
- ベストアンサー率18% (83/444)
OSはなんでしょうか。 unix系の場合 1. ioctlを使ってgetchar等を入力待ちにさせない。 2. select を使って入力文字を確認してからgetcharする。 1 だとMSDOSでもできたような。 PC98時代は当然ハードスキャン、Windowsだと WndProcがキー等の 割り込みエントリーなのでそもそもwhile(1)で回す必要がない(回せない)
お礼
ご回答ありがとうございます。 私の環境はUNIXです。 キー入力を自動感知する標準関数がよういされていればいいのですが・・・
- hisa1972
- ベストアンサー率53% (268/500)
この手の処理はよくやりますので、私の場合ですが・・・ while(1)でなく、 int loopflag; loopflag=0; while(!loopflag){ if(/* q が押されたことを検出する処理*/){ loopflag=1; } } などのように、無条件ループでなく、ループの終了条件を設定する方法は如何でしょうか? ループ後に、loopflag の値によって、どの条件でループを抜けたかが判別できると思います。
お礼
素早いご回答ありがとうございます。 非常に参考になります。 なるほど教えていただいた方法で多彩な条件分岐ができそうです。 ところでqが押されたことを検出する処理というのはたとえばどのようなものがあるのでしょうか? scanf等を使うとそこで止まってしまいます。 今調べていると、WindowsやJava等ではそのような関数が用意されているようなのですが、Linuxの標準関数でキー入力検出ができるの関数は用意されているのでしょうか? TimeOut等を設定するのでしょうか?
お礼
ありがとうございます! うまく実装することができました。 kbhitは自作しないとだめなのですね。。。 下記のサイトを参考にして作りました。 http://www.ie.u-ryukyu.ac.jp/viewvc/y05/j05058/exercise7.4/kbhit.c?revision=1.1.1.1&view=markup 大変勉強になりました。ご回答してくださった皆さま本当にありがとうございました!