dポイントプレゼントキャンペーン実施中!

Linuxのgccでのプログラミングで、キーボードのどのキーが押されたのかを変数に代入したりして取得したりすることはできないでしょうか?


例えば、while分で永久ループを作っておいて、

while(1)
{

if(aのキーが押されている場合)
printf("A key is pushing!")
elseif(sのキーが押されている場合)
printf("B key is pushing!")
elseif(dのキーが押されている場合)
printf("D key is pushing!")
・・・

}

このようなプログラムを作ることはできないでしょうか?
どうぞ、ご教授の程よろしくお願い致します。

A 回答 (6件)

できますが、かなり面倒です。


termiosやncursesなんかを調べて見るといいかも。

この回答への補足

お世話になっております。
現在、Ubuntu Linuxのgccを使っており、curuses.hを試しているのですが、次のようなエラーが出てきます。


root@ubuntu:~/20140411# gcc -o test_getchar test_getchar.c
test_getchar.c:3:21: fatal error: curses .h: No such file or directory
#include <curses .h>
^
compilation terminated.


これはどのようなエラーなのか教えて頂けませんでしょうか?
curses.hというのが使えないと言うことでしょうか?
どうぞ、ご教示頂きますようお願い致します。

補足日時:2014/04/30 12:38
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。

#1の方に教えて頂いたプログラムをやってみたのですが、

このgetchar()関数ですが、何か文字を入力してからエンターキーが押されないと、cの変数に値が代入されないようですが、例えば1文字入れたら、自動的にエンターキーを入力するようにすることはできないでしょうか?

また、数秒たったら、自動的にcに値を代入して、次のステップに自動的に進むようにするようなことはできないのでしょうか?


今回教えて頂いたncursesというのでがありますが、

http://taichino.com/programming/1925
こちらのサイトに載っている



// キー入力する場合は以下
keypad(stdscr, true);
wtimeout(stdscr, 100); // 100ミリ秒でgetchがタイムアウト


このような関数が使えれば、エンターキーを押さなくても定期的なキーの値の取得ができると言うことなのでしょうか?




すみませんが、どうぞよろしくお願い致します。

お礼日時:2014/04/30 09:16

簡単にはこんな感じで。



#include <stdio.h>
main(){
int c;
system("stty -icanon -echo");
while(1){
c = getchar();
if(c < ' ') break; /* 制御文字がキーインされたら終了 */
printf("%c key is pushed\r\n",c);
}
system("stty icanon echo");
}
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。
実際にこの方法をやってみました。これだとエンターキーを入れる必要がないのが確かに便利なことがわかりました。ただ、何もキーが入力されないとgetchar()でペンディング状態になるのと、IO入力のようなON/OFFの使い方はできないということも実感したのですが、ちょっとしたトグル入力などはなかなか使えるような気がしました。

いまこのような感じでコードを使わせてもらってます。
http://sourceforge.jp/projects/cc1101driver/scm/ …

お礼日時:2014/05/09 20:02

基本的には割り込みプロセスなので


http://sourceforge.jp/projects/linux-kernel-docs …ハードウェア割り込み処理
此れを改造すれば実現可能と考えます。

割り込みが発生した時にフラグを立てメインプロセスからサブプロセスにジャンプしています。
尚その際には16進データをASCIIに変換するテーブルを参照して表示しました。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。
いつかはハードウェア割り込み処理とか、カーネルとかハード制御に関わるプログラミングとかカーネルビルドも見ていきたいと思っています。いろいろと険しそうな感じはしていますががんばりたいと思います。

お礼日時:2014/05/09 20:09

>このgetchar()関数ですが、何か文字を入力してからエンターキーが押されないと、cの変数に値が代入されないようですが、例えば1文字入れたら、自動的にエンターキーを入力するようにすることはできないでしょうか?



自動でエンターキーを入力するような事はできません(私が知らないだけという可能性はあります)。
また、#3の方もおっしゃっていますがgetchar()は標準入力からの入力なので、その入力がキーボードとは限りません。

>また、数秒たったら、自動的にcに値を代入して、次のステップに自動的に進むようにするようなことはできないのでしょうか?

どういう事をやりたいのかよくわかりません。
「自動的に」とはどういう事ですか?
コードを書かなくてもプログラム側で勝手に判断してやって欲しいという事ですか?

>このような関数が使えれば、エンターキーを押さなくても定期的なキーの値の取得ができると言うことなのでしょうか?

引用されてたヶ所は、何らかのキーが入力されていなくてもgetch()を呼び出してから100ミリ秒後にはタイムアウトして値を返すための設定ですけど(getch()はncursesが提供している関数)。
もしそれをncursesを使わずに行いたいということであれば先にもあげたtermiosを調べてみてください。


>これはどのようなエラーなのか教えて頂けませんでしょうか?

メッセージに書かれていますけど?

英文読む気がない。
辞書を引きたくない。
英文読んでもわからないと諦めてる。
読んでみたが何の事かわからない。
その他。

どれでしょう?
もし最初の3つのどれかなら英文読む努力くらいはしてください。

curses.h と書く所を curses .h と書いてしまってるのが原因ではあるんでしょうが。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。まだcursesやってないのですが、とりあえずという感じで擬似的なIO入力で逃げるようなことやってみました。

お礼日時:2014/05/09 20:07

標準入力はリダイレクトされている可能性があるから使えないんですよ>#1.

    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。リダイレクトという言葉がアルのですね。普通の使い方ではないですね。

お礼日時:2014/05/09 20:05

http://web-ext.u-aizu.ac.jp/~jpshin/global/sccp_ …

#include<stdio.h>

main(){

int c; /* キーボードから受け取った文字を入れておく変数 */

c = getchar(); /* キーボードから1文字だけ受け取る */

printf("c = %c \n", c); /* [%c]を使って文字を表示 */
printf("c = %d \n", c); /* [%d]を使って、文字を数値として表示できる */

}

こういうのが載っていました。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。

このgetchar()関数ですが、何か文字を入力してからエンターキーが押されないと、cの変数に値が代入されないようですが、例えば1文字入れたら、自動的にエンターキーを入力するようにすることはできないでしょうか?

また、数秒たったら、自動的にcに値を代入して、次のステップに自動的に進むようにするようなことはできないのでしょうか?

すみませんが、どうぞよろしくお願い致します。

お礼日時:2014/04/30 09:13

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