ページ 11

龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月22日(水) 02:36
by polpol
龍神録の13章→http://dixq.net/rp/13.html
音を鳴らす処理を別ファイルに記述しようとしたのですが
うまくいきません。
mainファイルにはmusic_play();と記述し
main2ファイルには以下のように記述しました

#include "DxLib.h"
#define SE_MAX 100
extern int se_flag[SE_MAX];
extern int sound_se[SE_MAX];

void music_play(){
int i;
for(i=0;i<SE_MAX;i++){
if(se_flag==1)
PlaySoundMem(sound_se,DX_PLAYTYPE_BACK);
}
}

これで実行すればmymain2.obj : error LNK2005: "void __cdecl music_play(void)" (?music_play@@YAXXZ) は既に mymain.obj で定義されています。 
というエラーが出てしまいます。
初歩的な質問ですがよろしくお願いします。。。。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月22日(水) 04:50
by シエル
mainにはextern void music_play();と書いてください。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月22日(水) 12:49
by polpol
>シエルさん
extern void music_play();をmainファイルの宣言部分や処理部分に書いても
同じエラーが出ました。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月22日(水) 17:06
by naohiro19
function.hに
GLOBAL void music_play();
を追加します。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月22日(水) 20:46
by めるぽん
書いたプロジェクト全体か、その現象が再現する最低限のプロジェクトを添付して貰えれば分かりそうな気がしますね。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月22日(水) 20:50
by シエル
music_playという記述がどのファイルにどのように書いているのかを、
全てそのまま記載してくれれば回答できるきがします。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月22日(水) 23:24
by Justy
>mymain2.obj : error LNK2005: "void __cdecl music_play(void)" (?music_play@@YAXXZ) は既に mymain.obj で定義されています。 
 mymain.cppと mymain2.cppの両方に同じ関数名の music_play関数が存在しているのが原因です。
 同じ内容の関数であれば、どちらか一方を削除して下さい。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 00:53
by polpol
>書いたプロジェクト全体か、その現象が再現する最低限のプロジェクトを添付して貰えれば

コード全体は長すぎて書けないんですが、弾を発射時に音が鳴る処理は一部ですが
以下のように書きました

//敵のショット音を読み込む
sound_se[0]=LoadSoundMem("../dat/se/enemy_shot.wav");
for(i=0;i<SHOT_MAX;i++){//弾幕データ計算
if(shot.flag!=0 && 0<=shot.knd && shot.knd<SHOT_KND_MAX){

shot_bullet[shot.knd](i);//.kndの弾幕計算関数を呼ぶ関数ポインタ
shot_calc(i);//i番目の弾幕を計算
shot.cnt++;
}
if(shot.flag>0){//弾幕データがオンなら
for(j=0;j<SHOT_BULLET_MAX;j++){//その弾幕が持つ弾の最大数分ループ
if(shot.bullet2[j].flag!=0){//弾データがオンなら
DrawRotaGraphF(
shot.bullet2[j].x, shot.bullet2[j].y,
1.0, shot.bullet2[j].angle+PI/2,
img_bullet[shot[i].bullet2[j].knd][shot[i].bullet2[j].co[/url],TRUE);
}
}}}
music_play();
music_ini();

// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}

DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}



ちなみにkansuteigi.hという別ファイルもincludeしておりそこに

#include "DxLib.h"


#define SE_MAX 100
extern int se_flag[SE_MAX];
extern int sound_se[SE_MAX];

void music_play(){
int i;
for(i=0;i<SE_MAX;i++){
if(se_flag[i]==1)
PlaySoundMem(sound_se[i],DX_PLAYTYPE_BACK);
}
}
を書くと正常に音が鳴るのでコードの処理部分には問題ないと思うのですが・・・

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 04:52
by シエル
main2ファイルとkansuteigi.hに同じ関数名を定義してるってことですか?
もしそうなら、名前から判断してkansuteigi.hにextern void music_play();と宣言だけ書いて、
定義はmain2ファイルに書いたほうが良さそうです。

ただ状況があまり良く分からないことや、今後のことを考えて
ファイル分割を学んでから、一度作り直すことをお勧めします。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 15:28
by polpol
>main2ファイルとkansuteigi.hに同じ関数名を定義してるってことですか?

いえ、kansuteigi.hに上記のコードを書いた時はmain2には何も書いてない空白
の状態です。
新しくmain3.main4...とファイルを作ってそこに上記のコードを書いても
(?music_play@@YAXXZ) は既に mymain.obj で定義されています。と同じエラーが出ます、

