ショッピングモール  Personal Health / Stress ( Anger Management )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4915

質問です
投稿者---tana(2005/11/24 16:09:38)


今画像処理を勉強していてそのプログラムを書いているのですがつまずいているので質問させてください。以下のプログラムは、微分フィルタのプログラムです。コマンドライン引数を与えてあって、処理が終わるとその引数名でファイルを保存するようにしています。ちなみにa[0]a[1]は画像の縦と横の値が入っており、Lというのは画像データを格納している三次元配列です。処理をさせようと思ったのですが、以下のコメント部に入ったらプログラムが強制終了させられます。たぶんpowかsqrtの使い方、もしくは式が長すぎて計算がされない(?)のかだと思うのですが文法的に何か間違いがありますでしょうか?

void bibun_3x3(FILE *outfile4,char *argv[],int a[],double*** L)       /* 一次微分の大きさ 3x3マスク */

{
  int x,y,z=0,XX=0,YY=0,i,j;

  XX=a[0];
  YY=a[1];
/* 
    for(x=0;x<XX;x++)
 for(y=0;y<YY;y++)

      L[x][y][z]= sqrt(pow( (-1)*L[x][y][z]+L[x+2][y][z]+(-1)*L[x][y+1][z]+L[x+2][y+1][z]+(-1)*L[x][y+2][z]+L[x+2][y+2][z] ,2)
                   +pow( (-1)*L[x][y][z]+(-1)*L[x+1][y][z]+(-1)*L[x+2][y][z]+L[x][y+2][z]+L[x+1][y+2][z]+L[x+2][y+2][z] ,2));
printf("%lf\n",L[x][y][z]);
*/
  for(y=0;y<YY;y++){
    L[y][0][z] =L[y][1][z] ;
    L[y][XX-1][z] =L[y][XX-2][z] ;
}

 
for(x=0;x<XX;x++){
    L[0][x][z] =L[1][x][z] ;
    L[YY-1][x][z] =L[YY-2][x][z] ;
  }

outfile4 = fopen(argv[6],"w");
fprintf(outfile4, "P2\n"); 
  fprintf(outfile4, "%d %d\n",a[0],a[1]); 
  fprintf(outfile4, "255\n"); 
  for(i=0;i<a[0];i++){
    for(j=0;j<a[1];j++){
      fprintf(outfile4,"%d ",(int)L[i][j][0]);
    }
    fprintf(outfile4,"\n");
  }
  fclose(outfile4);

} 




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:質問です 4916 nop 2005/11/24 16:14:03
<子記事> Re:質問です 4917 REE 2005/11/24 17:09:54


No.4916

Re:質問です
投稿者---nop(2005/11/24 16:14:03)


>for(x=0;x<XX;x++)
> for(y=0;y<YY;y++)
>  L[x][y][z]= sqrt(pow( (-1)*L[x][y][z]+L[x+2][y][z]+(-1)*L[x][y+1][z]+L[x+2][y+1][z]+(-1)*L[x][y+2][z]+L[x+2][y+2][z] ,2)

ヒント:
 x=XX-1、y=YY-1の時、
 L[x+2][y+1][z]やL[x][y+1][z]などは、
 どこを参照していますか?


この投稿にコメントする

削除パスワード

No.4935

Re:質問です
投稿者---tana(2005/11/25 01:30:38)


ヒントありがとうございます。意味するところがわかりました。あとmallocも使っているので互換性についても大丈夫です。あともう一つ質問なんですが、計算式がプログラム中に三行ほどにわたっている(計算式が長い)からセグメンテーション違反が出ることってありえますか?ヒント頂いたところを修正したら今度はセグメンテーション違反が出るようになったので...。


この投稿にコメントする

削除パスワード

No.4936

Re:質問です
投稿者---まきじ(2005/11/25 01:55:52)


>セグメンテーション違反が出るようになったので...。

配列の外にアクセスしてるのでしょう。

int array[3] と宣言して array[3] にアクセスしてるとか。


この投稿にコメントする

削除パスワード

No.4938

Re:質問です
投稿者---nop(2005/11/25 09:02:19)


> 計算式がプログラム中に三行ほどにわたっている(計算式が長い)からセグメンテーション違反が出ることってありえますか?

あり得ません。
私のヒントが全く役に立っていないようですね。

まず、長い式文を分割して短い複数の式文にするべきでしょう。
そうすれば、式中のどこでセグメンテーション違反になっているかすぐに分かるでしょう。


# 後、文章には適度に改行を入れましょう。
# これは、長い一つの式文を短い複数の式文に分割する事にも通じます。


この投稿にコメントする

削除パスワード

No.4943

Re:質問です
投稿者---tana(2005/11/25 13:07:49)


スイマセンできました。x=0;x<XX-2にすることで動作しました。
アドバイスを頂いた方々に感謝いたします。ありがとうございました。


この投稿にコメントする

削除パスワード

No.4917

Re:質問です
投稿者---REE(2005/11/24 17:09:54)


>Lというのは画像データを格納している三次元配列です。

double***L;

double L[X][Y][Z];
には互換性はありませんが、大丈夫ですか?
# mallocで、互換性を持つように設定している場合は大丈夫です。

>文法的に何か間違いがありますでしょうか?

文法的に間違いがある場合には、コンパイルエラーになります。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity