DXライブラリ GetHitKey関数の疑問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
safari

DXライブラリ GetHitKey関数の疑問

#1

投稿記事 by safari » 6年前

こんにちは
最近よりこのサイトを利用させていただいておりますC言語初心者です
どうしても分からない疑問があったので質問させてください

DXライブラリにキーボードの押下状態を調べるGetHitKeyStateAll関数と言うものがありますが
その関数の宣言は    
int GetHitKeyStateAll( char *KeyStateBuf ) ;
となっており、使い方はchar型の要素数256の配列を引数として放り込むのだそうですが
ここが引っかかりました

256という数字は多分、取得するキーの数だと思うのですが
なぜchar型なのかというのが分かりません
押下状態は1と0で判断できると思っていましたし、
char Keybuf[256];
GetHitKeyStateAll( KeyBuf ) ;
if( KeyBuf[ KEY_INPUT_C ] == 1 )
上の公式関数リファレンスではこのように数字の比較方法を使用しておりましたので
余計になぜchar型なのかが気になりました

どうか私に皆様のお知恵をお貸しください

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリ GetHitKey関数の疑問

#2

投稿記事 by みけCAT » 6年前

safari さんが書きました:押下状態は1と0で判断できると思っていましたし、
リファレンスにもそう書いてありますね。

char型とは、(環境にもよりますが、代表的な環境では)8ビット整数です。
1か0しか入れないのに、4バイトのint型や8バイトのlong long型、2バイトのshort型を使用するにはもったいないですよね。
また、1バイトに8個のキーの情報を詰め込めばメモリの使用量は少なくてすみますが、
「何バイト目か」の情報と「何ビット目か」の情報の両方を使用しないとある特定のキーの情報にアクセスできないため
キーを定数で指定しにくくなり、ライブラリの利便性が下がります。
また、わずかかもしれませんがビット演算の手間もあります。
情報取得関数を用意しても、それを呼び出す手間がかかります。
よって、メモリの効率と計算の手間の効率をある程度両立したchar型を採用したと考えられます。

次に独自の型をtypedefなどで作るというケースを考えますが、
DXライブラリでは画像のハンドル、音声のハンドルなどのハンドルを普通のint型で処理しています。
ソースコードの可読性の面ではtypedefを使用して独自の型にしたほうがいいと考えられるのに、です。
ここから、DXライブラリではなるべく基本型をtypedefしない方針であると考えられます。
よって、typedefするより生のchar型を使用したと考えられます。

また、unsigned char型でもメモリの効率と計算の手間の効率は変わらないと考えられます。
しかし、1か0しか入れないのなら、char型でもunsigned char型でもほとんど変わりません。
ならば、文字数の少ないchar型を使用する方が合理的であると考えられます。

長々と述べましたが、最後に、これはあくまでも自分の推理です。
正確なことが知りたければ、ぜひDXライブラリの作者に問い合わせてみてください。
マルチポストする際は相互リンクをお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

safari

Re: DXライブラリ GetHitKey関数の疑問

#3

投稿記事 by safari » 6年前

なるほど
私、漢字を扱うchar型の方がメモリ使用率は高いと思っていましたので
その辺り勘違いしておりました
おかげですっきりしました
初心者の質問にお付き合いいただきありがとうございました

KORYUOH
記事: 44
登録日時: 7年前

Re: DXライブラリ GetHitKey関数の疑問

#4

投稿記事 by KORYUOH » 6年前

少し勘違いされているようですが、
漢字は2byte文字なのでchar型にははいりませんよ

char型は1byteなので漢字一文字格納するのには配列にするか、大きいサイズのものを使用するしかありません。
C言語を使うと自分の足を誤って撃ち抜いてしまうことがある。 C++を使えばそのような間違いを犯しにくくなる。しかし、やってしまったときには足全体が無くなる。

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: DXライブラリ GetHitKey関数の疑問

#5

投稿記事 by みけCAT » 6年前

KORYUOH さんが書きました:少し勘違いされているようですが、
漢字は2byte文字なのでchar型にははいりませんよ
漢字はマルチバイト文字ですが、2バイトとは限りません。
例えば、Googleで「三毛猫」と検索すると、URIのこのクエリを表す部分は「q=%E4%B8%89%E6%AF%9B%E7%8C%AB」
となっていて、1文字あたり3バイト使っていることがわかります。
KORYUOH さんが書きました:char型は1byteなので漢字一文字格納するのには配列にするか、大きいサイズのものを使用するしかありません。
C言語/C++なら多分正しいと思います(環境依存)。Javaのchar型は2バイトだったと思います。
safari さんが書きました:漢字を扱うchar型
例えば整数の多倍長計算をするとき、unsigned int型の配列で数値を扱うことがあります。
よって、char型で漢字を扱うことは問題ないと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る