標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第607回]

●C++プログラムの訂正

前回お見せしました、getch()の動作をチェックするための簡単なC++プログラムなのですが、UPした後で、自宅に帰りましてから入浴しておりましたら、突然にプログラムにまずいところがあることに気がつきました。
なんでも、かのアルキメデス様も入浴中にアルキメデスの原理を思いつかれたと、巷間伝えられておりますですね。
睡眠と入浴は脳の活性化に有益であろうかと思います。

いえ。間違いではありません。
ただ、無駄なことをしている、と申しますか、はっきり言ってみっともないプログラムだということです。
前回は、「getch()の働きを確認するために、簡単なプログラムを作りました」と、いかにもその場で作ったようなことを書きましたが、実はウソでありまして、たまたま以前にリモートプログラムのキー入力部分を作るために、いろいろテストしたときのプログラムをみつけたので、それをちょいと利用したのでした。

ですので、そのときのテストの必要から余計なことが書いてあったのですけれど、それをそのままUPしてしまいました。
でも、そのとき心の隅にちらりと引っかかったのでしょうね。
うう。どこかがおかしいのではないの?

それが、お風呂にどっぷりつかって、リラックスした途端にふわぁと浮かび上がってきたのでしょう。
前回お見せしましたプログラムはこういうものでした。

// kbhit test
#include <stdio.h>
#include<conio.h>
//
void main()
{
	int c;
	while(1)
	{
	if(kbhit())
		{
		c=getch();
		printf("c=%x,",c);
		if (c==3){printf("break");break;}
		}
	}
}
//end

C++に詳しいお方でしたら、すぐにお気づきかと思います。
if (c==3)…の行がおかしい、といいますか、全く無駄、なのでした。
ここは、[Ctrl][C]の入力によってプログラムを強制終了するための文です。
[Ctrl][C]のキーコードは、0x03です。

ところが、実はkbhit()は[Ctrl][C]を入力すると、勝手にブレイクしてしまうのです。
これはこれで、なかなかに困ったものなのです。
そういう勝手なことはやらないでほしいなあ、と言いたいところです。
おかげで、[Ctrl][C]の入力による終了手続きがうまくできません。
それはともかく、そういうことなので、そのあとでキーコードをチェックしてブレイクするという文を書いても、これはもう全くムダということになります。

実際の実行画面でそのことをご説明いたします。

キーボードから、[1][2][3]と入力したあとで、[Ctrl][C]の入力でブレイクしたところなのですが…。
良く見ていただきますと、”break”の文字は表示されておりません。
つまり、if(c==3)の文よりも前にブレイクしてしまっているのです。

そういうことなら、無駄なので、ここは削除してしまいましょう、ということで、下のようにしてしまいました。

// kbhit test
//10/6/12 9/11
#include <stdio.h>
#include<conio.h>
//
void main()
{
	int c;
	while(1)
	{
	if(kbhit())
		{
		c=getch();
		printf("c=%x,",c);
		}
	}
}
//end

コンパイルして、実行してみました。

ムダな行を削除したのですから、当然削除しても、さきほどと同じ結果になります。

ムダと言えば、そもそもkbhit()がムダなのではないか、とお考えのむきもあろうかと思います。
これには理由があるのです。
いきなりgetch()を使いますと、そこでキー入力待ちになって、キー入力しない限りは、そこから先に進んではくれません。
それでは困るのですよねえ。
なにしろその間にUSB経由でND80ZVから表示データとかSAVEデータとかが送られてくるかもしれないのですから。
そこで、まずkbhit()でキーが押されたかどうかをチェックして、キーが押されたときだけ、あらためてgetch()を実行する、ということを考えたのです。
このプログラムは、それがうまく働くかどうかを検証するために作ったものだったのです。

そういう目的のためには、kbhit()が必要なのですが、今回の目的は、CapsLockが正しく働いているのかどうかを確認するためだけのものだったわけですから、それならば、ここでkbhit()を使う意味はありません。

そこで、今度はkbhit()を削除してしまうことにしました。
しかしそうすると、今度はさきほど削除してしまった if(c==3)の文は復活させなければいけません。
なぜなら、getch()は[Ctrl][C]が入力されても、勝手にブレイクしたりはしませんから(おお。本来そうあって欲しいものですよねえ)。

// getch test
//10/6/12 9/11
#include <stdio.h>
#include<conio.h>
//
void main()
{
	int c;
	while(1)
	{
		c=getch();
		printf("c=%x,",c);
		if (c==3){printf("break");break;}
	}
}
//end

コンパイルして実行してみました。

今度は、”break”と表示してから、ブレイクいたしました。

2010.9.11upload

前へ
次へ
ホームページトップへ戻る