すでに定義されていますと言ってるので上記のコードを書かずに実行してみると正常にデバックが起動して音も鳴りました。(音を鳴らす処理はどこにも書かれていないのに・・・)

何度も確認しましたがmainファイルでダブってる所は無いハズなんですが・・・

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 15:31
by シエル
音を鳴らす関数がどこにも書かれていないのに鳴るはずがありません。
検索機能を使って調べれば必ずどっかにあるはずです。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 15:33
by シエル
ていうか、 mymain.obj で定義されていますと出てるので、
mymain.cppのなかに定義されているはずです。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 15:56
by polpol
>mymain.cppのなかに定義されているはずです。

うーん・・・やはり見つかりませんでした(ーー;)
バグ的なもので再インストールしたほうがいいのでしょうか・・・

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 16:05
by DVDM
>>polpolさん
直ることは少ないですが、私は困った時はとりあえずリビルドを行うようにしています。
一度試してみては如何でしょうか。

どうしても直らないのなら、プロジェクト一式アップして頂けると解決されやすいと思います。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 16:31
by polpol
やはりリビルドしても同じようなエラーが出るようです。

>プロジェクト一式アップをアップできる

そうですね。可能ならソースを見て頂きたいです
いいアップロダを教えてもらっていいでしょうか

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 20:48
by polpol
一応プロジェクトを以下にアップロードしました↓
見て頂けるとありがたいです。

http://www1.axfc.net/uploader/Si/so/86034.zip&key=abcde

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 21:03
by シエル
ちょっと見ましたが、全体の構成がぐちゃぐちゃです。
cppファイルをインクルードしてたり、なぜかmain関数があったり、
ヘッダファイルに関数の定義を書いていたり、とりあえず色々問題がありすぎて指摘しきれません。

一度ファイル分割について、勉強しなおすべきだと思います。
もしくは、龍神録のプロジェクトファイルをダウンロードして、
それを参考にして作り直すことをお勧めします。

冷たい回答しかできなくてすいません。よろしくお願いします。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 21:47
by Justy
 アップされたプロジェクトの Debug/BuildLog.htmを見ましたが、特にエラー出てないですよね?

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 21:55
by polpol
>Justyさん
そうですね。同じく(?music_play@@YAXXZ) は既に mymain.obj で定義されています。
というエラーが出ます

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 22:12
by Justy
 話がかみ合っていないようですが、アップロードされていた zip内にある Debug/BuildLog.htmをみるかぎり、
ビルドに成功しています。
 試しにこちらでビルドもしてみましたが、やはりビルドは成功します。
 つまりこちらからそのエラーを確認することができていません。

 何をしたらエラーが出るのですか?

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 22:21
by ISLe
#include "kansuteigi.h"
というのは、ここにkansuteigi.hファイルの中身を差し込むという意味です。

kansuteigi.hにmusic_play関数を定義するコードがありますから、それをインクルードしているmymain.cppで定義しているということになります。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 23:13
by polpol
>何をしたらエラーが出るのですか?

kansuteigi.hの最後に記述してある
#include "DxLib.h"

#define SE_MAX 100
extern int se_flag[SE_MAX];
extern int sound_se[SE_MAX];

void music_play(){
int i;
for(i=0;i<SE_MAX;i++){
if(se_flag==1)
PlaySoundMem(sound_se,DX_PLAYTYPE_BACK);
}
}

をコピーして→消去→コピーした上のコードをmymain2.cppに貼り付けるとエラーが出ます。
1でも書いてるとうり結局はmymain2.cppにこのコードを貼り付けてエラーが出ないように
するのが目的です

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 23:32
by Justy
 理解しました。
 
 原因は mymain.cppで mymain2.cppをインクルードしているので mymain.cpp側で関数が定義されます。
 同時に mymain2.cpp自身もプロジェクトに含まれているのでビルドされます。

 そうすると、2つのソースコードで同じ関数が含まれることになり、リンク時にエラーになります。

 通常、cppファイルで別の cppファイルをインクルードすることはないので、該当するインクルード行を
削除するか mymain2.cppをプロジェクトから外して下さい。

Re:龍神録で音を鳴らす処理を別ファイルに

Posted: 2010年9月23日(木) 23:58
by polpol
なるほど。cppファイルをインクルードするのが原因ですか。
よく見るとISLeさんもシエルさんも同じような事書いてますね
勉強になりました
コードが多くなってきたので始めからファイル分割について勉強してみます。
とりあえず解決しました。ありがとうございます