0

.datファイルの内容を読み取り、unordered_mapを次のように入力しています。

bool FileManager::LoadSkillList(LPCSTR name)
{
    int counter = 0;
    std::ifstream myFile(name, std::ios::binary | std::ios::out );
    if(myFile.fail())
    {
        myFile.close();
        return false;
    }
    char skill[0x12C];
    ZeroMemory(skill,0x12C);
    char buff[100];
    while(counter != TOTAL_SKILLS)
    {
        myFile.read(skill,0x12C);

        if(myFile.gcount() < 1) continue;

        auto skillBlock = (SkillInfo*)&skill;

#ifdef _DEBUG
        char* skillName = skillBlock->szSkillName;
        int delay = skillBlock->delayTime;

        wsprintf(buff,"Skill Name: %s - Delay: %d\r\n",skillName,delay);
        Log(buff);
#endif

        this->skills.insert(std::make_pair(counter,skillBlock));

        if(myFile.gcount() > 0) counter++;
        myFile.seekg( counter * 0x12C);
    }
#ifdef _DEBUG
    Log("Skill count: %d\r\n",(int)this->skills.size());
#endif
    myFile.close();

    return (counter>0)?true:false;
}

LoadSkillListメソッド内のマップ値を取得しようとすると、正常に機能します。しかし、unordered_map値を取得するために、FileManagerクラスに別のメソッドがあります。これは他のクラスからアクセスされます。

for(int skillNumber = 0; skillNumber < TOTAL_SKILLS; skillNumber++)
{
    auto fileDelay = fManager->getDelay(skillNumber);
}
// ...

int FileManager::getDelay(int n)
{
    auto block = this->skills.at(n);
    return block->delayTime;
} 

しかし、どういうわけか、私のアプリはそのメソッド内でクラッシュします。(私はdllを構築していて、デバッガーでチェックアウトしました。)

何が起こっているのかについての手がかりはありますか?すでに試行しstd::array, std::mapても成功しませんでしたが、どちらも同じメソッドでクラッシュします。

4

1 に答える 1

0

私はこれを行うことで私の問題を解決しました:

skills静的として宣言されています。unordered_map次のような値を追加します。

        FileManager::skills.insert(std::make_pair(counter, new SkillInfo()));
    memcpy(this->skills[counter],skillBlock,sizeof(SkillInfo));

次のように目的の値を取得します。

int FileManager::getDelay(int n)
{
auto block = FileManager::skills[n];
return block->delayTime;
}
于 2012-07-17T18:37:30.010 に答える