0

リンクされたリストとして構築された、ゲームでユーザーが利用できるスキルにインデックスを付けるコードを書いています。リストを作成する関数を徹底的にテストしましたが、正しく機能しているようです (したがって、リストのヘッド ポインターは null であってはなりません)。リストをトラバースしてスキルに値を設定しようとすると、リスト内のメモリに書き込むコードが実行される前に、リストの検索関数内の一時ポインターをヘッド ポインターに初期化すると、プログラムがクラッシュします。 .

これをさらに奇妙にしているのは、利用可能なアイテムのリストを保存するリストに追加するまではうまく機能していたことです (そして、私はこれをかなり徹底的にテストしました)。 .

具体的なエラーは、ポインタが書き込みのためにメモリ インデックス 0x000000c にアクセスしていると思われることですが、その時点でコードがヌル ポインタをどのように処理しているかはまったくわかりません (プログラムを 10 回実行した後、OS はそのメモリのブロックを毎回一時ポインターに割り当て、それ以外はnullにしないでください。

私はおそらくこの時点でただのとりとめがないので、コードは次のとおりです。

デバッガによるエラーの原因となる関数:

void Mechanics::setSkillValue(int index, int value)
   {
    Skill *temp = FirstSkill; // << The error is happening on this line //

    while((temp != NULL)&&(temp->index != index))
    {
    temp = temp->next;
    }

    if (temp == NULL)
    {
        cout << "%";
    }
    else temp->setValue(value);

 // cout << temp->returnValue(); //This was a test check, not needed for anything
}

スキルとアイテムのリストを入力することになっている関数。

 void Mechanics::Populate()
 { 
 ifstream skillstream("Skills.txt");
 if(skillstream.is_open())
 {
    while(skillstream.good())
    {
        Skill *newskill;
        int indexval;
        string skillindex;
        string skillname;
        string skilldescription;

        cout << "TP4" << endl; //TEST POINT
        getline(skillstream, skillindex);
        cout << skillindex;
        getline(skillstream, skillname);
        cout << skillname;
        getline(skillstream, skilldescription);
        cout << skilldescription; cout << endl;

        indexval = atoi(skillindex.c_str());

        newskill = new Skill(skillname, skilldescription,indexval);
    //cout << "TP5" << endl; //TEST POINT
    if(newskill == NULL) cout << "NULL!!!";
    addSkill(newskill);
    }
}

ifstream itemstream("Items.txt");
if(itemstream.is_open())
{
    while(itemstream.good())
    {
        Item *newitem;
        int indexval;
        string skillindex;
        string skillname;
        string skilldescription;
        string abilitydescription;
        string valueSTR;
        string typeSTR;
        int value;
        int type;
        int numeric[5];
//          cout << "TP4" << endl; //TEST POINT
        getline(itemstream, skillindex);
//          cout << skillindex;
        getline(itemstream, skillname);
//      cout << skillname;
        getline(itemstream, skilldescription);
//      cout << skilldescription;
        getline(itemstream, abilitydescription);
        getline(itemstream, valueSTR);
        value = atoi(valueSTR.c_str());
        getline(itemstream,typeSTR);
        type = atoi(typeSTR.c_str());

        for (int i=0; i < 5; i++)
        {
            string numericSTR;
            getline(itemstream,numericSTR);
            numeric[i]=atoi(numericSTR.c_str());
        }


        indexval = atoi(skillindex.c_str());

        newitem = new Item(indexval, skilldescription, skillname, abilitydescription, value, type, numeric);
    //cout << "TP5" << endl; //TEST POINT
//  if(newskill == NULL) cout << "NULL!!!";
    addItem(newitem);
    }
}

実際にスキルをスキル リストに追加する関数:

void Mechanics::addSkill(Skill *nskill)
{
 Skill *temp = FirstSkill;

 if(FirstSkill == NULL)
 {
     FirstSkill = nskill;
     //cout << "TP1" << endl; //TEST POINT
       //FirstSkill->printname();
 }

 else
 {
    while((temp->next != NULL))
    {
    temp = temp-> next;
    //cout << "TP2" << endl; //TEST POINT
    //temp->printname(); cout << endl;
    }
     if (FirstSkill != NULL)
     {
         temp->next = nskill;
         nskill->next = NULL;
     }
 }
}

私が持っているコードはやや広範であるため、エラーをスローしている関数と相互作用する可能性のあるブロックのみを含めます。

これを読んでくれてありがとう、そしてあなたが提供できる支援があれば、私はこれに約6時間頭をぶつけていて、実際にこれを追跡する視点を失いました.

4

0 に答える 0