龍神録の8章を応用したプログラムがビルドできない

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

龍神録の8章を応用したプログラムがビルドできない

#1

投稿記事 by dast » 14年前

何度もお世話になっています。プログラミングの勉強をしながら龍神録プログラミングを見ている初心者です。
龍神録の8章を応用したプログラム(例によってやっていることはサンプルプログラムとほとんど変わりませんが)を書いたのですが上手くビルドできません。ちゃんとdefine.hでPAD_MAXを定義したのにビルドすると「定義されていません」となってしまうのです。どうしたらいいのか教えてください。

char.cpp

コード:

#include "../ヘッダー/GV.h"

void calc_ch(){//画像ループ用関数
	ch.cnt++;
	ch.img=(ch.cnt%24)/6;
	if(CheckStatePad(configpad.left)>0)//左に押されていたら
		ch.x-=2;//座標を左に
	if(CheckStatePad(configpad.right)>0)//右に押されていたら
		ch.x+=2;//座標を右に
}
graph.cpp

コード:

#include "../ヘッダー/GV.h"

void graph_ch(){
	DrawRotaGraph(ch.x,444,1.0,0.0,img[0],TRUE);
}//graph_ch()の中にimgの0番(自機の上向き画像)の作画作業を入れる

void graph_board(){
	DrawGraph(0,0,img_board10,TRUE);
}


void graph_main(){//描画メイン
	graph_ch();
	graph_board();
}//graph_main()の中にgraph_ch()を入れる
ini.cpp

コード:

#include "../ヘッダー/GV.h"

//初期化関数
void first_ini(){//初期化
	ch.x=FIELD_MAX_X/2;//初期の自機座標の設定

	configpad.left=1;
	configpad.right=2;
	configpad.shot=0;
	configpad.bom=4;
	configpad.start=7;
}
key.cpp

コード:

#include "../ヘッダー/GV.h"

unsigned int stateKey[256];

int GetHitKeyStateAll_2(){//ここからGetHitKeyStateAll_2()関数(現在のキー入力処理を行う)
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) stateKey[i]++;
        else                            stateKey[i]=0;
    }
    return 0;
}//ここまでGetHitKeyStateAll_2()関数(受け取ったキー番号の現在のキー入力状態を返す)
int CheckStateKey(unsigned char Handle){//ここからCheckStateKey(unsigned char Handle)関数(受け取ったキー番号の現在の入力状態を返す)
        return stateKey[Handle];
}//ここまでCheckStateKey(unsigned char Handle)関数

//パッドの入力状態を入れる変数(struct.h参照)
pad_t pad;

//引数1と引数2のうち大きい方を引数1に代入する
void input_pad_or_key(int *p, int k){
	*p = *p>k ? *p : k;
}

//パッドとキーボードの両方の入力状態をチェックする関数
void GetHitPadStateAll(){
	int i,PadInput,mul=1;
	PadInput = GetJoypadInputState(DX_INPUT_PAD1);//パッドの入力状態を取得
	for(i=0;i<16;i++){
		if(PadInput & mul) pad.key[i]++;
		else pad.key[i]=0;
		mul*=2;
	}
	input_pad_or_key(&pad.key[configpad.left]   ,CheckStateKey(KEY_INPUT_LEFT));
	input_pad_or_key(&pad.key[configpad.right]  ,CheckStateKey(KEY_INPUT_RIGHT));
	input_pad_or_key(&pad.key[configpad.shot]   ,CheckStateKey(KEY_INPUT_A));
	input_pad_or_key(&pad.key[configpad.bom]    ,CheckStateKey(KEY_INPUT_S));
	input_pad_or_key(&pad.key[configpad.start]  ,CheckStateKey(KEY_INPUT_X));
}

//渡されたパッドキーの入力状態を返す。返り値が-1なら不正
int CheckStatePad(unsigned int Handle){
	if(0<=Handle && Handle<PAD_MAX){
		return pad.key[Handle];
	}
	else{
		printfDx("CheckStatePadに渡した値が不正です\n");
		return -1;
	}
}
load.cpp

コード:

#include "../ヘッダー/GV.h"
void load(){//データをロードする
	img_board10 = LoadGraph("画像/システム/枠.png");
	img_back10 = LoadGraph("画像/背景/神社周辺.png");
	LoadDivGraph("画像/キャラグラ/自機.png",12,3,4,38,41,img);
}
main01.cpp

コード:

#define GLOBAL_INSTANCE
#include "../ヘッダー/GV.h"


//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
	GetHitPadStateAll();//現在のパッド入力処理を行う
    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;//初期化と裏画面化

    while(ProcessLoop()==0){//ProcessLoopの内容を行う
		switch(func_state){
			case 0://func_stateが0の時
				load();//function.hの関数load()を実行する
				first_ini();//function.hの関数first_ini()を実行する
				func_state = 100;//func_stateを100にする
				break;
			case 100:
				calc_ch();//function.hの関数calc_ch()を実行する
				graph_main();//function.hの関数graph_main()を実行する
				break;
			default://上記のcase以外の場合
				printfDx("不明なfunc_state%d\n",func_state);
				break;
		}

		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク



        //ココ!!



        ScreenFlip();
    }

    DxLib_End();
    return 0;
}

define.h

コード:

#include"struct.h"
#define FIELD_MAX_X 619
#define FIELD_X 20
//パッドキーの最大数
#define PAD_MAX 16

function.h

コード:

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

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

//load.cpp
GLOBAL void load();//データをロードする

//ini.ccp
GLOBAL void first_ini();//初期化する

//char.cpp
GLOBAL void calc_ch();//画像のループさせる為の準備

//key.cpp
GLOBAL void GetHitPadStateAll();
GLOBAL int CheckStatePad(unsigned int Handle);
GV.h

