外部シンボルstruct bullet_infoが未解決

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

外部シンボルstruct bullet_infoが未解決

#1

投稿記事 by Itaru » 13年前

龍神録のプログラムを、見ながら1章のデータに手動で書きうつしています。
現在21章なのですが、

1>ini.obj : error LNK2001: 外部シンボル ""struct bullet_info_t * bullet_info" (?bullet_info@@3PAUbullet_info_t@@A)" は未解決です。
1>out.obj : error LNK2001: 外部シンボル ""struct bullet_info_t * bullet_info" (?bullet_info@@3PAUbullet_info_t@@A)" は未解決です。
1>F:\backup\20100927C直下\Documents and Settings\(ユーザ名)\デスクトップ\study\project\1章\Debug\RyuJin.exe : fatal error LNK1120: 外部参照 1 が未解決です。

以上のようなエラーが出ます。
全ての自作ファイルと21章のファイルとをWinMergeを利用して見比べたところ、私の目には間違いが見受けられませんでした。
このエラーを修正したいと思います。お力添えをよろしくお願いします。

以下に関係のありそうなコードを貼り付けますが、不足がありましたらお教えください。

ini.cpp

コード:

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

void input_bullet_info(bullet_info_t *binfo,int size_x,int size_y,int col_num,double range){
        binfo->size_x =size_x;  binfo->size_y =size_y;
        binfo->col_num=col_num; binfo->range  =range;
}

//一番最初の初期化
void first_ini(){

	configpad.down=0;
	configpad.left=1;
	configpad.right=2;
	configpad.up=3;
	configpad.bom=4;
	configpad.shot=5;
	configpad.slow=11;
	configpad.start=13;
	configpad.change=6;

	input_bullet_info(&bullet_info[0],76, 76, 5,17.0);
	input_bullet_info(&bullet_info[1],22, 22, 6, 4.0);
	input_bullet_info(&bullet_info[2], 5,120,10, 2.5);
	input_bullet_info(&bullet_info[3],19, 34, 5, 2.0);
	input_bullet_info(&bullet_info[4],38, 38,10, 2.0);
	input_bullet_info(&bullet_info[5],14, 16, 3, 3.5);
	input_bullet_info(&bullet_info[6],14, 18, 3, 2.0);
	input_bullet_info(&bullet_info[7],16, 16, 9, 2.5);
	input_bullet_info(&bullet_info[8],12, 18,10, 1.5);
	input_bullet_info(&bullet_info[9],13, 19, 3, 2.0);
}


//何度もする初期化
void ini(){
	stage_count=1;
		//void memset(void バッファ, int 文字、 size_t カウント);
		//カウントの文字数分、文字をコピーしてバッファに書き込む。
		//戻り値は、バッファのポインタ。
		//メモリブロックを何かの値で初期化したい場合、利用できる。
	memset(&ch,0,sizeof(ch_t));//自機のバッファに0を書き込む
	ch.x=FIELD_MAX_X/2;
	ch.y=FIELD_MAX_Y*3/4;
	memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);
		//sizeof演算子:渡された型や変数のメモリサイズを調べる。
		//この場合、enemy_tのサイズを見ている。
	memset(enemy_order,0,sizeof(enemy_order_t)*ENEMY_ORDER_MAX);
	memset(shot,0,sizeof(shot_t)*SHOT_MAX);
	memset(cshot,0,sizeof(cshot_t)*CSHOT_MAX);
	ch.power=500;
	memset(effect,0,sizeof(effect_t)*EFFECT_MAX);
	memset(del_effect,0,sizeof(del_effect_t)*DEL_EFFECT_MAX);


	ch.x=FIELD_MAX_X/2;
	ch.y=FIELD_MAX_Y*3/4;
	ch.power=500;
}
out.cpp

コード:

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

#define ENEMY_RANGE_MAX 4
#define CSHOT_RANGE_MAX 2
#define CRANGE 2.0

