0

わかりましたので、ハイスコアシステムを作成しようとしていて、オブジェクト内でクラスの配列を使用していますが、タイトルにエラーが表示され、何らかの理由でオブジェクトが null 変数でいっぱいであることを示しています。ここに私のクラスがあります:

class HighScores
{
    public HighScore[] MyScores = new HighScore[5];

    protected bool failedRead = false;

    private void SortHighScores(string NewName, int NewScore)
    {
        HighScore[] TmpScores = new HighScore[6];

        for (int i = 0; i < 5; i++)
        {
            TmpScores[i].Name = MyScores[i].Name; // Error Occurs here for `MyScores[i].Name` however in output box both MyScores and TmpScores show null
            TmpScores[i].Score = MyScores[i].Score;
        }
        TmpScores[5].Name = NewName;
        TmpScores[5].Score = NewScore;

        Array.Sort(TmpScores, delegate(HighScore x, HighScore y) { return x.Score.CompareTo(y.Score); });
        Array.Reverse(TmpScores);

        MyScores = new HighScore[5];
        for (int i = 0; i < 5; i++)
        {
            MyScores[i].Name = TmpScores[i].Name;
            MyScores[i].Score = TmpScores[i].Score;
        }
    }
}

class HighScore
{
    public string Name = "hello world";
    public int Score = 0;
}

そして、ここでオブジェクトを初期化しますHighScores:

HighScores GameScores;
protected override void Initialize()
{
    base.Initialize();
    GameScores = new Highscores();
}

私がそれらを作成した場合、確かにオブジェクトはnullであってはなりませんnewか?

[編集]

では、クラス HighScores 内に新しい関数を作成して、MyScores オブジェクトを新しい HighScore オブジェクトとして初期化しました。

public void InitScores()
{
    for (int i = 0; i < 5; i++)
    {
        MyScores[i] = new HighScore();
    }
}

これは内部で呼び出されますprotected override void Initialize()(XNA の標準です)。クラス関数にも同じコードを追加しました: GameScores.SortHighScoresto initialise TmpScores.

それでも同じエラー、発生する場所は同じですが、アイデアはありますか?

4

2 に答える 2

2

配列のインスタンスを作成する必要があるようですHighScoreMyScores上記のコードでは配列のみを作成します。

したがって、コードのどこかに次のようなコードが必要です

MyScores[i] = new HighScore();
于 2013-02-11T22:54:30.353 に答える
1

の初期化でGameScoresは不十分です。の内部配列の値を初期化しませんMyScores(少なくとも、示されているコードでは)。もちろん、その配列の要素を使用しようとすると、NullReferenceException

HighScores のコンストラクターに、次のようなコードを追加する必要があります

public HighScores()
{
    MyScores = new HighScore[5];
    for(x = 0; x < 5; x++)
        MyScores[i] = new HighScore();

}

編集:

このコードには同じ概念上のエラーがあります

HighScore[] TmpScores = new HighScore[6];

for (int i = 0; i < 5; i++)
{
    TmpScores[i].Name = MyScores[i].Name;             
    TmpScores[i].Score = MyScores[i].Score;
}

ここでは、HighScore 型の 6 つの要素を格納するためのスペースを持つ TmpScores という配列を宣言しますが、これらの 6 つの要素はすべてnullであるため、null である要素 (i) の変数 Name または Score に代入することはできません。

おそらく、このコードはあなたのために働くでしょう:

    for (int i = 0; i < 5; i++)
    {
        // Assign to tmpScores an already initialized object HighScore
        TmpScores[i] = MyScores[i];
    }

    TmpScores[5] = new HighScore {Name = NewName, Score = NewScore};
于 2013-02-11T22:55:53.923 に答える