ページ 11

「マウスの位置座標を返す関数のアドレス」をポインタへ入れたい

Posted: 2013年1月13日(日) 13:39
by きずなん
今、簡単なアクションゲームを作っている途中です。

Player.cpp内でマウスの位置を自由に扱えるように、以下のように書いています。

コード:

typedef struct mouse{
	int x,y;
} Mouse;
Mouse wk,*pt;		//マウス操作用のグローバル変数

// マウスの状態を取得
Mouse *Mouse_Get(){
	static int P;
	Mouse 
	P = GetMouseInput();		//マウス入力の獲得
	GetMousePoint( &wk.x, &wk.y );	//マウスの位置を入れる
	return &wk;
}
	pt = Mouse_Get();
こうすることにより、pt->x、pt->yと書くだけでマウスの位置を扱えるようにしたいのですが、
どうしてもできません。このコードで実行するとエラーが起きます。何がおかしいんでしょうか。

ちなみにMouse_Get()->x、Mouse_Get()->yは正しく座標が代入されてて使えます。

Re: 「マウスの位置座標を返す関数のアドレス」をポインタへ入れたい

Posted: 2013年1月13日(日) 13:55
by h2so5
9行目と14行目がC言語の文法としておかしいです。
あと変数Pはなんの意味があるんでしょうか。
wkはグローバル変数でどこからでもアクセスできるわけですから、Mouse_Get()でアドレスを返す意味がよくわかりません。

Re: 「マウスの位置座標を返す関数のアドレス」をポインタへ入れたい

Posted: 2013年1月13日(日) 14:10
by きずなん
やりたいことは出来ました。(一応自己解決?)
14行目をPlayer.cppの初期化関数内に移すことで解決でした。


返信ありがとうございます。

>9行目と14行目がC言語の文法としておかしいです。
9行目は移植ミスでした。すいません。
14行目については具体的に何がおかしいのか知りたいです。
どの関数にも属してないのに代入(アドレス指定)している点ですか?
それともMouse_Getはポインタなのに代入時にpt = &Mouse_Getとしていないところですか?

>あと変数Pはなんの意味があるんでしょうか。
エラー発生時用に一応書いてあるだけです。

>wkはグローバル変数でどこからでもアクセスできるわけですから、Mouse_Get()でアドレスを返す意味がよくわかりません。
GetMouseInput();
GetMousePoint( &(wk.x), &(wk.y) );
この2行をPlayer.cpp内のすべてのローカル関数で毎回書くのが嫌だからです。

Re: 「マウスの位置座標を返す関数のアドレス」をポインタへ入れたい

Posted: 2013年1月13日(日) 14:26
by h2so5
きずなん さんが書きました: 14行目については具体的に何がおかしいのか知りたいです。
どの関数にも属してないのに代入(アドレス指定)している点ですか?
それともMouse_Getはポインタなのに代入時にpt = &Mouse_Getとしていないところですか?
関数の外で関数の呼び出し及び代入をしているというところです。
きずなん さんが書きました: >wkはグローバル変数でどこからでもアクセスできるわけですから、Mouse_Get()でアドレスを返す意味がよくわかりません。
GetMouseInput();
GetMousePoint( &(wk.x), &(wk.y) );
この2行をPlayer.cpp内のすべてのローカル関数で毎回書くのが嫌だからです。
グローバル変数やポインタを使う理由がわかりません。これではダメなんでしょうか。

コード:

typedef struct {
	int x,y;
} Mouse;
 
// マウスの状態を取得
Mouse Mouse_Get() {
	Mouse wk;
	GetMousePoint( &wk.x, &wk.y );  //マウスの位置を入れる
	return wk;
}

int main() {
	Mouse pt = Mouse_Get();
	return 0;
}

Re: 「マウスの位置座標を返す関数のアドレス」をポインタへ入れたい

Posted: 2013年1月13日(日) 14:41
by きずなん
ご丁寧にありがとうございます。

>関数の外で関数の呼び出し及び代入をしているというところです。
ですよね。すいません。これをちゃんと関数に入れてなかったためエラーが起きてました。

>グローバル変数やポインタを使う理由がわかりません。
確かにグローバル変数にする意味は皆無でした。意味不明なことしててすいません。
ポインタに関してですが、
見栄え的にアロー演算子は見やすいのでどうしても使いたかったということが最大の理由です・・・

Re: 「マウスの位置座標を返す関数のアドレス」をポインタへ入れたい

Posted: 2013年1月13日(日) 15:06
by h2so5
見栄え・・・ですか。
必要がないのに無闇にポインタを使うのはバグの素ですので、使い所を見極めたほうがよいです。

ポインタを使わないと構造体のコピーが発生するので、そのオーバーヘッドが気になるなら使っても良いと思います。
今回の場合はそんなに必要性はないですが。

例1)

コード:

typedef struct {
    int x,y;
} Mouse;
 
// マウスの状態を取得
Mouse *Mouse_Get() {
    static Mouse wk;
    GetMousePoint( &wk.x, &wk.y );  //マウスの位置を入れる
    return &wk;
}
 
int main() {
    Mouse *pt = Mouse_Get();
    return 0;
}
例2)

コード:

typedef struct {
    int x,y;
} Mouse;
 
// マウスの状態を取得
void Mouse_Get(Mouse *wk) {
    GetMousePoint( &wk->x, &wk->y );  //マウスの位置を入れる
}
 
int main() {
    Mouse pt;
    Mouse_Get(&pt);
    return 0;
}

Re: 「マウスの位置座標を返す関数のアドレス」をポインタへ入れたい

Posted: 2013年1月13日(日) 16:08
by きずなん
返信ありがとうございます。

ハイ、今回のような小さいプログラムならまだしも大きくなってくるとよく考えないといけませんね。
コードのご掲示も丁寧にしてくださり、とても助かりました。

ありがとうございました。