//敵当たり判定
int enemy_range[ENEMY_RANGE_MAX]={16,30,16,50};
//自機ショットの当たり判定
int cshot_range[CSHOT_RANGE_MAX]={6,};

//当たりを判定
int out_judge_cshot(int i,int s){
	int j;
	if(cshot[i].cnt>0){//ショットの軌道が一度でも計算されていたら
		double x=cshot[i].x-enemy[s].x;//敵と自機ショットの距離
		double y=cshot[i].y-enemy[s].y;//↑の縦座標
		//オーバーフロー対策
		if(cshot[i].knd>=CSHOT_RANGE_MAX || enemy[s].knd>=ENEMY_RANGE_MAX)
			printfDx("out_judge_cshot内オーバーフロー");
		//敵当たり判定+自機当たり判定
		double r =cshot_range[cshot[i].knd]+enemy_range[enemy[s].knd];
		//中間を計算する必要があれば
		if(cshot[i].spd>r){
			//1フレーム前の位置を格納
			double pre_x=cshot[i].x+cos(cshot[i].angle+PI)*cshot[i].spd;
			double pre_y=cshot[i].y+sin(cshot[i].angle+PI)*cshot[i].spd;
			double px,py;
			for(j=0;j<cshot[i].spd/r;j++){//進んだ分(cshot[i].spd÷当たり判定分ループ)
				px=pre_x-enemy[s].x;
				py=pre_y-enemy[s].y;
				if(px*px+py*py<r*r)
					return 1;
				pre_x+=cos(cshot[i].angle)*r;
				pre_y+=sin(cshot[i].angle)*r;
			}
		}
		if(x*x+y*y<r*r)//当たり判定内なら
			return 1;//当たり
	}
	return 0;//そうでないならはずれ=0
}

//自機⇔敵ショット当たり判定
int out_judge_enemyshot(int s, int n){
	int j;
	if(shot[s].bullet[n].cnt>0){//ショット軌道計算が一度でも行われていたら
		double x=shot[s].bullet[n].x-ch.x;//敵と自機ショットの距離
		double y=shot[s].bullet[n].y-ch.y;
		//オーバーフロー対策
		if(shot[s].bullet[n].knd>=10)
			printfDx("out_judge_enemyshot内オーバーフロー\n");
		//敵の当たり判定と自機ショットの当たり判定の合計範囲
		double r = bullet_info[shot[s].bullet[n].knd].range+CRANGE;
		//中間を計算する必要があれば
		if(shot[s].bullet[n].spd>r){
			//1フレーム前にいた位置を格納
			double pre_x=shot[s].bullet[n].x+cos(shot[s].bullet[n].angle+PI)*shot[s].bullet[n].spd;
			double pre_y=shot[s].bullet[n].y+sin(shot[s].bullet[n].angle+PI)*shot[s].bullet[n].spd;
			double px,py;
			for(j=0;j<shot[s].bullet[n].spd/r;j++){//進んだ分/当たり判定 分ループ
				px=pre_x-ch.x;
				py=pre_y-ch.y;
				if(px*px+py*py<r*r)
					return 1;
				pre_x+=cos(shot[s].bullet[n].angle)*r;
				pre_y+=sin(shot[s].bullet[n].angle)*r;
			}
		}
		if(x*x+y*y<r*r)//当たり判定内なら
			return 1;//当たり
	}
	return 0;
}

//敵消滅判定
extern void enter_del_effect(int);
void enemy_death_judge(int s){
	int i;
	se_flag[8]=1;
	if(enemy[s].hp<0){//敵のhoが0より小さければ
		enemy[s].flag=0;//敵生存フラグoff
		se_flag[1]=1;//ティウン音
		enter_del_effect(s);
		for(i=0;i<SHOT_MAX;i++){//shotの総数まで
			if(shot[i].flag!=0){//登録されたショットがあれば
				if(s==shot[i].num){
					shot[i].flag=2;//flag2で登録停止
					break;
				}
			}
		}
	}
}


