-3

クラス内の配列を初期化しようとしています。「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。

これが私のNPCクラスです:

namespace EngineTest
{
    public class npcs
    {
      public int tileX, tileY, layerZ;
      public int textureX, textureY;
      public string ID;
      public string state;
      public int direction; //0 = south, 1= west, 2 = north, 3= east
      public int moveLimitTimer;
      public int animationCurrentFrame;
      public int animationResetTimer;

      public pathPotentials[, ,] pathPotential; (this is the array)
    }
}

ここにpathPotentialsクラスがあります

namespace EngineTest
{

public class npcs
{
    public int tileX, tileY, layerZ;
    public int textureX, textureY;
    public string ID;
    public string state;
    public int direction; //0 = south, 1= west, 2 = north, 3= east
    public int moveLimitTimer;
    public int animationCurrentFrame;
    public int animationResetTimer;

    public pathPotentials[, ,] pathPotential = new pathPotentials[Program.newMapWidth, Program.newMapHeight, Program.newMapLayers];
}
}

このコードで初期化しようとしました:

        for (z = 0; z < Program.newMapLayers; z++)
        {
            for (x = 0; x < Program.newMapWidth; x++)
            {
                for (y = 0; y < Program.newMapHeight; y++)
                {
                    if(Program.tileNpcs[x, y, z].npcs.Count > 0)
                    {
                        Program.tileNpcs[x, y, z].npcs[0].pathPotential[Program.newMapWidth, Program.newMapHeight, Program.newMapLayers] = new pathPotentials();
                    }
                }
            }
        }

しかし、うまくいきません。私は何をすべきか?前もって感謝します。

4

2 に答える 2

0

初期化する前に配列の特定の項目を参照しているため、コードはエラーを発生させるようにバインドされています。あなたの声明の代わりに:

Program.tileNpcs[x, y, z].npcs[i].pathPotential[Program.newMapWidth, Program.newMapHeight, Program.newMapLayers] = new pathPotentials();

あなたはそれをこのようにするべきです:

Program.tileNpcs[x, y, z].npcs[i].pathPotential = new pathPotentials[Program.newMapWidth, Program.newMapHeight, Program.newMapLayers];

お役に立てば幸いです。

于 2012-12-05T09:30:26.280 に答える
0

C# (およびこのタイプの多くのプログラミング言語) では、配列は固定長です。C# では、配列は一連の値とともにオブジェクトとして格納されます。配列内の要素への代入は、オブジェクトのフィールドを変更するようなものです。最初に配列を明示的に定義する必要があります。明示的に定義しないと、C# は配列に割り当てるメモリの量がわからないため、メモリを構造化するときに多くの問題が発生する可能性があります。

3 次元配列を宣言しますが、それを定義しません。

public pathPotentials[, ,] pathPotential;

必要なものは次のようなものです。

public pathPotentials[, ,] pathPotential = new pathPotentials[Program.newMapWidth, Program.newMapHeight, Program.newMapLayers];

これにより、配列を作成する大きさが C# に正確に伝えられます。

ただし、これにより、宣言された配列のサイズを変更することはできません (少なくとも再定義してクリアしない限り)。実行時にサイズを変更する必要がある場合、C# はクラス List を提供します。これは汎用パラメーターを受け取ります (この場合、3D グリッドの場合はかなり複雑です)。次のようにリストで次のように宣言できます。

public List<List<List<pathPotentials>>> pathPotential = new List<List<List<pathPotentials>>>();

これにより、リストのリストのネストされたリストが得られます。最も内側のリストは z、最も外側の x かもしれません。これからデータを取得するには、inex を指定できますが、表記として [x,y,z] を使用することはできなくなり、代わりに [x][y][z] を使用する必要があります。別のリスト項目を取得し、そのリストにアクセスして 2 番目のリスト項目を取得し、そのリストにアクセスしてオブジェクトを取得します。

うまくいけば、何が問題なのか、コードが機能しない理由、およびそれを修正する方法を理解するのに役立ちました.

于 2012-12-05T09:58:06.073 に答える