ページ 11

ファイル内のグローバル変数の参照の仕方について

Posted: 2013年4月18日(木) 17:19
by とっしー
こんにちは
早速ですが質問させていただきます。

http://dixq.net/g/d_03.html
こちらのページで
>static と付けてグローバル変数を定義すると、そのファイル内でのみ使用出来るグローバル変数になります。
とあります。
そのようにして定義したファイル内のグローバル変数を他のファイルで参照にするにはどうしたら良いのでしょうか?

具体的にはplayerのファイルで定義したプレイヤーに関する値を持つ構造体、
static Player_t m_Player[NUM];
を他のファイルで参照にしたく思っています。

以上よろしくお願いします。

Re: ファイル内のグローバル変数の参照の仕方について

Posted: 2013年4月18日(木) 17:31
by softya(ソフト屋)
staticにワザワザしてあるので参照可能にするのは、プログラムコード的には悪い設計となります。
つまり、グローバル参照可能で書き換え可能な状態は、あちこちで使うことで修正時の手間が増え、書き換えの場所が多いことからバグの原因となり、バグの原因を掴みづらくする悪い事なのです。

staticを外しcppではPlayer_t m_Player[NUM];と書いておきヘッダファイルにextern Player_t m_Player[NUM];と記述すればグローバル変数となり、何処からでも参照と書き換えが可能となります。ただし、先にも行った通り良くない設計です。

Re: ファイル内のグローバル変数の参照の仕方について

Posted: 2013年4月18日(木) 17:39
by とっしー
softya様
ご返信ありがとうございます。

なるほど普通のグローバル変数にしてしまえばいいのですね。
ただグローバル変数はあまり良くないみたいなことをよく見るのであまり使いたくありません。

私はplayer.cpp以外のファイルでplayerの値を書き変えたいのではなく、参照にしたいだけです。
そのような場合でもグローバル変数を使わなくてはならないのでしょうか?

他のゲームでもプレイヤーの値(位置や向きなど)をplayer.cpp以外のファイルで参照にすることはよくあると思います。
そのようなときは通常どのようにするものなのでしょうか?

お手数おかけしますが以上よろしくお願いします。

Re: ファイル内のグローバル変数の参照の仕方について

Posted: 2013年4月18日(木) 17:41
by ISLe
構造体の中身を公開せずに、構造体の中身を変更したり参照したりするための関数を公開するのが設計としては優れています。
いわゆるクラス(オブジェクト)のメソッドのようなものです。

Re: ファイル内のグローバル変数の参照の仕方について

Posted: 2013年4月18日(木) 17:43
by softya(ソフト屋)
そうですね。座標や向きだけ返す関数をそれぞれ作れば良いと思います。
そうすれば変更もできませんし、他の構造体の部分を公開する事もありません。

Re: ファイル内のグローバル変数の参照の仕方について

Posted: 2013年4月18日(木) 17:50
by とっしー
ISLe様、softya様
ご返信ありがとうございます。

確かに関数を作ってしまえば大丈夫そうですね。
ありがとうございます。

参考までにお伺いしたいのですが、クラスというワードが出て来ましたが、
こういった時はC++を使えばもっとスマートに解決できるのでしょうか?

私はC言語しか使えませんが、もしC++を使えば解決できるというのならば
C++にも手を出してみようと思います。

度々すいません。
以上よろしくお願いします。

Re: ファイル内のグローバル変数の参照の仕方について

Posted: 2013年4月18日(木) 17:52
by softya(ソフト屋)
この問題はC++でも同じです。スマートに成るのはもっと別の部分です。

Re: ファイル内のグローバル変数の参照の仕方について

Posted: 2013年4月18日(木) 17:58
by とっしー
softya様
ご返信ありがとうございます。

そうなんですか。勉強不足ですいません。
とりあえずC言語で進めて行きたいと思います。

色々とアドバイスいただきありがとうございました。
また何かありましたらよろしくお願いします。