2017-10-15 130 views
1

我在C#中有一段代碼用數值填充數組。在Awake方法中,我設置了values數組的長度,但是當我嘗試在setSample方法中訪問它時,它將返回IndexOutOfRangeException。所述C#中的IndexOutOfRangeException - 爲什麼數組的長度變爲0?

public int gridSize = 32; 
public int width; 
public int height; 
public int featureSize = 32; 
public float[] values; 

public void Awake() { 

    width = gridSize; 
    height = gridSize; 
    float[] values = new float[6 * width * height]; 
    Debug.Log("Array length: " + values.Length); 

    for (int y = 0; y < height; y += featureSize) { 
     for (int x = 0; x < width; x += featureSize) { 
      setSample(x, y, Random.value); 
     } 
    } 
} 

public void setSample (int x, int y, float value) { 
    Debug.Log("Array length: " + values.Length); 
    values[((x & (width - 1)) + (y & (height - 1)) * gridSize)] = value; 
} 

我加入Debug.Log()線,其中給我的以下輸出:

數組長度:6144
數組長度:0
IndexOutOfRangeException:數組索引超出範圍。

這兩種方法和變量都是公開的,所以我不明白爲什麼應該有任何訪問問題。爲什麼在聲明之後數組發生了變化?是因爲它充滿了空值嗎?

+0

BTW *是不是因爲它是全空值*的情況並非如此 - 當你初始化數組它將被填入默認的類型 - 'float'爲0且不爲空 –

+2

您已經定義一個名爲'values'的局部變量與該類中的相同。所以你在'setSample()'中得到'null object reference error'而不是索引超出範圍異常。用'setSample()'中'x'和'y'的值,你會得到'index out of range error'? –

回答

2

而不是再次聲明你應該使用現有的values,在清醒的方法。

變化

float[] values = new float[6 * width * height]; 

values = new float[6 * width * height]; 
+0

使用現有的'values'刪除'空對象引用錯誤',但原始錯誤是'索引超出範圍' –