3年前Dxライブラリの本をゆっくりと読みながら4章終わりまで来ました。やってて、ゲームプログラミングの流れというものは、なんとなくですがわかりました。いくつか疑問になった点があるので、質問したいと思います。1.件名の通りextern宣言の使い方がいまいち理解できません。ネットで調べてみると、モジュールが・・・関係?していることが分かったんですが・・・色々教えていただけるとありがたいです。モジュールは実行ファイルという形で理解しているのですが、あっているのでしょうか?2.疑問に思ったこととして、cppファイルとヘッダーファイルを二つ用意しているところが不思議に思いました。画像を読み込むところとしてloading.cppとloading.hを用意しています。loading.hだけではダメなのでしょうか?質問の意味が理解できるか分りませんがお応えしてくれるとうれしいです。Numberについては解決しました。次の問題として最小公倍数の問題に取り組んでいます。Numberについては解決しました。次の問題として最小公倍数の問題に取り組んでいます。かけ算している時点で、int型で扱える数値の範囲を超えているような気がする。バグのないプログラムはない。プログラムは思ったとおりには動かない。3年前モジュールについて定義された用語としてちゃんとあるのかは調べていませんが、おそらくこの場合は機能ごとに分割されたプログラムの一部、でいいでしょう。ゲームプログラムだったら、プレイヤーモジュールとかマップモジュールとかでしょうね。これらをそれぞれ別のファイルに書くことによって下記のスコープ等を分けてプログラムを整理します。スコープについてexternの前に変数のスコープというものを学ぶ必要があります。これがブロックスコープです。関数funcAの変数aは関数funcBから利用できないということです。aはスコープにないのでダメ}関数の外側の変数がファイルスコープの変数になります。ブロックに関わらずに利用できますが、他ファイルの変数を利用することはできません。利用できないということです。externについて上記のファイルスコープの変数を別ファイルから利用するのがextern宣言です。これによってファイルをまたいで利用出来るようになるわけです。3年前cppとヘッダーについて宣言と定義、includeを理解する必要が有ります。宣言はこれを使うよ、とコンパイラに伝えることです。宣言されるとコンパイラは「この宣言されたやつは実体がどっかにあるんだなぁ」みたいな解釈をします。宣言してくれているので複数のファイルからincludeして使ったとしても、同じものを使うことになるわけですね。先に書いたexternも宣言なので、同様に「この変数はどっかにあるんだなぁ」って感じで解釈してくれます。対して定義は、この名前のやつの実体はこいつだぞ、とコンパイラに伝えます。ゆえに、同じものを複数回定義することはできません。複数回定義されてしまうとコンパイラは困ってエラーとしまうわけですね。includeは基本的にただのコピペです。includeの右側のファイルをあるルールに従って探してきて、そこにコピーします。(そのルールをDxlibを始めるときに設定した記憶があるかと思います。)では上記を参考に全てヘッダに詰め込むとどうなるか考えてみましょう。複数回これを行うと、ヘッダに詰め込まれた定義がコピペによって複数になってエラーになってしまうからですね。毎回全てのファイルの中でDxlibの関数を宣言することになり、プログラムが宣言で埋めつくされるでしょう。akasannさんの書いたプログラムでも起こり得ます。loading.hに詰め込むことによって、loading.hの何かを利用するために宣言毎回書く羽目になります。loading以外の処理も同様のことをしてしまえば、宣言の量が大変なのは想像できるかと思います。宣言だけをうまくincludeでコピーしてくることでうまいこと楽するのです。(比較的新しい言語では勝手にうまくやってくれたりします。)全体的にラフな説明なので突っ込みどころはあるかと思いますが、ご容赦を。「14歳からはじめる・・・」ですね。私も読むのに時間がかかりました。非常に勉強になって面白い本だと思います。コレ、重要なんですけど詳しく解説している本はあまり多くないです。実は今読んでいる本(「14歳から・・・」)の5章にこれの解説が多少書いてあります。他の解説書とは違う切り口なのでためになります。hideさんの解説もためになりますし、K&Rとかロベールとか良解説もたくさんありますが、ぶっちゃけすぐには理解できないと思います。英語と同じように、aってなんだ、theってなんだ、atってなんだーと問答するのではなく、解説とサンプルコードを分からなくてもいいからたくさん読んで、少しづつ理解するようにします。すれば1,2年後くらいにはわかります(私なんて10年かかりましたよ)。.cppファイルと.hファイルについて、少し説明してみたいと思います。C/C++の実行ファイル作成にはコンパイルとリンクの2工程があります。基本的に、.cppファイルは中間ファイルと対応づきます。nop関数sqrtはexternしていますが、定義はしていないので、他の.cppファイルの関数としてコンパイラに認識されます。すると、リロケーションテーブルという所にsqrtに対応したシンボルを用意します。_Z4sqrtiiの45に対応していて、リンカは他のオブジェクトのsqrtシンボルと結びつけるという作業を行います。distanceに対応したシンボルがそれらのアセンブラコードの先頭に割り付けられます。配ることを目的としています。このような視点でソースコードを見ていくとわかりやすいのではないかと思います。最小公倍数がintで表現できる範囲なら、オーバーフローしないように掛け算より割り算を先に行うといいでしょう。m/GCD(m,n)*n;}オフトピックこの話はexternとは全く関係なさそうなので、別のトピックの方が良かった気がします。3年前externについてしっかりと紹介しているサイトや参考文献が少ないのはexternが不必要だからです。一切使わないように心がけた方が良い設計になります。使わなくても使ったときと同じ処理は実現可能ですし、使うべきではありません。しても使いたければうちに龍神録プログラミングの館で使い方を紹介しているのでご覧ください。http://dixq.net/rp使わないちゃんとした設計の基本的な考え方はゲームプログラミングの館に書いてありますのでご覧ください。3年前extern宣言はちょっと工夫するとextern宣言を書かなくても書いたことにしてどっからでも変数が呼べるようになります。(全く推奨はしませんが)こちらにはその実装方法が書いてあります。皆さん解答ありがとうございました。イメージ的なのは、なんとなくですがつかむことができたと思います。本のほうを進めていき、疑問に思ったことは投稿させていただきたいと思います。新ゲームプログラミングの館のほうも、おのずと見ていきたいと思います。おまけに関しては別のタグのほうが良かったぽいですね。これから気を付けます。ミクプラは自由にリンクできます。