2012-09-03 58 views
2

我的洪水填充方法崩潰與訪問錯誤錯誤,我找不到錯誤任何想法請嗎?洪水填充方法崩潰與訪問錯誤錯誤任何想法?

當我開始我的應用程序,我可以畫小東西就好了,但是當我想用洪水填補像一個塗料桶油漆來填補更大的物體,它只是壞訪問錯誤崩潰。

我是個菜鳥,我嘗試了很多東西和遞歸的數量上升了,但它仍然崩潰。 即時通訊使用ARC與此應用程序。

-(void)paintingBucket:(int)point point2:(int)point2 width:(int)width colorAtPoint:(UIColor *)color { 

int offset = 0; 
int x = point; 
int y = point2; 
if (point<1025 && point2<705) { 

offset = 4*((width*round(y))+round(x)); 

int alpha = data[offset]; 
int red = data[offset + 1]; 
int green = data[offset + 2]; 
int blue = data[offset + 3]; 
color1 = [UIColor colorWithRed:(green/255.0f) green:(red/255.0f) blue:(alpha/255.0f) alpha:(blue/255.0f)]; 

    if ([color1 isEqual: color]) { 

     color3 = self.currentColor ; 
     CGFloat r,g,b,a; 
     [color3 getRed:&r green:&g blue: &b alpha: &a]; 
     int reda = (int)(255.0 * r); 
     int greena = (int)(255.0 * g); 
     int bluea = (int)(255.0 * b); 
     int alphaa = (int)(255.0 * a); 
     // NSLog(@" red: %u green: %u blue: %u alpha: %u", reda, greena, bluea, alphaa); 

     data[offset + 3] = alphaa; 
     data[offset + 2] = reda; 
     data[offset + 1] = greena; 
     data[offset] = bluea; 

     [self paintingBucket:x+1 point2:y width:width colorAtPoint:color]; 
     [self paintingBucket:x point2:y+1 width:width colorAtPoint:color]; 
     [self paintingBucket:x-1 point2:y width:width colorAtPoint:color]; 
     [self paintingBucket:x point2:y-1 width:width colorAtPoint:color]; 

      } 

     } 

    } 

編輯: 只有信息我得到它崩潰時是這樣「0x995d7d5f:calll 0x995d7d64; szone_malloc_should_clear + 14」

據我所知,有一些內存的問題,但我不能確定它我解決它。 正如我所說,我的目標是一個noob,所以任何幫助將是偉大的。

+3

也許您應該查看控制檯中的任何崩潰信息,並找出調試器堆棧顯示說明問題發生的位置。然後在你的文章中包含這些信息。 –

+1

您正在寫入數據[]數組。也許這太小了。 –

+0

我不這麼認爲,因爲數據數組表示位圖像素,並且有更多的像素比我達到的迭代次數多。 – lost4ever

回答

2

這幾乎肯定是堆棧溢出。當您遞歸填充某個區域時,堆棧上的項目數等於前端的長度,對於較大的區域可能會相當長。

你應該基於隊列的一個來解決這個問題取代你的遞歸方法。

+0

你能舉個例子怎麼做嗎?或者有一些指向問題解決方案的鏈接? – lost4ever

+0

@ lost4ever當然 - 看看[Wikipedia上的「替代實現」部分](http://en.wikipedia.org/wiki/Flood_fill#Alternative_implementations),他們有容易跟蹤的隊列或顯式堆棧的僞代碼基於方法。 – dasblinkenlight

+0

我試圖實現這一點,但沒有運氣,並嘗試了一些其他的東西,它仍然崩潰,你能幫我一些示例代碼嗎? – lost4ever

0

你有

int x = point; 
int y = point2; 

if (point<1025 && point2<705) 
{ 
... 

,但你是從x和y中減去,而不是檢查他們是否> 0

[self paintingBucket:x-1 point2:y width:width colorAtPoint:color]; 
    [self paintingBucket:x point2:y-1 width:width colorAtPoint:color]; 

這可能是溢出的原因,因爲遞歸不會停止爲負值。

+0

嘗試添加「... &&(x> 0 && y> 0)」我根本沒有幫助。但無論如何感謝您的建議。 – lost4ever