2012-01-07 75 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。