言語:C全般
環境:VC++ 2008 EE
3DCG:Softimage Mod Tool
ゲームプログラマー目指して勉強している者です。
現在 C++ 修得にむけて頑張っています。
Began study since 2009/8/21
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
2つの独立した動作を実現するためにどうやって入力待ちの状態を改善するかいろいろ考えたが、入力待ちの状態にする前に入力があるかどうか調べることができれば大変便利だということで、いろいろと探してみたらぴったりの関数がありました(ほかにもいろいろとあると思います)。
その名も kbhit です。
一応 ケービーヒット なんて発音してるんですがどうなんでしょうか?
こいつは標準入力ストリームにデータがあるかどうかを調べ、データがあれば 1 を、なければ 0 を返します。
こいつを使うには stdio.h か stdlib.h をインクルードしなければいけません。
使い方としては、
if(kbhit())
ch = getch();
などのように使います。
ではこの関数を使って改良したボールよけゲームをすぐにでも作ります。
前々から言っていた類似関数の説明をしていきます。
具体的には、putc , putchar , puts , getc , getch , getchar , gets , fgets , scanf です。
・putc(プットシー)
第一引数に指定した文字を第二引数で指定した出力ストリームに出力しま す。
putc('C', stdout);
重要なのは出力ストリームを指定できるということです。
基本的には fputc と同じです。
・putchar(プットチャー)
第一引数に指定された文字を標準出力ストリームに出力します。
putchar('C');
重要なのは、出力は標準出力ストリームにされるということです。
・puts(プットエス)
第一引数に指定された文字列へのポインタが指す文字列を標準出力ストリ ームに出力する。
puts("string");
最後は改行されます。
・getc(ゲットシー)
第一引数で指定された入力ストリームから文字を読み込みます。
getc(stdin);
これは入力ストリームを指定することができます。
基本的には fgetc と同じです。
・getch(ゲットシーエイチ)
標準入力ストリームからエコーなしで文字を読み込みます。
つまり文字を入力するごとに ENTER を押す必要はありません。
getch();
ENTER を押さずに文字を読み込む。
・getchar(ゲットチャー)
標準入力ストリームから文字を読み込みます。
getchar();
ENTER を押さないと読み込みが終了しません。
・gets(ゲットエス)
第一引数で指定したオブジェクトに標準入力ストリームから1行分の文字列 を読み込み、格納します。
char str[10];
gets(str);
ENTER を押して読み込みを終了したあと、改行文字を終端文字 \0 に変換 します。
また、この関数はバッファオーバーランを防ぐことができません。
fgets を用いることでバッファオーバーランの問題を防ぐことができる。
・fgets(エフゲットエス)
第一引数で読み込んだ文字列を格納するオブジェクトを指定。
第二引数で読み込める文字列のサイズを指定します。
第三引数で入力ストリームを指定します。
char str[20];
fgets(str, 20, stdin);
改行文字もサイズ内に含み、最後に終端文字 \0 を付与します。
ですので格納される改行文字を考慮したサイズ数にしなければいけませ ん。
サイズ以上の文字列を入力した場合、例えば今回の場合は、
20バイト以上文字列を入力した場合、それ以降に入力したものは入力ストリ ームに残ってしまいます。
20バイト以内なら入力ストリームには何も残りません。
・scanf(スキャンエフ)
第一引数には変換指定を指定します(複数可)。
第二引数には読み込んだものを格納するオブジェクトのアドレスを渡しま す。
scanf("%c", &ch1);
入力ストリームには改行文字が残ってしまう。
だが改行文字が残ってしまうことを回避する方法もある。
変換指定に代入を抑止するが読み込みは行う * を記入することで実現す る。
scanf("%c%*c", &ch1);
この場合一文字目は代入されるが、二文字目は読み込みは行われるが代 入はされない。
よって、入力ストリームには改行文字は残らないのである。
これを利用すれば、文字を読み込む場合でなくてもきちんと改行文字を消 費することができる。
なかなか長くなりましたが、今回は簡単に、かつ重要な部分をお届けできたかなと思います。
たまに入力待ちの状態にするために getchar() を呼び出したはいいものの、無視されたようになることがありますよね。
それは入力ストリームに改行文字が残ってしまっているためです。
改行文字が残らないようにするか、getchar()を2回呼んで1回目で改行文字を消費して2回目で入力待ちの状態を実現するという方法があります。
ちなみにまだまだ詳しい仕様がありますので、もっと知りたい方はご自分で調べてください。
ではまた今度。
えぇ~今回は(擬似)乱数を発生させる rand() 関数の説明をしようと思います。
この関数は精度が悪いらしいのですが、練習に使う分には十分です。
まずはこの関数を使うために stdlib.h をインクルードする必要があります。
#include <stdlib.h>
使い方は、まず rand() 関数内に組み込まれている 乱数の種 の値を設定してやらなければいけません。
それを実現するのが srand() 関数です。
srand() に何か適当な値を渡すことで 擬似乱数の発生系列 を設定できます。
例えば、何か適当な定数・・・・・・・まぁ 100 でも与えてみましょう。
そして rand() を呼び出した回数ごとに値を比較してみます。
僕の場合は、
1回目:365
2回目:1216
3回目:5415
4回目:16704
5回目:24504
となりました。
このプログラムを何度実行しても同じ結果になります。
なぜなら 乱数の種 の値が同じだからです。
乱数の発生系列が同じだから1回目、2回目に出る値もすべて同じになってしまいます。
それを改善するためのメジャーな方法が、現在時刻を取得してそれを与えるということです。
まずは、 time.h をインクルードする必要があります。
#include <time.h>
つぎに srand() に与える値に現在時刻を設定します。
srand(time(NULL));
こうすることによってプログラムを実行するたびに違う値を srand() に与えていますので、1回目、2回目に出る値も変わります。
#include <stdlib.h>
#include <time.h>
int main()
{
int i;
srand(time(NULL));
for(i = 0; i < 6; i++)
printf("%d回目:%d", i, rand());
return 0;
}
ようするに srand() を呼び出すのはプログラムの一番最初のみでよいのです。
何度も何度も種の値を変更する必要はありません。
わかってもらえたでしょうか?
ではまた今度。
プログラミング言語ではじめて作るプログラムとして定番な Hello World です。
とりあえず、C で当たり前のように使っていた stdio.h のような位置にいる(?)のが iostream です。
ちなみに iostream ではなく iostream.h(.cpp) のこともあるようです。
そして #include のあとには using namespace std がいるようです。
画面に出力する関数みたいなのが cout で、これ自体は標準出力ストリームをさすものです。
こいつに対象を流すためのものが挿入子(出力ストリーム演算子)である << です。
全体としてはこうなります。
cout << "Hello World\n"
逆に cin は標準入力ストリームをさしており、抽出子 >> というものを使い
cin >> x
というような感じになります。
疑問なのが char型 の変数に格納されたものを表示するときなのだが。
例えば、
char ch = 'C';
cout << ch;
とすれば C が表示されるが、もしこの文字の数値(アスキーコードによる)を表示させたい場合どうすればいいのか。
一応予想としては int にキャストすればいいのかなーとは思っているのですが・・・。
ちょっと試してみよう・・・・・・・・おぉ~予想通りの結果になった。
だがこれだといちいちキャストしないといけないのだろうか?
別に苦にはならないが、もしかしたら何か他の方法があるかもしれないのでとりあえずは様子見で。
ちなみに .cpp ファイルをコマンドプロンプトでコンパイルする場合は単純に cl ○○.cpp としても変な警告がでて気味が悪くなる。
実際には EHsc というオプションが必要だそうだ。
cl /EHsc ○○.cpp
気をつけないとコンパイルしようとしたときにもたつくことになる。
まだまだC++のさわりのさわりのさわりなので今後からはC++がメインになると思います。
ただ作品なんかや覚書ではまだ C のほうでやってないことなどが多すぎるので、そちらのカテゴリーは C がまだ占拠しそう。
ではまた今度。
はぁ~・・・・・。
マジでか。
こいつはめんどくさいぞ。
リカバリCDもなければWindowsインストールCDもないから回復コンソールすらできない。
0x00000024というのはファイルシステムのエラーもしくはHDDの故障が原因なのだが、思い当たることがなにもない。
しかもこのエラーときたらWindowsの起動もさせてくれないのだ。
お金だしてまでデータ残す必要なかったから仕方なく再セットアップすることに。
やっとこうして記事がかけるまでに回復した。
こんなときにさんざん思い知る事になるのだがやっぱりバックアップはとっておいてよかったな。
SONYの4GBUSBに貴重なファイルや利用しているソフトウェアのセットアップファイルなどのファイルをバックアップしていたおかげでかなり早く復活できた。
ということなので今後から記事を再開していきますのでよろしくお願いします。
目が死にそう・・・・・・・。