2

条件が確定するまで隣接ピクセルを呼び出す再帰関数を画像に実装しました。このコードを 200x200 の画像解像度まで正常に実行できましたが、画像サイズが大きくなるとEXC_BAD_ACCESS、次のスタック行でエラーが発生してクラッシュします___lldb_unnamed_function782$ $libicucore.A.dylib . 私のコードをチェックしましたが、エラーを検出できませんでした。再帰コールバック関数が多すぎることが原因である可能性があります。誰かが何か考えを持っているなら、私に知らせてください。

これは私の再帰コードです:

 -(void)magicImageContext:(unsigned char*)data point:(CGPoint)point red:(unsigned char)red green:(unsigned char)green blue:(unsigned char)blue bytesPerPixel:(NSInteger)bytesPerPixel bytesPerRow:(NSInteger)bytesPerRow size:(long long int)size width:(NSInteger)width height:(NSInteger)height maskedData:(unsigned char*)masked_data{
for(int x = point.x-1; x<=point.x+1; x++){
    for(int y = point.y-1; y<=point.y+1; y++){
        if((x == point.x) && (y == point.y)) {
        }
        else if((x<0) || (y<0) || (x>=width) || (y>=height)){
        }
        else if([self checkPixelMarkedAtPoint:CGPointMake(x, y) data:masked_data]){
            int byteIndex = (bytesPerRow * y) + x* bytesPerPixel;
            CGFloat red2   = (data[byteIndex] );
            CGFloat green2 = (data[byteIndex + 1]);
            CGFloat blue2  = (data[byteIndex + 2]);
            if([self checkColorThresholdWithRed1:red green1:green blue1:blue red2:red2 green2:green2 blue2:blue2]){
                NSLog(@"x= %d, y= %d %d",x,y,byteIndex);
                //mark pixels on masked image
                [self changemaskedData:CGPointMake(x,y) data:masked_data];
                [self magicImageContext:data point:CGPointMake(x, y) red:red green:green blue:blue bytesPerPixel:bytesPerPixel bytesPerRow:bytesPerRow size:size width:width height:height maskedData:masked_data];                }
        }
    }
}
}
4

1 に答える 1

3

画像のすべてのピクセルで再帰を使用している場合、大きな画像を入力すると、確実にスタック オーバーフローが発生します。

再帰を避けるために、明示的なスタックとループを使用するように関数を書き直すことを検討してください。これにより、比較的コストのかかる関数呼び出しが回避されるため、アプリのパフォーマンスも向上する可能性があります。

于 2012-09-15T07:23:20.570 に答える