2017-04-19 7 views
2

こんにちは私はコードを実行すると、セグメンテーションエラーが発生していますこれをどうやって止めるかわからない。 再帰がウィンドウの外部にアクセスするのを止める方法はありますか? コードは次のとおりです。私はSDLに慣れていないよ再帰的なFlood Fillセグメンテーションエラーを修正するにはどうすればよいですか?

void floodfill(SDL_Surface *canvas,int SCREEN_WIDTH, int SCREEN_HEIGHT, int x, int y, int boundingX, int boundingY, Uint32 src, Uint32 fillcolour) 
{ 

Uint32 clickedColour = getPixel(canvas, x, y); 
Uint32 boundingColour = getPixel(canvas, boundingX, boundingY); //make sure you are not exceeding the limits of the window. 

printf("floodfill Inside\n"); 
printf("X&Y co-ords %d,%d\n",x,y); 

if (src==fillcolour) 
    return; 

if (x <= 0 || x <= SCREEN_WIDTH || y <= 0 || y <= SCREEN_HEIGHT) 
{ 
    printf("saying things!\n"); 
    return; 
} 

printf("%d,%d\n",x,y); 

if (fillcolour != clickedColour) 
    putPixel(canvas, x, y, fillcolour); 

if (clickedColour !=boundingColour) 
    return; 

if ((x>=0 && x<SCREEN_WIDTH) && (y>=0 && y<SCREEN_HEIGHT)) 
{ 
    putPixel(canvas, x, y, fillcolour); 
    printf("put Pixel x=%d and y=%d\n", x, y); 
} 

floodfill(canvas,SCREEN_WIDTH, SCREEN_HEIGHT, x, y+1, x, y+2, src, fillcolour); 
floodfill(canvas,SCREEN_WIDTH, SCREEN_HEIGHT, x, y, x+2, y, src, fillcolour); 
floodfill(canvas,SCREEN_WIDTH, SCREEN_HEIGHT, x, y, x, y+2, src, fillcolour); 
floodfill(canvas,SCREEN_WIDTH, SCREEN_HEIGHT, x+1, y, x+2, y, src, fillcolour); 

}

+0

あなたがドロースペース外に出ていると思われる場合は、機能の冒頭にチェックを入れて正しい領域にいることを確認してください。 –

+0

最後に出力される出力行は何ですか? –

+2

if(x <= 0 || x <= SCREEN_WIDTH)の条件は意味をなさない。 –

答えて

0

:一般的なC /再帰を使用してC++洪水テストアルゴリズムの実装は次のようになり

これは、深さ優先でピクセルを横断再帰呼び出しの量は、洪水で満たされた領域のサイズに比例して増加することを意味します。ピクセルは小さいので、フレームを比較して大きくスタックし、スタックスペースを制限します(通常は1桁のメガバイト数)。小さなイメージでもスタックスペースが使い果たされ、プロセスがセグメンテーションでクラッシュする可能性があります。

このように、安全にこれを回避できる唯一の方法は、再帰呼び出しの代わりにループを使用するようにアルゴリズムを再実装することです。

  1. 明示的なスタックと深さ優先アルゴリズムの反復実装: この二つの変種があります。これにより、明示的なスタックのバッファがコールスタックよりも大きい場合があり、一般的に再帰の各レベルでスタックにデータを少なく押さえるため、より深い「再帰」が可能になります。

  2. 幅優先アルゴリズムを使用してください。これは、画像を横切って移動する正面がより小さくなる傾向があるので、より空間効率がよい。

1

、しかし非常に少なくとも、あなたの境界チェックが正しく表示されません。どれ再帰的に実装さフラッドフィルが十分に大きい入力にセグメンテーション違反でクラッシュします

// Dimentions for screen to paint, in this case 10x10 matrix 
#define SCREEN_HEIGHT 10 
#define SCREEN_WIDTH 10 

void floodFillTest(int x, int y, int old_color, int new_color, int matrix[][SCREEN_HEIGHT]) 
{ 
    // Check boundaries 
    if (x < 0 || x >= SCREEN_WIDTH || y < 0 || y >= SCREEN_HEIGHT) 
     return; 

    // Check color to fill boundaries 
    if (matrix[x][y] != old_color) 
     return; 

    // Replace old color at (x, y) 
    matrix[x][y] = new_color; 

    floodFillTest(x+1, y, old_color, new_color, matrix); // Recur east 
    floodFillTest(x-1, y, old_color, new_color, matrix); // Recur west 
    floodFillTest(x, y+1, old_color, new_color, matrix); // Recur south 
    floodFillTest(x, y-1, old_color, new_color, matrix); // Recur north 
} 
関連する問題