2012-01-07 76 views
-2
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.我不知道发生了什么,任何人都可以帮助我吗?变量正在内部更换for循环无故

该程序的目的是循环访问数组,并根据需要将单元格分配给单元格(这是一个迷宫)。

我已确认宽度正在变化,而不是别的。我看不出为什么会有所改变,但是,没有其他线程在运行,img来自SFML,所以什么也不应该发生。

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

+1

所以你说'img.GetWidth()'每次在循环周围都会返回197,直到它突然变为453为止。我们很难告诉你为什么会发生'img.GetWidth()'中的内容。查看'img.GetWidth()'的实现来找出答案。 – 2012-01-07 21:56:59

+0

从我所看到的情况来看,如果某个其他线程正在对'img'对象进行某种操作,那么'宽度'可以改变的唯一方法............ – 2012-01-07 21:57:00

+0

为什么在每次迭代中分配宽度循环?在循环之上查询宽度是不够的? – Thilo 2012-01-07 21:57:33

回答

0

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++) 
{ 
+0

循环内的witdh简直是我的一个疯狂措施, – Chris 2012-01-07 22:10:12

+0

建议:不要在循环内重新分配它(它最多可以隐藏任何潜在的问题),而是添加(临时)代码*检查*它有期望的值,并且如果它被改变,并且具有明确的错误消息。 – 2012-01-07 22:56:15

2

如果height是偶数,由于使用h <= height作为e的循环,我猜想你会溢出cells [] []数组nd状态。例如,考虑height=2,这使得cells[][1]和你h=2cells[][h/2] =>cells[][1]上溢出。如果宽度均匀,这也会发生。

要么将​​两个循环的结束条件更改为<,要么将cells数组的大小增加1。