//自機ショット⇔敵の処理
void cshot_and_enemy(){
	int i,s;
	for(i=0;i<CSHOT_MAX;i++){//自機ショット総数まで
		if(cshot[i].flag>0){//自機ショットが登録されていれば
			for(s=0;s<ENEMY_MAX;s++){//敵総数
				if(enemy[s].flag>0){
					if(out_judge_cshot(i,s)){//自機ショットと敵が一致していれば
						cshot[i].flag=0;//その自機ショットを消す
						enemy[s].hp-=cshot[i].power;//hpからpower分引く
						enemy_death_judge(s);//敵消滅判定
					}
				}
			}
		}
	}
}

//敵ショット⇔自機の処理
void enemyshot_and_ch(){
	int s,n;
	for(s=0;s<SHOT_MAX;s++){//自機ショット総数まで
		if(shot[s].flag>0){//自機ショットが登録されていれば
			for(n=0;n<SHOT_BULLET_MAX;n++){//弾総数
				if(shot[s].bullet[n].flag==1){
					if(out_judge_enemyshot(s,n)){//時期にその弾が接触していたら
						shot[s].bullet[n].flag=0;//弾をオフ

						/*喰らいボム処理ここ*/

						if(ch.flag==0 && ch.mutekicnt==0){//ステータスが通常で、無敵じゃない時
							ch.flag		=2;	//1:喰らいボム受付中 2:死んで浮き上がり中
							ch.cnt		=0;
							se_flag[3]	=1;//ティウン音
							return;
						}
					}
				}
			}
		}
	}
}

//当たり判定メイン
void out_main(){
	cshot_and_enemy();
	enemyshot_and_ch();
}
struct.h

コード:

#ifndef STRUCT_H
#define STRUCT_H

//キャラ構造体
typedef struct
{
	int flag;		//フラグ
	int cnt;		//カウンタ
	int power;		//パワー
	int point;		//ポイント
	int score;		//スコア
	int num;		//残機
	int mutekicnt;	//無敵とカウント
	int shot_mode;	//ショットモード
	int money;		//お金
	int img;		//画像
	int slow;		//スロー判定
	double x,y;		//座標
	int shot_cnt;
}ch_t;	//構造体の中のchっていう変数

//敵構造体(knd=kind,種類)
typedef struct{
	//フラグ、カウンタ、移動パターン、向き、敵の種類、(HP?)、MAXHP、ドロップ、画像
	int flag,cnt,pattern,muki,knd,hp,hp_max,item_n[6],img,back_col;//<-背景色;
	//座標、速度(v)x成分、スピード、角度
	double x,y,vx,vy,sp,ang;
	//弾幕開始時間、弾幕の種類、弾の種類、色、状態、待機時間、停滞時間
	int bltime,blknd,blknd2,col,state,wtime,wait;
}enemy_t;

typedef struct{
	//カウンタ、移動パターン、敵の種類
	int cnt,pattern,knd;
	//初期座標とスピード
	double x,y,sp;
	//弾幕開始時間、弾幕の種類、色、体力、弾の種類、停滞時間、アイテム(6)
	int bltime,blknd,col,hp,blknd2,wait,item_n[6];
}enemy_order_t;


//PAD 構造体
typedef struct{
	int key[PAD_MAX];
}pad_t; //構造体の中のpadっていう変数

//コンフィグの構造体
typedef struct{
	int left,up,right,down,shot,bom,slow,start,change;
}configpad_t;//configpadで呼ぶ
//弾に関する構造体
typedef struct{
//フラグ、種類、カウンタ、色、状態、少なくとも消さない時間、エフェクトの色
	int flag,knd,cnt,col,state,till,eff;
//座標、角度、速度、ベースの角度、一時記憶スピード
	double x,y,angle,spd,base_angle[1],rem_spd[1];
}bullet_t;

