幼稚園時代「何組」でしたか?

表題の件について質問させていただきます。

while(1)を含むプログラムを走らせている途中で何かしら入力するとそれに伴って処理を変更するプログラムを作成したいと思います。

具体的には
・qを押せばCtrl+cとは違い、正常な手続きを持ってプログラムを終了する。

・押したキーに従い、while(1)文の中で呼び出される関数を変更する。

といったことを行いたいです。
このようなことは可能なのでしょうか?
ご指導をお願いいたします。

A 回答 (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)文の中で呼び出される関数を変更する。

を満足できますよね。
    • good
    • 0
この回答へのお礼

ありがとうございます!

うまく実装することができました。
kbhitは自作しないとだめなのですね。。。
下記のサイトを参考にして作りました。
http://www.ie.u-ryukyu.ac.jp/viewvc/y05/j05058/e …
大変勉強になりました。ご回答してくださった皆さま本当にありがとうございました!

お礼日時:2008/10/24 04:40

OSはなんでしょうか。


unix系の場合
1. ioctlを使ってgetchar等を入力待ちにさせない。
2. select を使って入力文字を確認してからgetcharする。

1 だとMSDOSでもできたような。
PC98時代は当然ハードスキャン、Windowsだと WndProcがキー等の
割り込みエントリーなのでそもそもwhile(1)で回す必要がない(回せない)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
私の環境はUNIXです。
キー入力を自動感知する標準関数がよういされていればいいのですが・・・

お礼日時:2008/10/24 04:41

この手の処理はよくやりますので、私の場合ですが・・・



while(1)でなく、

int loopflag;
loopflag=0;
while(!loopflag){
if(/* q が押されたことを検出する処理*/){
loopflag=1;
}
}

などのように、無条件ループでなく、ループの終了条件を設定する方法は如何でしょうか?
ループ後に、loopflag の値によって、どの条件でループを抜けたかが判別できると思います。
    • good
    • 0
この回答へのお礼

素早いご回答ありがとうございます。
非常に参考になります。
なるほど教えていただいた方法で多彩な条件分岐ができそうです。

ところでqが押されたことを検出する処理というのはたとえばどのようなものがあるのでしょうか?
scanf等を使うとそこで止まってしまいます。
今調べていると、WindowsやJava等ではそのような関数が用意されているようなのですが、Linuxの標準関数でキー入力検出ができるの関数は用意されているのでしょうか?
TimeOut等を設定するのでしょうか?

お礼日時:2008/10/23 22:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!