トップページ > 過去ログ > 記事閲覧
塗りつぶし再起処理のスタックオーバーフロー
名前:po 日時: 2012/11/01 14:27

いつもDXライブラリにはお世話になっております。 現在マップエディタの塗りつぶし処理を実装中なのですが、 再起処理でスタックオーバーフローが発生してしまいます。 実装は引数に渡したtypeと同じ値の座標をチェックしていき、条件に合えば座標に-1を代入、 再起処理が完了したら-1をすべて指定の色で塗るようにしています。 狭い範囲だと問題ないのですが、 範囲が128*128になると再起の回数が多くなりエラーが発生するようです。 何か対策などあればご教授くださいますと助かります。 よろしくお願いします。 ================ void nuri(int type, int posX, int posY) { if(posX < 0 || posY < 0 || posX >= mapData.width || posY >= mapData.height || mapData.data[posY] [posX] != type) { return; } mapData.data[posY][posX] = -1; nuri(type, posX, posY - 1); nuri(type, posX + 1, posY); nuri(type, posX, posY + 1); nuri(type, posX - 1, posY); return; }

Page: 1 |

Re: 塗りつぶし再起処理のスタックオーバーフロー ( No.1 )
名前:Will 日時:2012/11/01 15:51

一番簡単なのはスタックサイズを増やすことです。 スタックサイズの設定は開発環境によりますので、ググってください。 あるいは、スタックはスレッドごとに割り当てられますので、 w-xの範囲はAスレッドでする x-yの範囲はBスレッドでする というように分割する手もありますが実装が面倒でしょうね。 この関数の呼び元で、オーバーフローしない範囲での実行を繰り返すように するのが一番妥当でしょうか。 @範囲を引数にする void nuri(int type, int posX, int posY, int width, int height) A呼び元で小さい範囲で呼び出す do { // posX, posY, width, heightをオーバーフローしない範囲に絞る nuri(type, posX, posY, width, height); // 次の塗り範囲に値を更新する } while(塗り残しがある)

Page: 1 |