//ショットに関する構造体
typedef struct{
	//フラグ、種類、カウント、どの敵から発射されたか
	int flag,knd,cnt,num;
	//ベース角度、ベーススピード
	double base_angle[1],base_spd[1];
	bullet_t bullet[SHOT_BULLET_MAX];
}shot_t;


//キャラショットに関する構造体
typedef struct{
	int flag,power,cnt,knd;
	double x,y,angle,spd;
}cshot_t;
//エフェクト
typedef struct{
	int flag,cnt,col,knd,img,eff,brt;
	double x,y,r,ang;
}effect_t;

//消滅エフェクト
typedef struct{
	int flag,cnt,col;
	double x,y;
}del_effect_t;

//弾の情報
typedef struct{
	int size_x,size_y,col_num;
	double range;
}bullet_info_t;

#endif
GV.h

コード:

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


#ifdef GLOBAL_INSTANCE//GLOBALがあるなら
#define GLOBAL	//普通このあとに置き換えるものが続く。ないから空白
#else			//そうでないなら
#define GLOBAL extern //GLOBALをexternとせよ
#endif //終わり

#include "function.h"


//画像の変数宣言
GLOBAL int img_ch[2][12];

//構造体の変数宣言。ch_tって型のchって変数
GLOBAL ch_t ch;

//コンフィグの構造体
GLOBAL configpad_t configpad;

//メインループの関数制御するやつ。状態を見る(フラグ?)
GLOBAL int func_state;

//ボードの変数
GLOBAL int img_board[40];

//ゲーム中のカウンタ
GLOBAL int stage_count;

//敵画像ハンドル
GLOBAL int img_enemy[3][9];//敵画像9枚分 X3体分

//敵の基本情報(いっぱい変数作った構造体)
GLOBAL enemy_t enemy[ENEMY_MAX];

//敵の出現情報(数は出現最大数まで)
GLOBAL enemy_order_t enemy_order[ENEMY_ORDER_MAX];

//弾の画像
GLOBAL int img_bullet[10][10];

//音楽ファイル用変数部(?)
GLOBAL int sound_se[SE_MAX];

//サウンドフラグ
GLOBAL int se_flag[SE_MAX];

//ショット情報
GLOBAL shot_t shot[SHOT_MAX];

//自機ショット用画像
GLOBAL int img_cshot[2];

//自機ショット登録用変数
GLOBAL cshot_t cshot[CSHOT_MAX];

//消滅エフェクトの画像に使う変数
GLOBAL int img_del_effect[5];

//消滅エフェクト
GLOBAL del_effect_t del_effect[DEL_EFFECT_MAX];

//エフェクト
GLOBAL effect_t effect[EFFECT_MAX];

//背景画像
GLOBAL int img_back[10];
GLOBAL int count;

//弾情報
GLOBAL bullet_info_t bullet_info[10];//弾情報

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 外部シンボルstruct bullet_infoが未解決

#2

投稿記事 by bitter_fox » 13年前

Itaru さんが書きました:龍神録のプログラムを、見ながら1章のデータに手動で書きうつしています。
現在21章なのですが、

1>ini.obj : error LNK2001: 外部シンボル ""struct bullet_info_t * bullet_info" (?bullet_info@@3PAUbullet_info_t@@A)" は未解決です。
1>out.obj : error LNK2001: 外部シンボル ""struct bullet_info_t * bullet_info" (?bullet_info@@3PAUbullet_info_t@@A)" は未解決です。
1>F:\backup\20100927C直下\Documents and Settings\(ユーザ名)\デスクトップ\study\project\1章\Debug\RyuJin.exe : fatal error LNK1120: 外部参照 1 が未解決です。
struct.hがインクルードされていないように思うのですが・・・

Itaru

Re: 外部シンボルstruct bullet_infoが未解決

#3

投稿記事 by Itaru » 13年前

