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

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

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

#1

投稿記事 by polpol » 15年前

龍神録の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:龍神録で音を鳴らす処理を別ファイルに

#2

投稿記事 by シエル » 15年前

mainにはextern void music_play();と書いてください。

polpol

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

#3

投稿記事 by polpol » 15年前

>シエルさん
extern void music_play();をmainファイルの宣言部分や処理部分に書いても
同じエラーが出ました。

naohiro19

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

#4

投稿記事 by naohiro19 » 15年前

function.hに
GLOBAL void music_play();
を追加します。

めるぽん

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

#5

投稿記事 by めるぽん » 15年前

書いたプロジェクト全体か、その現象が再現する最低限のプロジェクトを添付して貰えれば分かりそうな気がしますね。

シエル

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

#6

投稿記事 by シエル » 15年前

music_playという記述がどのファイルにどのように書いているのかを、
全てそのまま記載してくれれば回答できるきがします。

Justy

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

#7

投稿記事 by Justy » 15年前

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

polpol

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

#8

投稿記事 by polpol » 15年前

>書いたプロジェクト全体か、その現象が再現する最低限のプロジェクトを添付して貰えれば

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

//敵のショット音を読み込む
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:龍神録で音を鳴らす処理を別ファイルに

#9

投稿記事 by シエル » 15年前

main2ファイルとkansuteigi.hに同じ関数名を定義してるってことですか?
もしそうなら、名前から判断してkansuteigi.hにextern void music_play();と宣言だけ書いて、
定義はmain2ファイルに書いたほうが良さそうです。

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

polpol

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

#10

投稿記事 by polpol » 15年前

>main2ファイルとkansuteigi.hに同じ関数名を定義してるってことですか?

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

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

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

シエル

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

#11

投稿記事 by シエル » 15年前

音を鳴らす関数がどこにも書かれていないのに鳴るはずがありません。
検索機能を使って調べれば必ずどっかにあるはずです。

シエル

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

#12

投稿記事 by シエル » 15年前

ていうか、 mymain.obj で定義されていますと出てるので、
mymain.cppのなかに定義されているはずです。

polpol

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

#13

投稿記事 by polpol » 15年前

>mymain.cppのなかに定義されているはずです。

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

DVDM

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

#14

投稿記事 by DVDM » 15年前

>>polpolさん
直ることは少ないですが、私は困った時はとりあえずリビルドを行うようにしています。
一度試してみては如何でしょうか。

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

polpol

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

#15

投稿記事 by polpol » 15年前

やはりリビルドしても同じようなエラーが出るようです。

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

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

polpol

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

#16

投稿記事 by polpol » 15年前

一応プロジェクトを以下にアップロードしました↓
見て頂けるとありがたいです。

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

シエル

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

#17

投稿記事 by シエル » 15年前

ちょっと見ましたが、全体の構成がぐちゃぐちゃです。
cppファイルをインクルードしてたり、なぜかmain関数があったり、
ヘッダファイルに関数の定義を書いていたり、とりあえず色々問題がありすぎて指摘しきれません。

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

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

Justy

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

#18

投稿記事 by Justy » 15年前

 アップされたプロジェクトの Debug/BuildLog.htmを見ましたが、特にエラー出てないですよね?

polpol

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

#19

投稿記事 by polpol » 15年前

>Justyさん
そうですね。同じく(?music_play@@YAXXZ) は既に mymain.obj で定義されています。
というエラーが出ます

Justy

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

#20

投稿記事 by Justy » 15年前

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

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

ISLe

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

#21

投稿記事 by ISLe » 15年前

#include "kansuteigi.h"
というのは、ここにkansuteigi.hファイルの中身を差し込むという意味です。

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

polpol

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

#22

投稿記事 by polpol » 15年前

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

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にこのコードを貼り付けてエラーが出ないように
するのが目的です

Justy

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

#23

投稿記事 by Justy » 15年前

 理解しました。
 
 原因は mymain.cppで mymain2.cppをインクルードしているので mymain.cpp側で関数が定義されます。
 同時に mymain2.cpp自身もプロジェクトに含まれているのでビルドされます。

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

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

polpol

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

#24

投稿記事 by polpol » 15年前

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

閉鎖

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