質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

3803閲覧

C言語 画像処理 メディアンフィルタ アクセス違反の原因について

APE

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/01/11 08:59

###前提・実現したいこと
メディアンフィルタを使用してノイズが入った画像のノイズを除去するプログラムを作っています。

val[i++] = bufimage->pdata[y + a][x + b][k];
の部分で読み取りアクセス違反が発生し、実行ができませんでした。
原因がわからないため教えてください。

説明不足かもしれませんが、宜しくお願い致します。
###発生している問題・エラーメッセージ

例外がスローされました:読み取りアクセス違反。 **bufimage** が 0x80 でした。 が発生しました

###該当のソースコード

C言語

1void median(Image image) 2{ 3 int x, y, k, m, n; 4 int i=0; 5 int a = 0; 6 int b = 0; 7 int buf=0; 8 Image bufimage; 9 int val[9]; 10 int N = 0; 11 printf("フィルタサイズ選択してください。\n"); 12 printf("フィルタサイズ:"); 13 scanf_s("%d", &N); 14 N = 2 * N + 1; 15 16 bufimage = createImage(image->height, image->width); 17 18 for (y = 0; y < image->height; y++) { 19 for (x = 0; x < image->width; x++) { 20 for (k = 0; k < N; k++) 21 { 22 bufimage->pdata[y][x][k] = image->pdata[y][x][k]; 23 } 24 } 25 } 26 27 //フィルタ処理 28 for (y = (N / 2); y < image->height - (N / 2); y++) { 29 for (x = (N / 2); x < image->width - (N / 2); x++) { 30 for (k = 0; k < 3; k++) { 31 32 //値をソート用バッファにコピー 33 if(i<N*N) 34 { 35 for (a = -(N / 2); a <= (N / 2); a++) 36 { 37 for (b = -(N / 2); b <= (N / 2); b++) 38 { 39 val[i++] = bufimage->pdata[y + a][x + b][k]; 40 } 41 } 42 } 43 44 //ソート 45 for (m = 0; m < (N*N) - 1; m++) 46 for (n = m + 1; n<N*N; n++) 47 if (val[m] < val[n]) 48 { 49 buf = val[m]; 50 val[m] = val[n]; 51 val[n] = (byte)buf; 52 } 53 54 image->pdata[y][x][k] = (byte)(val[(N*N) / 2]); 55 } 56 } 57 } 58} 59

###試したこと

###補足情報(言語/FW/ツール等のバージョンなど)
C言語

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

まずは
val[i++] = bufimage->pdata[y + a][x + b][k];の部分を

C

1if( (y + a) < 0 || (y + a) >= image->height || 2 (x + b) < 0 || (x + b) >= image->width || 3 i < 0 || i >= 9 ){ 4 printf( "x=%d,y=%d,a=%d,y=%d,i=%d\n", x, y, a, b, i); 5 } 6}

などに置き換えて、データ範囲外をアクセスしていないか確認しましょう。
そして範囲外アクセスしている場合はロジックを見直しましょう。

ちなみに
for (k = 0; k < N; k++)
の部分はどのような処理を意図していますか?(意図した動作をしていないのでは?)

投稿2018/01/11 09:24

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

APE

2018/01/11 09:52

val[i++] = bufimage->pdata[y + a][x + b][k];の部分を載せてくれたif文に変えると、最後の行のimage->pdata[y][x][k] = (byte)(val[(N*N) / 2]); にアクセル違反が発生しました。 すみません間違えていました。 for (k = 0; k < 3; k++) これで大丈夫ですか? 宜しくお願い致します。
can110

2018/01/11 10:01

pdata[y][x][k]の[k]が何を表しているかは(説明されない限り)コードを書いた本人にしか分かりません。 厳しい言い方になりますが、大丈夫かどうかは、あなた(コードを書いた本人)にしか判断できません。 アクセス違反についても同様です。
okrt

2018/01/11 14:49

ImageやcreateImageの中身がわからないので、何とも言えませんね。 ○○さんが作った、○○というライブラリを使ってます!ドキュメントはhttp://○○/で読めます! のような感じの情報があれば別ですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問