龍神録で音を鳴らす処理を別ファイルに
龍神録で音を鳴らす処理を別ファイルに
龍神録の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 で定義されています。
というエラーが出てしまいます。
初歩的な質問ですがよろしくお願いします。。。。
音を鳴らす処理を別ファイルに記述しようとしたのですが
うまくいきません。
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:龍神録で音を鳴らす処理を別ファイルに
>シエルさん
extern void music_play();をmainファイルの宣言部分や処理部分に書いても
同じエラーが出ました。
extern void music_play();をmainファイルの宣言部分や処理部分に書いても
同じエラーが出ました。
Re:龍神録で音を鳴らす処理を別ファイルに
>mymain2.obj : error LNK2005: "void __cdecl music_play(void)" (?music_play@@YAXXZ) は既に mymain.obj で定義されています。
mymain.cppと mymain2.cppの両方に同じ関数名の music_play関数が存在しているのが原因です。
同じ内容の関数であれば、どちらか一方を削除して下さい。
mymain.cppと mymain2.cppの両方に同じ関数名の music_play関数が存在しているのが原因です。
同じ内容の関数であれば、どちらか一方を削除して下さい。
Re:龍神録で音を鳴らす処理を別ファイルに
>書いたプロジェクト全体か、その現象が再現する最低限のプロジェクトを添付して貰えれば
コード全体は長すぎて書けないんですが、弾を発射時に音が鳴る処理は一部ですが
以下のように書きました
//敵のショット音を読み込む
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);
}
}
を書くと正常に音が鳴るのでコードの処理部分には問題ないと思うのですが・・・
コード全体は長すぎて書けないんですが、弾を発射時に音が鳴る処理は一部ですが
以下のように書きました
//敵のショット音を読み込む
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:龍神録で音を鳴らす処理を別ファイルに
main2ファイルとkansuteigi.hに同じ関数名を定義してるってことですか?
もしそうなら、名前から判断してkansuteigi.hにextern void music_play();と宣言だけ書いて、
定義はmain2ファイルに書いたほうが良さそうです。
ただ状況があまり良く分からないことや、今後のことを考えて
ファイル分割を学んでから、一度作り直すことをお勧めします。
もしそうなら、名前から判断してkansuteigi.hにextern void music_play();と宣言だけ書いて、
定義はmain2ファイルに書いたほうが良さそうです。
ただ状況があまり良く分からないことや、今後のことを考えて
ファイル分割を学んでから、一度作り直すことをお勧めします。
Re:龍神録で音を鳴らす処理を別ファイルに
>main2ファイルとkansuteigi.hに同じ関数名を定義してるってことですか?
いえ、kansuteigi.hに上記のコードを書いた時はmain2には何も書いてない空白
の状態です。
新しくmain3.main4...とファイルを作ってそこに上記のコードを書いても
(?music_play@@YAXXZ) は既に mymain.obj で定義されています。と同じエラーが出ます、
すでに定義されていますと言ってるので上記のコードを書かずに実行してみると正常にデバックが起動して音も鳴りました。(音を鳴らす処理はどこにも書かれていないのに・・・)
何度も確認しましたがmainファイルでダブってる所は無いハズなんですが・・・
いえ、kansuteigi.hに上記のコードを書いた時はmain2には何も書いてない空白
の状態です。
新しくmain3.main4...とファイルを作ってそこに上記のコードを書いても
(?music_play@@YAXXZ) は既に mymain.obj で定義されています。と同じエラーが出ます、
すでに定義されていますと言ってるので上記のコードを書かずに実行してみると正常にデバックが起動して音も鳴りました。(音を鳴らす処理はどこにも書かれていないのに・・・)
何度も確認しましたがmainファイルでダブってる所は無いハズなんですが・・・
Re:龍神録で音を鳴らす処理を別ファイルに
>mymain.cppのなかに定義されているはずです。
うーん・・・やはり見つかりませんでした(ーー;)
バグ的なもので再インストールしたほうがいいのでしょうか・・・
うーん・・・やはり見つかりませんでした(ーー;)
バグ的なもので再インストールしたほうがいいのでしょうか・・・
Re:龍神録で音を鳴らす処理を別ファイルに
>>polpolさん
直ることは少ないですが、私は困った時はとりあえずリビルドを行うようにしています。
一度試してみては如何でしょうか。
どうしても直らないのなら、プロジェクト一式アップして頂けると解決されやすいと思います。
直ることは少ないですが、私は困った時はとりあえずリビルドを行うようにしています。
一度試してみては如何でしょうか。
どうしても直らないのなら、プロジェクト一式アップして頂けると解決されやすいと思います。
Re:龍神録で音を鳴らす処理を別ファイルに
やはりリビルドしても同じようなエラーが出るようです。
>プロジェクト一式アップをアップできる
そうですね。可能ならソースを見て頂きたいです
いいアップロダを教えてもらっていいでしょうか
>プロジェクト一式アップをアップできる
そうですね。可能ならソースを見て頂きたいです
いいアップロダを教えてもらっていいでしょうか
Re:龍神録で音を鳴らす処理を別ファイルに
ちょっと見ましたが、全体の構成がぐちゃぐちゃです。
cppファイルをインクルードしてたり、なぜかmain関数があったり、
ヘッダファイルに関数の定義を書いていたり、とりあえず色々問題がありすぎて指摘しきれません。
一度ファイル分割について、勉強しなおすべきだと思います。
もしくは、龍神録のプロジェクトファイルをダウンロードして、
それを参考にして作り直すことをお勧めします。
冷たい回答しかできなくてすいません。よろしくお願いします。
cppファイルをインクルードしてたり、なぜかmain関数があったり、
ヘッダファイルに関数の定義を書いていたり、とりあえず色々問題がありすぎて指摘しきれません。
一度ファイル分割について、勉強しなおすべきだと思います。
もしくは、龍神録のプロジェクトファイルをダウンロードして、
それを参考にして作り直すことをお勧めします。
冷たい回答しかできなくてすいません。よろしくお願いします。
Re:龍神録で音を鳴らす処理を別ファイルに
>Justyさん
そうですね。同じく(?music_play@@YAXXZ) は既に mymain.obj で定義されています。
というエラーが出ます
そうですね。同じく(?music_play@@YAXXZ) は既に mymain.obj で定義されています。
というエラーが出ます
Re:龍神録で音を鳴らす処理を別ファイルに
話がかみ合っていないようですが、アップロードされていた zip内にある Debug/BuildLog.htmをみるかぎり、
ビルドに成功しています。
試しにこちらでビルドもしてみましたが、やはりビルドは成功します。
つまりこちらからそのエラーを確認することができていません。
何をしたらエラーが出るのですか?
ビルドに成功しています。
試しにこちらでビルドもしてみましたが、やはりビルドは成功します。
つまりこちらからそのエラーを確認することができていません。
何をしたらエラーが出るのですか?
Re:龍神録で音を鳴らす処理を別ファイルに
#include "kansuteigi.h"
というのは、ここにkansuteigi.hファイルの中身を差し込むという意味です。
kansuteigi.hにmusic_play関数を定義するコードがありますから、それをインクルードしているmymain.cppで定義しているということになります。
というのは、ここにkansuteigi.hファイルの中身を差し込むという意味です。
kansuteigi.hにmusic_play関数を定義するコードがありますから、それをインクルードしているmymain.cppで定義しているということになります。
Re:龍神録で音を鳴らす処理を別ファイルに
>何をしたらエラーが出るのですか?
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にこのコードを貼り付けてエラーが出ないように
するのが目的です
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:龍神録で音を鳴らす処理を別ファイルに
理解しました。
原因は mymain.cppで mymain2.cppをインクルードしているので mymain.cpp側で関数が定義されます。
同時に mymain2.cpp自身もプロジェクトに含まれているのでビルドされます。
そうすると、2つのソースコードで同じ関数が含まれることになり、リンク時にエラーになります。
通常、cppファイルで別の cppファイルをインクルードすることはないので、該当するインクルード行を
削除するか mymain2.cppをプロジェクトから外して下さい。
原因は mymain.cppで mymain2.cppをインクルードしているので mymain.cpp側で関数が定義されます。
同時に mymain2.cpp自身もプロジェクトに含まれているのでビルドされます。
そうすると、2つのソースコードで同じ関数が含まれることになり、リンク時にエラーになります。
通常、cppファイルで別の cppファイルをインクルードすることはないので、該当するインクルード行を
削除するか mymain2.cppをプロジェクトから外して下さい。
Re:龍神録で音を鳴らす処理を別ファイルに
なるほど。cppファイルをインクルードするのが原因ですか。
よく見るとISLeさんもシエルさんも同じような事書いてますね
勉強になりました
コードが多くなってきたので始めからファイル分割について勉強してみます。
とりあえず解決しました。ありがとうございます
よく見るとISLeさんもシエルさんも同じような事書いてますね
勉強になりました
コードが多くなってきたので始めからファイル分割について勉強してみます。
とりあえず解決しました。ありがとうございます