2013-05-01 96 views
0

在我的代碼中,我有一個嵌套循環,它不會迭代if語句的異常,該語句總是無論發生什麼情況都會發生。如果沒有if語句,循環迭代循環的部分代碼變得無法訪問。無論我嘗試過什麼,我都無法獲得內部循環來迭代。嵌套循環沒有迭代

class Map 
    { 
     public int Width { get; set; } 
     public int Height { get; set; } 
     public Vector2[] positions = new Vector2[500*500]; 

     private GroundVoxel[,] map = new GroundVoxel[500, 500]; 
     private Vector2 voxelPosition = new Vector2(0,0); 
     private static int sizeX = 499, sizeY = 499, airLevel = 425; 
     private int positionX = 0, positionY = 0, vectorNumber = 0; 

     public Map() 
     { 
     } 
     public Vector2[] Initialize() 
     { 
      for (int i = 0; i <= sizeY; i++) 
      { 
       for (int j = 0; j <= sizeX; j++) <-- This does not iterate. 
       { 
        map[positionX, positionY] = new GroundVoxel(voxelPosition); 
        voxelPosition.X += 80; 
        positions[vectorNumber] = voxelPosition; 
        vectorNumber += 1; 
        if (j == sizeX) <-- This always executes even though j != sizeX. 
        { 
         break; 
        } 
       } 
       voxelPosition.Y += 80; 
       voxelPosition.X = 0; 
      } 
      return positions; 
     } 
    } 
} 
+0

單步執行代碼。驗證'sizeX'是否> 0。如果你的循環從不迭代,那麼在它開始迭代之前滿足退出循環的條件。 – tnw 2013-05-01 15:33:46

+0

在break處設置一個斷點,並確保j和sizeX的值是你期望的(都是499)。 – Cemafor 2013-05-01 15:42:47

回答

1

你必須使用完全合格的名稱來引用類的靜態成員變量像你sizeXsizeY
Here是關於這個問題的文章。

希望這會有所幫助!

+0

「要引用靜態成員x,請使用完全限定名稱(*,除非它可從相同範圍*訪問)」sizeX和sizeY是從同一個類中訪問的,因此它們在範圍內。完全符合該名稱不會傷害,但不是必需的。 – Cemafor 2013-05-01 15:37:52

+0

除非存在本地定義的sizeX和sizeY。 – Cemafor 2013-05-01 15:40:32

0

我想我們需要更多的代碼。我已經將你的代碼複製到一個基本的winforms測試應用程序中,並且我的循環都按預期進行了迭代。

我不熟悉的XNA或什麼是「VoxelPosition」是的,但我認爲你有一個潛伏的bug在這裏:

voxelPosition.X += 80; 
positions[vectorNumber] = voxelPosition; 

你只是存儲一個非常大的陣列相同的指針 - 所有的條目都將指向同一個對象。

您需要每次通過循環聲明另一個對象以存儲個別向量條目。

希望這有助於?

+0

voxelPosition是一個Vector2,它是一個結構。新的副本放入數組(不是指針)。 – Cemafor 2013-05-01 15:44:34

+0

啊。它看起來像這個代碼片段中的一個類。領域知識在這裏有幫助,嘿? :) – 2013-05-01 15:50:41

+0

是的,我在過去曾與XNA合作過。如果它實際上是一堂課,你當然會是對的。 – Cemafor 2013-05-01 15:57:57