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

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

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

#1

投稿記事 by きずなん » 13年前

今、簡単なアクションゲームを作っている途中です。

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は正しく座標が代入されてて使えます。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 13年前

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

きずなん

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

#3

投稿記事 by きずなん » 13年前

やりたいことは出来ました。(一応自己解決?)
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内のすべてのローカル関数で毎回書くのが嫌だからです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#4

投稿記事 by h2so5 » 13年前

きずなん さんが書きました: 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: 「マウスの位置座標を返す関数のアドレス」をポインタへ入れたい

#5

投稿記事 by きずなん » 13年前

ご丁寧にありがとうございます。

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

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#6

投稿記事 by h2so5 » 13年前

見栄え・・・ですか。
必要がないのに無闇にポインタを使うのはバグの素ですので、使い所を見極めたほうがよいです。

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

例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: 「マウスの位置座標を返す関数のアドレス」をポインタへ入れたい

#7

投稿記事 by きずなん » 13年前

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

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

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

閉鎖

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