2013-05-01 6 views
0

В моем коде у меня есть вложенный цикл, который не выполняет итерацию за исключением оператора if, который всегда возникает независимо от того, какое условие. Без выражения if часть кода цикла for, которая выполняет итерацию цикла, становится недоступной. Независимо от того, что я пробовал, мне не удалось заставить внутренний цикл повторить.Вложенная петля, не повторяющаяся

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

+0

Положите точку прерывания на 'break;' и убедитесь, что значения j и sizeX - это то, что вы ожидаете (оба 499). – Cemafor

ответ

1

Вы должны использовать полное имя для обращения к статической переменной-члена класса, как ваш sizeX и sizeY.
Here - статья на эту тему.

Надеюсь, это поможет!

+0

«Чтобы ссылаться на статический член x, используйте полное имя (*, если оно не доступно из той же области *)« sizeX и sizeY доступны из одного класса, поэтому они находятся в пределах области действия. Полностью квалифицировать имя не повредит, но не нужно. – Cemafor

+0

Если только не определены локальные значения sizeX и sizeY. – Cemafor

0

Думаю, нам понадобится больше кода. Я скопировал ваш код в основное тестовое приложение winforms, и оба моих цикла повторяются, как и ожидалось.

Я не знаком с XNA или что такое «VoxelPosition» есть, но я думаю, что у вас есть таится ошибка здесь:

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

Вы просто хранить один и тот же указатель в очень большом массиве - все записи будут указывать на один и тот же объект.

Вам нужно будет объявлять другой объект каждый раз через цикл для хранения отдельных записей вектора.

Надеюсь, это поможет?

+0

voxelPosition - это вектор2, который является структурой. В массив помещается новая копия (а не указатель). – Cemafor

+0

Ahhh. Он выглядит как класс из этого фрагмента кода. Знание домена помогает здесь, эй? :) –

+0

Да, я немного работал с XNA в прошлом. Вы, конечно, были бы правы, если бы это был класс. – Cemafor

Смежные вопросы