ページ 11

第5章の消す部分がわからない

Posted: 2010年4月23日(金) 22:02
by アクア
第5章宣言の仕方について質問です。

GV.h変更などをした後、後は「main.cpp」「graph.cpp」「load.cpp」にある変数の宣言部と、extern宣言を全て消してください。

とありますが、上記がどの部分なのかがわかりません。

詳しい方いらっしゃいましたら、教えてください;;

Re:第5章の消す部分がわからない

Posted: 2010年4月23日(金) 23:06
by ookami
http://dixq.net/rp/5.html
ここですよね。

例えば、以下のような場合、iの実体が複数あるのでリンクエラーになります。

--main.cpp
int i;
:

--sub.cpp
int i; // すでにiの実体があるのでリンクエラー
:


次のような場合は、iの実体は1個なので、エラーになりません。

--main.cpp
int i;
:

--sub.cpp
extern int i; // 問題ない。main.cppのiと共有。
:


で、次のような場合は、iの実体がひとつもないので、エラーになります。

--main.cpp
extern int i;
:

--sub.cpp
extern int i;
:


この辺の、externを付けたり付けなかったりするのが面倒なので GV.h にまとめているのが問題のページのようですね。GV.h に「GLOBAL xxxx」として追加した変数は、「main.cpp」「graph.cpp」「load.cpp」で宣言する必要がなくなるから消す、ということです。

Re:第5章の消す部分がわからない

Posted: 2010年4月24日(土) 10:56
by Dixq (管理人)
既にookamiさんがお答えくださっていますが、
「main.cpp」「graph.cpp」「load.cpp」のファイルの冒頭にある変数の宣言とexternから始まる行を消すということです。

例えば

--load.cpp変更--

#include "../include/GV.h"

extern int img_ch[2][12];

void load(){
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}


この部分や


--main.cpp変更--

#define GLOBAL_INSTANCE
#include "../include/GV.h"

//現在のキー入力処理を行う
extern int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
extern int CheckStateKey(unsigned char Handle);

//データのロード
extern void load();

//描画メイン
extern void graph_main();

int img_ch[2][12]; //キャラクタ画像9枚分 X2(変身用)
ch_t ch; //キャラクタデータ宣言


//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す


この部分などですね。

Re:第5章の消す部分がわからない

Posted: 2010年4月24日(土) 16:29
by アクア
なるほどです、試してみますね~。

因みに模範解答などは無いのでしょうか。
たまにしかネットに繋げれないものでして・・・

Re:第5章の消す部分がわからない

Posted: 2010年4月24日(土) 16:31
by ROM
模範解答って何の?
見る限り問題のようなものはないようですが。

Re:第5章の消す部分がわからない

Posted: 2010年4月24日(土) 16:36
by box
考え方は、
1)実体を定義するのは、どこか1箇所だけ
2)他のファイルから当該の変数にアクセスする必要があれば、
  「実体は別のファイルにあるよ」という意味でexternを付ける

Re:第5章の消す部分がわからない

Posted: 2010年4月24日(土) 19:22
by アクア
お蔭様で解決できました。みなさん有難うございます。


13章でまたしてもつまづいてますが、別スレにしておきます。