ページ 11

キーを使えるようにする。

Posted: 2019年10月26日(土) 20:30
by roji
複数のプログラムでキーを入力するのですが、メインのプログラムに以下のプログラムを書きました。

コード:

int Key[256];

int gpUpdateKey()
{
	char tmpKey[256];
	GetHitKeyStateAll(tmpKey);
	for (int i = 0; i < 256; i++)
		(tmpKey[i] == 0) ? (Key[i] = 0) : Key[i]++;
	return 0;
}
そして、メインプログラム以外のプログラムにvoid Player_Update()という関数を作り
そこに

コード:

int Key[256];

int gpUpdateKey()
{
	char tmpKey[256];
	GetHitKeyStateAll(tmpKey);
	for (int i = 0; i < 256; i++)
		(tmpKey[i] == 0) ? (Key[i] = 0) : Key[i]++;
	return 0;
}
と書きたいですが二重の定義になるので、

コード:

Key[256];gpUpdateKey();
と書いたのですが、エラーが出ます。
二重定義にならないようにどう書けばいいでしょうか。

Re: キーを使えるようにする。

Posted: 2019年10月26日(土) 21:19
by みけCAT
roji さんが書きました:
4年前
そして、メインプログラム以外のプログラムにvoid Player_Update()という関数を作り
そこに

コード:

int Key[256];

int gpUpdateKey()
{
	char tmpKey[256];
	GetHitKeyStateAll(tmpKey);
	for (int i = 0; i < 256; i++)
		(tmpKey[i] == 0) ? (Key[i] = 0) : Key[i]++;
	return 0;
}
と書きたいですが
The XY Problemの疑いがあります。
なぜそのように書きたいのですか?

Re: キーを使えるようにする。

Posted: 2019年10月26日(土) 22:19
by roji
キー入力を行いたいためです。

Re: キーを使えるようにする。

Posted: 2019年10月27日(日) 01:54
by みけCAT

コード:

extern int Key[256];
と書くと良さそうな気がします。

Re: キーを使えるようにする。

Posted: 2019年10月27日(日) 05:34
by roji
どうもありがとうございます。
解決できました。
もう一つ、こちらのヘッダファイルのプログラムhttps://pastebin.com/LMYV3Ph6に関して質問があります。
初期化をするためにinit_stage(); // stage, pos の初期化と書いたのですが、赤い下線部が発生しエラーになります。
関数定義が見つからないと言っているのですが、なぜvoid init_stage()を書いているのにエラーが出るのでしょうか。

Re: キーを使えるようにする。

Posted: 2019年10月27日(日) 17:26
by みけCAT
C++ではこのように式文を関数定義の外に書くことはできないからです。

コード:

init_stage(); // stage, pos の初期化
を関数定義の本体の中に入れるなどの修正方法が考えられます。

Re: キーを使えるようにする。

Posted: 2019年10月27日(日) 20:48
by あたっしゅ

コード:

init_stage(); // stage, pos の初期化
を、コンパイラが、関数 int init_stage() の定義をしているのだろうと、認識しているからです。

 一つの方法として、void init_stage() の本体があるソースで呼び出すのではなく、

コード:

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){

    // DxLib の初期化等(略)

    init_stage();
    
    // (略)
}
という風に、呼び出してください。

extern void init_stage();

を忘れずに。

Re: キーを使えるようにする。

Posted: 2019年10月28日(月) 00:36
by roji
みけさん、あたっしゅさんありがとうございます。
関数の中にinit_stage();を書いたところ解決しました。