退出时,循环不会正确迭代

时间:2013-11-19 15:38:30

标签: c# arrays loops xna

我的XNA程序有一个while循环(最初是一个for循环,它有同样的问题,我改为允许更清晰的退出),它应该循环通过类unitTank的数组,找到第一个null条目并创建一个新对象在那个位置,像这样:

public void createBlueTank(float X, float Y)
{
    Boolean done = false;
    int i = 0;
    while (i < blueTank.Length - 1 && done == false)
    {
        if (blueTank[i] == null)
        {
            blueTank[i] = new unitTank(0, new Vector2(X, Y), this);
            done = true;
        }
        i++;

    }
}

blueTank的创建方法工作正常(我已经检查过),这里的问题是如果循环包含任何允许它以任何方式退出的代码,迭代中的先前代码就不会得到实现。也就是说,如果我删除done = true;(或原始for循环中的break),那么循环会按照预期的方式为数组blueTank中的每个空值创建一个新的unitTank,但是如果我在第一次完成后将其更改为退出循环,则根本不会发生。

此外,我注意到,如果我在检查blueTank[i]为空i+2之后更改了 em 内的所有引用(因为在测试中)环境索引0和1已定义,但2个以上不是);或者如果我将i的初始化更改为int i = 2,则循环按预期工作。这是if语句错误地将blueTank[0]读为null的问题,但是赋值语句没有覆盖该索引中的现有实例,然后循环在它到达真正的空索引之前被取消了吗?如果是这样,为什么会发生这种情况?

2 个答案:

答案 0 :(得分:1)

Is this an issue with the if statement erroneously reading blueTank[0] as null, but the assignment statement not overwriting the existing instance inside that index,

我认为当时blueTank[0]bluetank[1] 实际上 null是完全合理的。在调试器中放置一个断点,您应该能够看到哪些值是null

答案 1 :(得分:0)

所以只是为了排除一个简单的拼写错误...你说这个for循环不起作用?

        for (var i = 0; i < blueTank.Length; i++)
        {
            if (blueTank[i] == null)
            {
                blueTank[i] = new unitTank(0, new Vector2(X, Y), this);
                break;  
            }
        }