嵌套for循环不能正确迭代

时间:2012-02-07 05:59:04

标签: c# nested-loops

伙计们,我有一个非常奇怪的问题。我正在尝试实现一个嵌套的for循环,它将一个矩形拆分成更小的块,然后检查这些较小的块中哪些具有我在其中定义的数组中的点(大矩形是320 * 240 btw):

        int[,] edgetrunc = new int[edgeIndex, 2]; //edgeIndex is the number of points in the external array 
        Array.Copy(edgePoint, edgetrunc, edgeIndex*2);//truncates the nulls from the tail of my array
        int delx = 16;//width of block
        int dely = 12;//height of block

        int blockIndex = new int();
        bool[] block = new bool[(depthFrame.Width/delx)*(depthFrame.Height/dely)];

        for (int ymin = 0;ymin < depthFrame.Height;ymin += dely)
        {
            for (int xmin = 0; xmin < depthFrame.Width; xmin += delx)
            {
                blockIndex = (xmin / delx) + (ymin / dely);
                for (int i = 0; i < edgeIndex; i++)
                {
                    if (edgetrunc[i, 0] >= xmin && edgetrunc[i, 0] < xmin++ && edgetrunc[i, 1] >= ymin && edgetrunc[i, 1] < ymin++)
                    {
                        block[blockIndex] = true;
                        break;
                    }
                }
            }
        }
然而,这是问题,我在第二个for循环(xmin循环)上设置了一个断点并开始迭代它,并且xmin的值在第一次迭代时从0跳到320,然后停留在那里和ymin每次迭代都单独改变。我要去克里吗?我做错了什么?

PS我甚至测试了这个,我遇到了同样的问题:

    for (int ymin = 0;ymin < depthFrame.Height;ymin += dely)
    {
        for (int xmin = 0; xmin < depthFrame.Width; xmin += delx)
        {

        }
    }

编辑:

想通了,这很奇怪,显然它与我试图找到块索引的方式有关。为了解决这个问题,我在for循环之外将blockIndex初始化为0,并在第3个for循环之后放入blockIndex ++,感谢帮助,无论如何=)

        int blockIndex = 0;
        bool[] block = new bool[(depthFrame.Width/delx)*(depthFrame.Height/dely)];

        for (int ymin = 0;ymin < depthFrame.Height;ymin += dely)
        {
            for (int xmin = 0; xmin < depthFrame.Width; xmin += delx)
            {
                for (int i = 0; i < edgeIndex; i++)
                {
                    if ((edgetrunc[i, 0] >= xmin) && (edgetrunc[i, 0] < (xmin + delx)) && (edgetrunc[i, 1] >= ymin) && (edgetrunc[i, 1] < (ymin + dely)))
                    {
                        block[blockIndex] = true;
                        break;
                    }
                }
                blockIndex++;
            }
        }

3 个答案:

答案 0 :(得分:2)

我认为您可能打算使用xmin + 1和ymin + 1,而不是使用xmin ++和ymin ++。 ++将改变变量中的值。

答案 1 :(得分:0)

在第一次内循环迭代中,运行以下命令:

xmin++

作为最内层循环中if语句的一部分。这将执行320次,因此您的价值。第二次迭代,

edgetrunc[i, 0] >= xmin

将为false,因此xmin++行不会被执行。通常,您应该避免在if语句中使用xmin++之类的变异语句。重构一下,看看它是否解决了你的问题

答案 2 :(得分:0)

它跳起来的原因是因为你的内循环内的xmin++语句中有if

根据xmin的值,这可以非常轻松地提升edgeIndex的价值。

x++递增x然后使用其旧值。我认为您需要的只是x+1,它使用值加1而不更改值。

同样适用于ymin++

换句话说,它应该是:

if (edgetrunc[i, 0] >= xmin && edgetrunc[i, 0] < xmin + 1 &&
    edgetrunc[i, 1] >= ymin && edgetrunc[i, 1] < ymin + 1)