コード:

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

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

#include"function.h"//関数宣言(function.hの読み込み)

//画像用変数宣言部分
GLOBAL int img[12];//自機画像
GLOBAL int img_board10;//枠画像
GLOBAL int img_back10;//一面背景

//構造体変数宣言部分
GLOBAL ch_t ch;

//メインループ用変数宣言部分
GLOBAL int func_state;

//コントローラー用構造体変数宣言部分
GLOBAL configpad_t configpad;
struct.h

コード:

//キャラクタに関する構造体
typedef struct{
	int cnt;       //画像処理の為のカウンタ
	int num;       //残機数
	int score;     //スコア
	int mutekicnt; //無敵状態とカウント
	int img;       //画像
	double x,y;    //座標
}ch_t;

//コントローラに関する構造体
typedef struct{
	int key[PAD_MAX];
}pad_t;

//コンフィグに関する構造体
typedef struct{
	int left,right, shot, bom, start;
}configpad_t;


追伸
私の立てた他のトピックがまだ解決しないうちに新しいトピックを立ててしまいましたが……
こういうのって普通にやっちゃっていいんですかね?

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 龍神録の8章を応用したプログラムがビルドできない

#2

投稿記事 by ISLe » 14年前

PAD_MAXを使っているstruct.hは#defineより前にインクルードされているように見えます(define.h)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 龍神録の8章を応用したプログラムがビルドできない

#3

投稿記事 by softya(ソフト屋) » 14年前

2つとも、ちゃんと面倒を見れるならOKだと思います。
面倒を見れずに放置するなら解決してからにしてください。、

で、エラーは何処のソースで出ているかちゃんと書いてください。
勘で書くと今回一番あり得るのは、エラーの出た部分からは#include "define.h"が無いか手前にないので見えないかどちらかです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dast

Re: 龍神録の8章を応用したプログラムがビルドできない

#4

投稿記事 by dast » 14年前

すみません、ビルド時のエラー文を書くのを忘れていましたので書いておきます。

1>------ ビルド開始: プロジェクト: 自作ゲーム, 構成: Debug Win32 ------
1>コンパイルしています...
1>main01.cpp
1>c:\users\pcuser\documents\visual studio 2008\projects\自作ゲーム - コピー\ヘッダー\struct.h(13) : error C2065: 'PAD_MAX' : 定義されていない識別子です。
1>コードを生成中...
1>コンパイル中...
1>load.cpp
1>c:\users\pcuser\documents\visual studio 2008\projects\自作ゲーム - コピー\ヘッダー\struct.h(13) : error C2065: 'PAD_MAX' : 定義されていない識別子です。
1>コードを生成中...
1>コンパイル中...
1>key.cpp
1>c:\users\pcuser\documents\visual studio 2008\projects\自作ゲーム - コピー\ヘッダー\struct.h(13) : error C2065: 'PAD_MAX' : 定義されていない識別子です。
1>コードを生成中...
1>コンパイル中...
1>ini.cpp
1>c:\users\pcuser\documents\visual studio 2008\projects\自作ゲーム - コピー\ヘッダー\struct.h(13) : error C2065: 'PAD_MAX' : 定義されていない識別子です。
1>コードを生成中...
1>コンパイル中...
1>graph.cpp
1>c:\users\pcuser\documents\visual studio 2008\projects\自作ゲーム - コピー\ヘッダー\struct.h(13) : error C2065: 'PAD_MAX' : 定義されていない識別子です。
1>c:\users\pcuser\documents\visual studio 2008\projects\自作ゲーム - コピー\ソース\graph.cpp(4) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
1>コードを生成中...
1>コンパイル中...
1>char.cpp
1>c:\users\pcuser\documents\visual studio 2008\projects\自作ゲーム - コピー\ヘッダー\struct.h(13) : error C2065: 'PAD_MAX' : 定義されていない識別子です。
1>コードを生成中...
1>ビルドログは "file://c:\Users\PCUser\Documents\Visual Studio 2008\Projects\自作ゲーム - コピー\Debug\BuildLog.htm" に保存されました。
1>自作ゲーム - エラー 6、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

dast

Re: 龍神録の8章を応用したプログラムがビルドできない

#5

投稿記事 by dast » 14年前

ISLeさんのご指摘を受けてdefine.hを次のように訂正したら上手くいきました

define.h

コード:


#define FIELD_MAX_X 619
#define FIELD_X 20
//パッドキーの最大数
#define PAD_MAX 16

#include"struct.h"
一体なぜ#include"struct.h"が前に来るとPAD_MAXは適用されなくて後ろに来ると適用されるのでしょうか?

box
記事: 2002
登録日時: 15年前

Re: 龍神録の8章を応用したプログラムがビルドできない

#6

投稿記事 by box » 14年前

dast さんが書きました: 一体なぜ#include"struct.h"が前に来るとPAD_MAXは適用されなくて後ろに来ると適用されるのでしょうか?
struct.hの中で
dast さんが書きました:

コード:

//コントローラに関する構造体
typedef struct{
    int key[PAD_MAX];
}pad_t;
こういう定義をしていますね。
#include "struct.h" が前にあると、PAD_MAX を定義していない状態であるのに PAD_MAX を使った
構造体定義をしているのでダメ、ということに気づいてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

dast

Re: 龍神録の8章を応用したプログラムがビルドできない

#7

投稿記事 by dast » 14年前

つまり#include "struct.h"の場所にstruct.hの中身が丸ごと入って来る形になるのでプログラムの順番がint key[PAD_MAX];→#define PAD_MAX 16という順番になってしまうから適用されなくなるということですね。
ありがとうございます。参考になりました。

閉鎖

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