今回は、std::Listを使ってソフトを作っているのですが、push_backを使うと、
「0xC0000005: 場所 0xcdcdcdcd を読み込み中にアクセス違反が発生しました。」と出ます
Windows7, Visual C++ 2010 ExpressEdition, DxLib使用です
ソースコードはこれです
SoundDefine.h
#ifndef DEF_SOUNDDEFINE_H
#define DEF_SOUNDDEFINE_H
typedef struct{
int x, y;
}pos_t;
enum soundstate_t{
eSStoping,
eSPlaying,
eSFadeIn,
eSFadeOut,
};
struct constant_t{
pos_t Pos;
char name[50];
int SndHdl;
int TotalTime;
int FadeInTime, FadeOutTime;
bool bLoop;
};
struct variable_t{
int CurrentTime;
int Vol;
int FadeStartVol;
int FadeStartTime;
bool bPause;
soundstate_t State;
};
//実際の読み込みに使う方------------------------------------------------------------------------------------------
struct header_t{
bool bTimeDraw;
bool bVolDraw;
};
struct sound_t{
const constant_t Cnst;
variable_t Vary;
};
#endif
#ifndef DEF_SOUND_H
#define DEF_SOUND_H
#include <list>
#include <Singleton.h>
#include "SoundDefine.h"
class CSound : public CSingleton<CSound>{
private:
header_t m_Header;
std::list<sound_t> m_SoundList;
void DataInit();
public:
CSound();
~CSound();
bool Load(char FilePath[1024]);
inline header_t GetHeader(){
return m_Header;
}
inline std::list<sound_t> GetSoundList(){
return m_SoundList;
}
};
#endif
#include <DxLib.h>
#include "ScrReader.h"
#include "Sound.h"
CSound::CSound(){
DataInit();
}
CSound::~CSound(){
DataInit();
}
bool CSound::Load(char FilePath[1024]){
CScrReader ScrReader;
DataInit();
SetCreateSoundDataType(DX_SOUNDDATATYPE_FILE);
bool Result = ScrReader.GetData(&m_Header, &m_SoundList, FilePath);
SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMNOPRESS);
return Result;
}
//private------------------------------------------------------------------------------------------
void CSound::DataInit(){
for(std::list<sound_t>::iterator it = m_SoundList.begin(); it != m_SoundList.end();){
DeleteSoundMem((*it).Cnst.SndHdl);
it = m_SoundList.erase(it);
}
m_SoundList.clear();
ZeroMemory(&m_Header, sizeof(m_Header));
}
#ifndef DEF_SCRREADER_H
#define DEF_SCRREADER_H
#include <list>
#include "SoundDefine.h"
class CScrReader{
private:
bool GetHead(int FileHdl, header_t *vHeader);
bool GetBody(int FileHdl, std::list<sound_t> *vSound);
public:
bool GetData(header_t *vHeader, std::list<sound_t> *vList, char FilePath[1024]);
};
#endif
#include <DxLib.h>
#include <sstream>
#include "ScrReader.h"
static bool FileOpen(int *fp, char FilePath[1024]){
*fp = FileRead_open(FilePath);
if(*fp == 0){
MessageBox(NULL, "指定のファイルが開けませんでした。", "エラー", MB_ICONEXCLAMATION);
return false;
}
return true;
}
static bool SkipLine(int fp){
int c;
while(1){ //\nが出るまでループ、EOFならfalse
c = FileRead_getc(fp);
switch(c){
case EOF:
return false;
break;
case '\n':
return true;
break;
default:
//もう一回繰り返す
break;
}
}
return false;
}
static size_t GetNameLength(char name[]){
const static size_t MaxByte = 24;
size_t NameSize = strlen(name) - strlen(strrchr(name, (int)'.'));
size_t vByte = 0;
do{
if(MultiByteCharCheck(&name[vByte], DX_CHARSET_SHFTJIS)){
vByte+=2;
}else{
vByte++;
}
}while(vByte < MaxByte && vByte < NameSize);
return vByte;
}
//ScrReader------------------------------------------------------------------------------------------
bool CScrReader::GetData(header_t *vHeader, std::list<sound_t> *vList, char FilePath[1024]){
int FileHdl;
if(FileOpen(&FileHdl, FilePath) == false){
return false;
}
if(GetHead(FileHdl, vHeader) == false){
goto EX_ERR;
}
if(GetBody(FileHdl, vList) == false){
goto EX_ERR;
}else{
goto EX_OK;
}
EX_OK:
FileRead_close(FileHdl);
return true;
EX_ERR:
FileRead_close(FileHdl);
return false;
}
//private------------------------------------------------------------------------------------------
bool CScrReader::GetHead(int FileHdl, header_t *vHeader){
int n = FileRead_scanf(FileHdl, "%d,%d",
&vHeader->bTimeDraw,
&vHeader->bVolDraw
);
if(n != 2){
MessageBox(NULL, "SoundData Format Error : Header", "エラー", MB_ICONEXCLAMATION);
return false;
}
return SkipLine(FileHdl); //SkipLineして、その戻り値を返す
}
bool CScrReader::GetBody(int FileHdl, std::list<sound_t> *vList){
int line = 1;
while(1){
int c = FileRead_getc(FileHdl);
switch(c){
case EOF:
return true;
break;
case '/':
if(SkipLine(FileHdl) == false){
return true;
}
break;
default:
FileRead_seek(FileHdl, -1, SEEK_CUR);
break;
}
constant_t vCnst = {0};
variable_t vVary = {0};
int n = FileRead_scanf(FileHdl, "%d,%d,%d,%d,%d,%d,", //数値データ読み込み
&vCnst.Pos.x,
&vCnst.Pos.y,
&vVary.Vol,
&vCnst.FadeInTime,
&vCnst.FadeOutTime,
&vCnst.bLoop
);
if(n != 6){ //6個でなければエラー
std::ostringstream ostr;
ostr << "SoundData Format Error : [" << line << "行目] [" << n << "個]";
MessageBox(NULL, ostr.str().c_str(), "エラー", MB_ICONEXCLAMATION);
return false;
}
char SoundPath[512];
if(FileRead_gets(SoundPath, 512, FileHdl) == -1){ //行の最後までファイル名として読み込み
std::ostringstream ostr;
ostr << "SoundData Format Error : [" << line << "行目] [FilePath]";
MessageBox(NULL, ostr.str().c_str(), "エラー", MB_ICONEXCLAMATION);
return false;
}
vCnst.SndHdl = LoadSoundMem(SoundPath); //音楽ファイル読み込み
if(vCnst.SndHdl == -1){ //エラー
std::ostringstream ostr;
ostr << SoundPath << "が読み込めません";
MessageBox(NULL, ostr.str().c_str(), "読み込みエラー", MB_ICONEXCLAMATION);
}else{
vCnst.TotalTime = GetSoundTotalTime(vCnst.SndHdl); //総再生時間の取得
ChangeVolumeSoundMem(vVary.Vol, vCnst.SndHdl); //初期音量の設定
char *str = 1 + strrchr(SoundPath, (int)'/');
strncpy(vCnst.name, str, GetNameLength(str)); //ファイル名の決定
sound_t vPrm = {vCnst, vVary};
vList->push_back(vPrm); //Listに追加
}
line++; //次の行に移る
}
return true;
}
何が問題なのか分からないため、困っています
よろしくお願いします