2014-03-27 33 views
0

那麼,標題是不言自明的。我已經徹底地測試了這些代碼,並且我發現,當調用getPixel時,代碼以某種方式重置「y」。這不應該是可能的,你會想,因爲該方法不需要一個指針,但不知何故,這是發生了什麼。如果我刪除調用getPixel的代碼行,代碼將完成,但顯然沒有任何用處。如果有人能夠弄清楚這裏發生了什麼,我會非常感激。 (getPixel是NSBitmapImageRep,FYI)當getPixel被調用時變量被重置

NSInteger pixWide = theCAPTCHA.pixelsWide; 
NSInteger pixHigh = theCAPTCHA.pixelsHigh; 
for (NSInteger x = 0; x<pixWide;x++) 
{ 
    for (NSInteger y = 0; y<pixHigh;y++) 
    { 
     unsigned int thePixel[3]; 
     [theCAPTCHA getPixel:(unsigned long *)thePixel atX:x y:y]; 
     for (int i = 0; i<3; i++) { 
      theColors[i+(y*3)+(x*pixHigh)] = thePixel[i]; 
     } 
    } 
} 
+0

該像素是一個無符號整型,但以無符號長整型傳遞。該函數可能會溢出整數並更改y。嘗試將像素聲明爲unsigned long – Jack

+0

謝謝!這工作!我不明白爲什麼y被影響。很明顯,我錯過了計算機科學的一些東西......是因爲溢出在y的價值上寫着嗎? –

+0

是的,它假設它有64位的空間來寫,但實際上它只有32個。因此它將32位額外的位寫入內存中(這是巧合)以覆蓋y – Jack

回答

1

thePixel是一個unsigned int但傳入爲無符號長。該函數可能會溢出整數並更改爲y。嘗試聲明thePixelunsigned long

在內存中,變量只是一個接一個地佈局。函數getPixel:at:y:假定它有64位要寫入輸入,因爲它需要unsigned long *。但是你自己的變量thePixelunsigned int *並且寫入unsigned long它會導致內存溢出

+0

謝謝。我甚至不知道爲什麼我以這種方式對它進行了類型化。我可以找到任何我需要像素作爲無符號整數的代碼行......好吧,這是未來的教訓! –

相關問題