-1

したがって、これは私の main / Initializer 関数の縮小版です。それを呼び出して、プレーヤーの発明者にアイテムを追加する必要がある場合、Debug Assertation Failed エラーが発生します。

スコープを多少混同しているように思えますか?
関数のスコープ内で何か新しいことを宣言していて、メインで再びアクセスできないのでしょうか?
割り当ての代わりにゲッター/セッターを使用するなど、関数内でいくつかのことを試しましたがp_player = p、実際には問題をまったく処理していないと思います。混乱しています。

int main()
{
    Array<Item> items(3);
    string itemsfilename = "itemsfile.txt";
    Initializer::InitializeItems(items, itemsfilename);

    Login login;
    Player p1;
    string filename = login.LoginToGame();
    Initializer::InitializePlayer(p1, rooms, items, 3, filename);
}  

void Initializer::InitializePlayer(Player& p_player, HashTable<string, Room>& p_rooms, Array<Item>& p_items, int p_numItems, std::string& p_filename)
{
    ifstream playerfile(p_filename);

    int inventorycount = 0;

    //all the stuff needed to make a player
    std::string name;
    int health;
    int confidence;
    int humor;
    int speed;
    std::string room;
    Room* currentRoom;
    Inventory inventory(100);

    //reading in values from file

    for(int i = 0; i < inventorycount; i++)
    {
        playerfile.getline(value, 256);
        std::string item(value);
        for(int j = 0; j < p_numItems; j++)
        {
            if(p_items[j].GetName() == item)
            {
                inventory.AddItem(&(p_items[j]));       //This line taken out, removes the error.
            }
        }
    }

    Player p(name, health, confidence, humor, speed, currentRoom, inventory);
    p_player = p;
}  

AddItem() はアイテムへのポインターを取り、それをその DLinkedList に追加します。

編集:
エラーは
Debug Assertation Failed! です。

プログラム: zzz
ファイル f:\dd/vctools/crt_bld/self_x86/crt/src/dbgdel.cpp 行: 52

式: _Block_TYPE_IS_VALID(pHead->nBlockUse)

AddItem() コード:

bool AddItem(Item* p_item)
{
    if(p_item->GetWeight() + m_weight <= m_maxWeight)
    {
        m_inventory.Append(p_item);
        m_weight += p_item->GetWeight();
    }
    else
    {
        return false;
    }
    return true;
}
4

1 に答える 1

1

わかりましたので、実際に問題を引き起こすコードはまだありませんが、何が起こっているのかを知っていると確信しており、「さらにコードを追加するための 20 の質問」に陥らないようにするために、次の 2 つのシナリオが考えられます。

  1. Items はオブジェクトの配列であり、オブジェクトへのポインターをm_inventoryコンテナーに格納します。このコンテナーを破棄すると、オブジェクトはdeleteアイテムを呼び出すことによって破棄されますが、コンテンツがヒープから割り当てられていないため、これは機能しません。
  2. コンテナーをコピーすると、ストレージへのポインターが失敗するためinventorym_inventoryコンテナーが適切にコピーされず、コンテンツがバラバラになります。

これで問題が解決しない場合は、内容がわからず、必要なすべてのコードを含む完全なプログラムとして質問に投稿できるファイルを使用せずに、コードをこの問題のみを示すものに減らしてみてください。 [必要のないその他のコードを削除] すると、すべてが表示されます。現在、コードのほんの一部しか確認できていませんが、問題はほぼ間違いなく、表示されたコードに直接含まれています。

于 2013-05-12T06:59:17.453 に答える