二维数组赋值:“没有为对象的实例设置对象的引用”

时间:2012-02-19 18:47:39

标签: c# multidimensional-array

我得到“没有为对象实例设置对象的引用”运行时错误,建议:“使用new关键字创建对象实例。 但我不明白我做错了什么。

有我的代码:

int numListas = 10;    
x = 15;
int[][] listas;
listas = new int[numListas][];
Random random = new Random(); // generate random number
for (idx = 0; idx < numListas; idx++)
{
 int idx_el;
 for (idx_el = 0; idx_el < x ; idx_el++)
 {
  listas[idx][idx_el] = random.Next(0,100);
 }
}

4 个答案:

答案 0 :(得分:1)

您没有为第二维 listas = new int[numListas][];设置维度。

当您使用x作为循环限制时,请将其用作维度:

for (idx = 0; idx < numListas; idx++)
{
 int idx_el;
 listas[idx] = new int[x]; // initialize the second dimension
 for (idx_el = 0; idx_el < x ; idx_el++)
 {
  listas[idx][idx_el] = random.Next(0,100);
 }
}

或者,您可以在开头使用矩形阵列:

int[,] listas = new int[numListas,x];

答案 1 :(得分:1)

这一行:

int[][] listas;

声明一个变量,它是对数组的引用。

的引用

这一行:

listas = new int[numListas][];

初始化变量以引用numListas数组引用的数组......但这些“子数组”引用中的每一个都为空以便开始。你需要初始化每个“子阵列”,可能在你的外循环中:

for (idx = 0; idx < numListas; idx++)
{
    listas[idx] = new int[x];
    ...
}

请注意,另一种方法是使用矩形数组而不是数组数组:

int[,] listas = new int[numListas, x];
...

// In your loop
listas[idx, idx_el] = random.Next(0, 100);

顺便说一句,当您一起声明和初始化变量时,代码通常会更清楚地读取,而不是先提前声明它们,然后再将它们初始化。此外,C#变量名称中的下划线并不是非常惯用,并且整体变量名称并不十分清楚。我将你的代码编写为:

// Consider declaring these as constants outside the method
int rowCount = 10;
int columnCount = 15;

int[][] values = new int[rowCount];
Random random = new Random();
for (int row = 0; row < rowCount; row++)
{
    values[row] = new int[columnCount];
    for (int column = 0; column < columnCount; column++)
    {
        values[row][column] = random.Next(100);
    }
}

您还应该考虑在方法之外初始化单个Random实例并将其传入 - 有关详细信息,请参阅我的article on Random

答案 2 :(得分:1)

您需要初始化锯齿状数组中的每个内部数组:

int numListas = 10;    
x = 15;
int[][] listas;
listas = new int[numListas][];
Random random = new Random(); // generate random number
for (idx = 0; idx < numListas; idx++)
{
 listas[idx] = new int[x];   // initialize inner array
 int idx_el;
 for (idx_el = 0; idx_el < x ; idx_el++)
 {
  listas[idx][idx_el] = random.Next(0,100);
 }
}

或者,您可以使用二维数组:

int numListas = 10;    
x = 15;
int[,] listas;
listas = new int[numListas,x];   // 2D array
Random random = new Random(); // generate random number
for (idx = 0; idx < numListas; idx++)
{
 int idx_el;
 for (idx_el = 0; idx_el < x ; idx_el++)
 {
  listas[idx,idx_el] = random.Next(0,100);
 }
}

答案 3 :(得分:0)

您是否忘记初始化数组的第二维?

listas = new int[numListas][x];
            initialize this ^