-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],因为您正在访问列表以获取另一个列表项,然后访问该列表以获取第二个列表项,然后访问该列表项以获取您的对象。

希望这可以帮助您了解哪里出了问题、为什么您的代码不起作用以及如何修复它。

于 2012-12-05T09:58:06.073 回答