ページ 11

5章でつまづいています

Posted: 2009年9月21日(月) 15:54
by 小夜
こんにちは。
只今、「龍神録プログラミングの館」にて龍神録を作っているのですが、
第5章の「宣言の仕方を工夫しよう」の所でつまづいています。

function.h、GV.hを変更した所までは良いのですが、最後に
"「main.cpp」「graph.cpp」「load.cpp」にある変数の宣言部と、extern宣言を全て消してください。"
というのが どこを消せばいいのか分からず つまづいています。
extern宣言というのは最初にexternとついているやつで、
変数の宣言部は一番最初のやつですよね?(違ったでしょうか;)
それは分かるのですが、どこまで消せばいいのか分からず悩んでます。
どこを消せばいいのでしょうか?
具体的にお願いします!

Re:5章でつまづいています

Posted: 2009年9月21日(月) 16:45
by でんすけ
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] ) ;
}
とあると思います。
それを
#include "../include/GV.h"

void load(){
	LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}
とすればいいんです。

Re:5章でつまづいています

Posted: 2009年9月21日(月) 22:12
by 小夜
御回答ありがとうございます!
しかし やってみたのですが、なぜだか上手くいきません…
変更した後のを貼りますので、違う所をご指摘ください。

まず 【main.cpp です。】

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

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

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

load();//データロード

while(ProcessLoop()==0){//メインループ

graph_main();//描画メイン

if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
}

DxLib_End();//DXライブラリ終了処理
return 0;
}





【次に load.cpp】

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

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




【最後にgraph.cpp】

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

void graph_ch(){
DrawRotaGraphF(ch.x,ch.y,1.0f,0.0f,img_ch[0][ch.img],TRUE);
}

void graph_main(){
graph_ch();
}



よろしくお願い致します!

Re:5章でつまづいています

Posted: 2009年9月21日(月) 22:55
by でんすけ
どんなエラーメッセージでますか?
ソースは見たところ問題ないと思います。

あと以下のソースも確認してみてください。

「GV.h」
#include "../../../include/DxLib.h"
#include "define.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern 
#endif

#include "function.h"

//画像用変数宣言部
GLOBAL int img_ch[2][12];	//キャラクタ画像9枚分 X2(変身用)

//構造体変数宣言部
GLOBAL ch_t ch;			//キャラクタデータ宣言
「function.h」
//graph.cpp
	//描画メイン
	GLOBAL void graph_main();

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

//laod.cpp
	//データのロード
	GLOBAL void load();

Re:5章でつまづいています

Posted: 2009年9月22日(火) 10:16
by 小夜
GV.hもfunction.hはどちらも問題ありませんでした。
エラーメッセージは、ビルドした時に
「ビルド エラーが発生しました。続行して、最後に成功したビルドを実行しますか?」
と なり、出力先の表示(?)という所に、

graph.obj : error LNK2005: "void __cdecl graph_ch(void)" (?graph_ch@@YAXXZ) は既に load.obj で定義されています。
1>graph.obj : error LNK2005: "void __cdecl graph_main(void)" (?graph_main@@YAXXZ) は既に load.obj で定義されています。
1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl load(void)" (?load@@YAXXZ) が関数 _WinMain@16 で参照されました。
1>C:\Users\○○\Desktop\○○\project\project\4章\Debug\RyuJin.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と表示されます。
うーん…難しいです^^;

Re:5章でつまづいています

Posted: 2009年9月22日(火) 11:09
by Tatu
そのエラーメッセージはデバッグ時にビルドを行い、失敗したときに出ます。

そのビルドのときには、ヘッダファイルの変更が反映されないことがあるので、

一回デバッグ>デバッグ開始ではなく、

ビルド>ソリューションのリビルドを選んでみてください。

それでもだめなら、GV.hとfunction.hの中身を見せてください。

Re:5章でつまづいています

Posted: 2009年9月22日(火) 11:22
by 小夜
やってみたのですがダメでした…;
GV.hとfunction.hの中身ですね。


【GV.h】


#include "../../../include/DxLib.h"
#include "define.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

#include "function.h"

//画像用変数宣言部
GLOBAL int img_ch[2][12]; //キャラクタ画像9枚分 X2(変身用)

//構造体変数宣言部
GLOBAL ch_t ch; //キャラクタデータ宣言





【function.h】


//graph.cpp
//描画メイン
GLOBAL void graph_main();

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

//laod.cpp
//データのロード
GLOBAL void load();


ちゃんと出来ていると思ってはいるのですが....
ご指摘よろしくお願いします。

Re:5章でつまづいています

Posted: 2009年9月22日(火) 11:53
by Justy
 load.cppの中に load関数がなく、代わりに graph_ch関数や graph_main関数が
定義されていませんか?

Re:5章でつまづいています

Posted: 2009年9月22日(火) 12:16
by Tatu
>>Justy さん
今、5章のプロジェクトでload.cppとgraph.cppの名前を入れ替えて試しましたが

正常に動きました。

Re:5章でつまづいています

Posted: 2009年9月22日(火) 12:36
by Tatu
>>Justyさん
すみません。勘違いしました。
load.cppとgraph.cppが入れ替わっているのではなく、
load.cppの中身がgraph.cppとまったく同じものだということですね。

そのようにしたら確かに小夜さんと同じ状態になりました。

Re:5章でつまづいています

Posted: 2009年9月22日(火) 13:00
by Justy

>load.cppの中身がgraph.cppとまったく同じものだということですね

 エラーメッセージからそのまま読み取ったのが上記のものだったのですが、
端的に纏めるとまさにそういうことになりますね。

Re:5章でつまづいています

Posted: 2009年9月22日(火) 13:10
by 小夜
皆様ありがとうございました!!!
よく確認すると、load.cppの中がgraph.cppと同じになっていました;
変更してビルドすると4章と同じようになりました。
皆様本当にありがとうございました!
また助けてくださいますよう、よろしくお願い致します^^;