舌の根も乾かぬまま、また来てしまいました。

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

舌の根も乾かぬまま、また来てしまいました。

#1

投稿記事 by F91 » 11年前

こんにちわ

また皆様のお知恵をお借りに来ました。

今回は2つあるのですが、龍神録16章と17章で5日も詰まってしまいました。

まず16章なのですが16章はミシャクジさま弾幕を作ってみようというものでこういったものです。


http://www.nicovideo.jp/search/%E3%83%9 ... %BE?sort=v


作成しデバックを実行してみたところ次のようなエラーがでました。

コード:

1>------ ビルド開始: プロジェクト: RyuJin, 構成: Debug Win32 ------
1>コンパイルしています...
1>cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。今後のバージョンからは削除されます。
1>shot.cpp
1>リンクしています...
1>shotH.obj : error LNK2005: "void __cdecl shot_bullet_H008(int)" (?shot_bullet_H008@@YAXH@Z) は既に shot.obj で定義されています。
1>R:\project\16章\Debug\RyuJin.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
1>ビルドログは "file://r:\project\16章\Debug\BuildLog.htm" に保存されました。
1>RyuJin - エラー 2、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
 

1>shotH.obj : error LNK2005: "void __cdecl shot_bullet_H008(int)" (?shot_bullet_H008@@YAXH@Z) は既に shot.obj で定義されています。

の部分はミシャクジさま弾幕で一番最初に書く部分のエラーだと思います。

どうしてこんなエラーがでるのか見当がつかず、龍神録のサイトと見比べても文法ミスはなく(と思います。)、直し方がさっぱりわからないまま、とある理由で17章へ移行してしまったため実際は20日間悩み続けてました(笑)

コードはこんなかんじです。

コード:

//ミシャクジさま
		void shot_bullet_H008(int n){
			int t=shot[n].cnt;
			int k;
			if(t>=0 && t<1200 && t%90==0){
				double angle=rang(PI);
				for(int j=0;j<2;j++){//途中から2分裂する分
					for(int i=0;i<60;i++){//一度に60個
						if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
							shot[n].bullet[k].knd    =8;//8番の弾
                            shot[n].bullet[k].angle  =angle+PI2/60*i;//円形60個
                            shot[n].bullet[k].flag   =1;
                            shot[n].bullet[k].x      =enemy[shot[n].num].x;
                            shot[n].bullet[k].y      =enemy[shot[n].num].y;
                            shot[n].bullet[k].col    =4;//4番の色
                            shot[n].bullet[k].cnt    =0;
                            shot[n].bullet[k].state  =j;//ステータス。0か1かで回転がかわる
                            shot[n].bullet[k].spd    =2;
						}
					}
				}
				se_flag[0]=1;//発射音鳴らす
			}
		    for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分
				if(shot[n].bullet[i].flag>0){//登録されている弾があれば
					int state=shot[n].bullet[i].state;
					int cnt=shot[n].bullet[i].cnt;
					if(30<cnt && cnt<120){//30~120カウントなら
						shot[n].bullet[i].spd-=1.2/90.0;//90カウントかけて1.2減らす
						shot[n].bullet[i].angle+=(PI/2)/90.0*(state?-1:1);//90°傾ける
            }
        }
    }
}

次に17章に関してですが17章はシューティングゲームの自機にショットを打たせるという内容でデバックを実行したところcshot_tが再定義されてるとエラーが出ました。

コードはこんな感じです。

コード:


//キャラクターショットに関する構造体
typedef struct{
	int flag,power,cnt,knd;//フラグ、パワー、カウンタ、種類
	double x,y,angle,spd;//座標、角度、スピード
}cshot_t;

//キャラクターに関する構造体
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;

