【问题标题】:Variable being changed inside for loop for no reason无缘无故在for循环内更改变量
【发布时间】:2012-01-07 21:53:13
【问题描述】:
for(int g = 0; g <= width; g++)
{
    std::cout << width << "\n";
    std::cout << g << "\n";
    for(int h = 0; h <= height; h++)
    {
        int rx = g;
        int ry = h;
        if(h == 0 || img.GetPixel(rx, ry - 1) == sf::Color::Black)
        {
            cells[g/2][h/2].up = true;
        }
        if(g == 0 || img.GetPixel(rx - 1, ry) == sf::Color::Black)
        {
            cells[g/2][h/2].left = true;
        }
    }
}

所以我把这段代码放在这里。宽度设置为 197,效果很好,填满了整个数组。但是,当 g 达到 196 宽度时,它会随机变为 453。我不知道发生了什么,有人可以帮我吗?

这个程序的目的是遍历一个数组,并在需要时将墙分配给单元格(这是一个迷宫)。

我已经确认宽度正在改变,而不是别的什么。我不明白为什么会有任何改变,没有其他线程在运行,img 来自 SFML,所以什么都不会发生。

周边的Pastebin,相关代码:http://pastebin.com/Q7jyZYrR 需要 SFML,如果您注释掉使用它的部分,则不会发生崩溃。

【问题讨论】:

  • 所以你说img.GetWidth() 在循环中每次都返回 197,直到它突然变为 453。如果不知道 img.GetWidth() 中的内容,我们很难告诉你为什么会发生这种情况。查看img.GetWidth() 的实现,找出答案。
  • 据我所知,如果其他线程正在处理img 对象,那么width 可以改变的唯一方法............
  • 为什么在循环的每次迭代中都分配宽度?在循环上方查询一次宽度还不够吗?
  • 你在进入循环之前给width赋值了吗?如果不是,g &lt;= width 正在访问一个未初始化的变量,结果无法预料。 (而且你不需要在循环内重新分配它,除非它会改变,但这主要是一个效率问题。)假设width 没问题,你的外循环迭代width+1 次,这看起来很奇怪; for (int g = 0; g &lt; width; g++) 会更惯用。 cells 是如何声明的?您是否有可能在cells 的范围之外分配元素?
  • 你能发布一个smallcomplete版本的程序来展示这个问题,这样我们就不必问所有这些问题了吗?

标签: c++ loops for-loop


【解决方案1】:

如果高度是偶数,我猜你会溢出 cells[][] 数组,因为循环使用h &lt;= height 作为结束条件。例如,考虑height=2 这使得cells[][1] 并且当h=2cells[][h/2] => cells[][1] 时溢出。如果宽度是偶数,也会发生这种情况。

要么将两个循环的结束条件更改为&lt;,要么将cells 数组的大小在每个维度上增加一。

【讨论】:

    【解决方案2】:

    widthfor 循环中的一个条件,但您正在更改width 的值 每个循环 width = img.GetWidth();

    for(int g = 0; g <= width; g++) 
    { 
        width = img.GetWidth(); 
    

    把它放在for循环之前..

    width = img.GetWidth(); 
    for(int g = 0; g <= width; g++) 
    { 
    

    【讨论】:

    • 循环内部的 witdh 只是我为了阻止它在最后发生变化而采取的一种疯狂措施,但没有奏效。那条线也在循环之外。
    • 建议:与其在循环中重新分配它(这充其量会隐藏任何潜在问题),不如将(临时)代码添加到检查它是否具有预期值,如果它被改变了,就会死掉并显示一个明确的错误消息。
    猜你喜欢
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2011-08-05
    相关资源
    最近更新 更多