嵌套的for循环未正确迭代

本文关键字:迭代 循环 for 嵌套 | 更新日期: 2023-09-27 18:22:43

伙计们,我有一个非常奇怪的问题。我正在尝试实现一个嵌套的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,并在第三个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++;
            }
        }

嵌套的for循环未正确迭代

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

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

xmin++

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

edgetrunc[i, 0] >= xmin

将为false,因此xmin++行将不会被执行。通常,应避免在if语句中使用xmin++等突变语句。重新考虑一下,看看它是否解决了你的问题

它之所以如此跳跃,是因为在内部循环的if语句中有xmin++

这可以很容易地根据edgeIndex的值来快速驱动xmin的值。

CCD_ 7递增CCD_。我认为您需要的只是x+1,它使用值加一,而不更改值。

ymin++也是如此。

换句话说,它可能应该是:

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