えっと、今公式のファイルの方を確認したのですが、struct.hのインクルードはdefine.hの最後のみで合っていますでしょうか?
でしたら、

コード:

//円周率
#define PI 3.1415926535898
#define PI2 (PI*2)
//キャラクタの移動可能範囲
#define FIELD_MAX_X 384
#define FIELD_MAX_Y 448
//移動可能範囲ここから
#define FIELD_X 32
#define FIELD_Y 16

//効果音の種類最大数
#define SE_MAX 100

//パッドキー最大数
#define PAD_MAX 16

//敵の最大表示可能数
#define ENEMY_MAX 30
//敵の出現情報最大数
#define ENEMY_ORDER_MAX 500
//敵行動パターン最大値
#define ENEMY_PATTERN_MAX 11

//敵の最高弾幕数
#define SHOT_BULLET_MAX 1000
//弾幕の最大弾数
#define SHOT_MAX 30

//ショットの種類の最大数
#define SHOT_KND_MAX 18

//自機ショットの登録最大数
#define CSHOT_MAX 200

//エフェクト登録最大数
#define EFFECT_MAX 100
//消滅エフェクト登録最大数
#define DEL_EFFECT_MAX 30

#include "struct.h"
このようにはインクルードしてあります。
今まではどの構造体も問題なく使えていましたし、今回はdefine.hを変更していないので大丈夫だと思うのですが…

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

Re: 外部シンボルstruct bullet_infoが未解決

#4

投稿記事 by ISLe » 13年前

IDEがGV.hの変更を認識できていないのだと思います。
龍神録はIDEが誤認識しやすいコードの書き方なので。
リビルドしたら良いかもしれません。
それでダメだったら、Debugフォルダまるごと削除してみてください。

Itaru

Re: 外部シンボルstruct bullet_infoが未解決

#5

投稿記事 by Itaru » 13年前

見事できました!ありがとうございます!
当方IDEという言葉を初めて聞いたもので、検索しても「統合開発環境」というよくわからない用語だったので自分なりに解釈したのですが、
C++などのプログラミングを行う上でそれを助けてくれるOSのようなものという認識で大体あっているでしょうか?
それに再度ファイルの変更を認識させることで、インクルードされているはずのファイルを正しく理解させた、ということですか?

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

Re: 外部シンボルstruct bullet_infoが未解決

#6

投稿記事 by ISLe » 13年前

IDE(統合開発環境)というのは、プロジェクト管理、ソースファイル・リソース管理、コンパイル、ソースコードデバッグなどの機能をまとめて操作できるアプリケーションソフトのことです。
ウィンドウズのスタートメニューからVisual Studioを選ぶと起動するのもIDEと呼ばれるものです。

IDEは無駄にコンパイル作業が発生しないように、ソースファイルの更新時刻を見てコンパイルが必要かどうかを判断します。
インクルードしているヘッダファイルも判断材料になります。
龍神録のソースファイルはヘッダファイルの構造が複雑な上、プリプロセッサで内容を切り替えるので、誤認識されやすいです。

リビルドというのは、ソースファイルの新旧を無視して、全部コンパイルしてしまいなさい、という指示です。

(デバッグ構成の場合)Debugフォルダには、ソースファイルから生成されたファイルが入っているので、削除すれば全部コンパイルする必要があると判断されることになります。
プロジェクトに対してファイルを追加したり削除したりしているうちに取りこぼしが発生して、リビルドではリンクエラーが解消できなくなることがあります。
そんなときはDebugフォルダやReleaseフォルダをいったん削除すると良いです。
けっこう不要なファイルが溜まっていることがありますのでプロジェクトが完成したらいったん削除して完全ビルドすることをお勧めします。

Itaru

Re: 外部シンボルstruct bullet_infoが未解決

#7

投稿記事 by Itaru » 13年前

とてもよくわかりました!先生になってほしいくらいです…
今後のアドバイスも含め、本当にありがとうございました!

閉鎖

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