//敵に関する構造体
typedef struct{
	int flag,cnt,pattern,muki,knd,hp,hp_max,item_n[6],img;
	//フラグ、カウンタ、移動パターン、向き、敵の種類、HP最大値、落とすアイテム
	double x,y,vx,vy,sp,ang;
	//座標、速度x成分、速度y成分、スピード、角度
	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;

//パッドに関する構造体
typedef struct{
	int key[PAD_MAX];
}pad_t;

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

//弾に関する構造体
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;

一番最後の}cshot_t;がエラーを発生させている原因だと考えています。

しかし、消すと別のエラーが発生します。

なぜエラーが発生するのかまったくわかりません。



皆様のお知恵をお貸しいただけたら幸いです。

ちなみに開発環境はVisual Studio 2008でC言語にかんしては初心者です。



あとですが、これは別々のトピックにしたほうがよいでしょうか?
もしそうならすぐに新たにトピックを立てます。

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

Re: 舌の根も乾かぬまま、また来てしまいました。

#2

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

最初のエラーですが、
shotH.cppと shot.cppに同じ名前の関数があるというビルド(リンク)・多重定義エラーです。
関数名はshot_bullet_H008()ですのでソースコードを確認して下さい。
shot.cppに有る方が間違いじゃないかと思います。

17章も多重定義のエラーですね。
1つを消すと出るというエラーを修正したほうが良いと思います。
どうしてダメなのかをちゃんと考えましょう。
バグをちゃんとつぶ癖を付けないと分からない事がどんどん膨らんで行くだけで、C言語や龍神録を理解することに繋がりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

F91

Re: 舌の根も乾かぬまま、また来てしまいました。

#3

投稿記事 by F91 » 11年前

やってみましたところ今度は敵が設定したミシャクジさま弾幕を撃たず、龍神録12章と同じ行動(撃ってくる弾幕は違いますし、撃ってこないのもいます)をとるようになりました。

敵データが入ってないのかと

char fname[32]={"../dat/csv/16章/storyH0.csv"};

と入力するとread errorが画面上に表示されます。

エクセルデータが間違っているのかと再コピーしなおしましたが、それでもread errorがでます。

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

Re: 舌の根も乾かぬまま、また来てしまいました。

#4

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

F91 さんが書きました:やってみましたところ今度は敵が設定したミシャクジさま弾幕を撃たず、龍神録12章と同じ行動(撃ってくる弾幕は違いますし、撃ってこないのもいます)をとるようになりました。

敵データが入ってないのかと

char fname[32]={"../dat/csv/16章/storyH0.csv"};

と入力するとread errorが画面上に表示されます。

エクセルデータが間違っているのかと再コピーしなおしましたが、それでもread errorがでます。
それはロジックを理解する良いチャンスですね。
このバグは理解しないと直せない状況です。
どうして違う弾を打つのか、この機会にちゃんと調べるべきだと思います。
行き当たりばったりの修正やソースコードの見比べより理解するということが大事です。
理解すれば自然と直す所も分かります。

> と入力するとread errorが画面上に表示されます。
ファイルの存在はちゃんと確認されましたか?

>エクセルデータが間違っているのかと再コピーしなおしましたが、それでもread errorがでます
行き当たりばったりなので、ちゃんとデータの内容と構造体に代入されている内容を見なおすべきです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: 舌の根も乾かぬまま、また来てしまいました。

#5

投稿記事 by Tatu » 11年前

15章の時(http://dixq.net/forum/viewtopic.php?f=3&t=13922)に
どうやって解決したのかを思い出せばよいのではないでしょうか?
ただ単にload.cppのファイルパス指定を書き換えたというだけではなかったはずですが。

F91

Re: 舌の根も乾かぬまま、また来てしまいました。

#6

投稿記事 by F91 » 11年前

横にいた友達にstoryH0のファイル拡張子が違っていると言われ、確認してみたらcsvファイルじゃなかったです。

なおしたら動いたので16章のほうは解決しました。

17章のほうもよくコードをみたら、別のほうに同じコードが書かれてるのを見つけました。

その書いたコードは全部私が付け加えたものだったので、どうやら勘違いで動いてなかったみたいです。

お騒がせて申し訳ありませんでした。

閉鎖

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