【发布时间】: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 <= width正在访问一个未初始化的变量,结果无法预料。 (而且你不需要在循环内重新分配它,除非它会改变,但这主要是一个效率问题。)假设width没问题,你的外循环迭代width+1次,这看起来很奇怪;for (int g = 0; g < width; g++)会更惯用。cells是如何声明的?您是否有可能在cells的范围之外分配元素? -
你能发布一个small和complete版本的程序来展示这个问题,这样我们就不必问所有这些问题了吗?