- ベストアンサー
segmentation faultの原因と対処方法について教えてください
- segmentation faultとは、プログラムがメモリの範囲外にアクセスしようとしてエラーが発生したことを意味します。
- 原因としては、不正なメモリアクセス、ポインタの誤用、配列の範囲外アクセスなどが考えられます。
- 対処方法としては、デバッグツールを使用してエラー箇所を特定し、修正することや、メモリ管理に注意することなどがあります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
segmentation faultの原因は、画像の外側にアクセスしているためですね。 Deltax, Deltayを求める部分で、x == 0 の場合も image[x-1][y][0] を読み取ろうとしています。 for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ if ((x > 0) && (x < xsize - 1) && (y > 0) && (y < ysize - 1)) { Deltax = ... Deltay = ... } else { ... } } } のようにすれば大丈夫ですが、ただこれではDeltaxもDeltayも最後の画素のエッジ強度だけになってしまうような...? 質問する際はプログラムの目的も書かれた方が、他の方も答えやすいと思います。
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
> でしたら > for(y=1;y<ysize;y++) > このようにして1に変更したらよいと考えたのですがこのようなやり方はいいのでしょうか?? ○確実に間違っている点 このループでは、変数yは1<=y<ysize になります。yは整数なので、1<=y<=ysize-1 です。 では、y=ysize-1のとき、image[x][y+1][0] はどうなるでしょう? ○間違っているとは言いきれない点 このような画像処理で問題になるのは周辺部です。 y=0に注目すると image[x][y-1]が存在しません。このような場合、次のような処理をします。 1) image[x][-1]を何かの方法で用意する 最後の値を繰り返す(image[x][-1]=image[x][0]),周辺の値から補間する 等 2) 全てのデータのあるところだけ計算し、足りない座標は計算しない。 この例の場合、一番端を見る必要は無いように思うので、1<=y<ysize-1の範囲で計算すればいいように思います。 端まで計算したいのなら、1)の方法で「外側」の値を用意してください。 xについても同様です。
- kmee
- ベストアンサー率55% (1857/3366)
配列を使っていてsegmentation faultが出たら、まずは、範囲が正しいか確認するとよいでしょう。 for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ Deltax = sqrt(( pow (image[x+1][y][0] , 2.0 ) + pow (image[x+1][y][1] , 2.0 ) + pow (image[x+1][y][2] , 2.0 )) - ( sqrt( pow (image[x-1][y][0] , 2.0) + (image[x-1][y][1] , 2.0) + (image[x-1][y][2] , 2.0)))); Deltay = sqrt(( pow (image[x][y+1][0] , 2.0 ) + pow (image[x][y+1][1] , 2.0 ) + pow (image[x][y+1][2] , 2.0 )) - ( sqrt( pow (image[x][y-1][0] , 2.0) + (image[x][y-1][1] , 2.0) + (image[x][y-1][2] , 2.0)))); } } x=0,y=0のとき、正しいでしょうか?
お礼
ありがとうございます 確かにx=0,y=0のとき正しくありません 座標がマイナスはありえませんでした でしたら for(y=1;y<ysize;y++) このようにして1に変更したらよいと考えたのですがこのようなやり方はいいのでしょうか??
お礼
ありがとうございます if ((x > 0) && (x < xsize - 1) && (y > 0) && (y < ysize - 1)) この部分がよくわからないのですがどのような意味でしょうか? xsize-1などはなぜそうなるのでしょうか? またこのプログラム目的は 背景の青に近いものをカットし、 画像の中心からの任意の点への方向ベクトルと 任意の点の匂配ベクトルが直行しているかを確認するプログラムです