由於我的粗心大意,犯了個不該犯的錯誤,幸好經過調試找到了Bug。
大伙都了解:for循環一般在
for(;;這里)
{
......
}
寫那個疊加變量(迭代器)的。而while循環一般在
while()
{
...
這里;
}
寫疊加變量的。我犯的錯誤就是for循環在兩個地方都寫了疊加變量,結果你懂的。
大家看看下面的代碼:
1 void Func(void) 2 { 3 vector<Boat*>::iterator it_Boat = m_pBoats.begin(); 4 vector<Claw*>::iterator it_Claw = m_pClaws.begin(); 5 while (it_Boat != m_pBoats.end()) 6 { 7 (*it_Boat++)->Draw(); 8 (*it_Claw++)->Draw(); 9 } 10 11 for (vector<Treasure*>::iterator it = m_pTreasures.begin(); 12 it != m_pTreasures.end(); it++) 13 { 14 (*it++)->Draw(); 15 } 16 }
大家也許也一眼看到了錯誤所在,大家看到第12行和第14行。兩個地方都用了it++,這不就是it+=2了嗎?對啊,我犯這個錯誤時由於下面的寫的時候是copy上面的while循環的。這下好了,忘記刪除it++了。結果導致了嚴重的錯誤。當時調試到這里時我還沒發現有兩個it++(郁悶吧!^-^)。改正后的代碼:
1 void Func(void) 2 { 3 vector<Boat*>::iterator it_Boat = m_pBoats.begin(); 4 vector<Claw*>::iterator it_Claw = m_pClaws.begin(); 5 while (it_Boat != m_pBoats.end()) 6 { 7 (*it_Boat++)->Draw(); 8 (*it_Claw++)->Draw(); 9 } 10 11 for (vector<Treasure*>::iterator it = m_pTreasures.begin(); 12 it != m_pTreasures.end(); it++) 13 { 14 (*it)->Draw(); 15 } 16 }
我開始是這樣改的:
1 void Func(void) 2 { 3 vector<Boat*>::iterator it_Boat = m_pBoats.begin(); 4 vector<Claw*>::iterator it_Claw = m_pClaws.begin(); 5 while (it_Boat != m_pBoats.end()) 6 { 7 (*it_Boat++)->Draw(); 8 (*it_Claw++)->Draw(); 9 } 10 11 for (int i=0; i<10; i++) 12 { 13 m_pTreasures[i]->Draw(); 14 } 15 }
我沒發現有兩個it++,我這樣修改后程序正常運行。我就以為是vs對stl支持的問題了(這種想法都有了,上吊吧我)。我想了想,其他地方也有上面的迭代器的for循環啊,也沒錯啊。所以我在仔細看看代碼。結果就找到了兩個it++。再然后就修改好了。再然后就沒有然后了。程序就結束了。
我發表這篇文章有兩個意圖:
<1> 給自己一個警醒,不要犯同樣的錯誤
<2> 給看這篇文章的網友們一個建議
上個月在參加培訓的時候,聽到老師講到了一句話:“代碼相似的時候盡量copy代碼”。這句話我記住了,一是減少重復輸入,二是減少書寫錯誤的變量名。結果導致我這個問題發生了。我給網友們的建議是:“代碼相似的時候也盡量copy代碼,但是注意while循環和for循環”。同樣的也許還會有其他的地方需要注意不能亂copy的。所以,copy代碼時一定得仔細點。謝謝你花時間看到這里。有意見請評論。一個小Bug搞垮一個大軟件(借用:“一粒老鼠屎,壞了一鍋湯”)