性格悪い人が優勝

輪郭線追跡プログラム他の質問を参考にして輪郭線追跡プログラムを作成しましたが、trace関数部分が実行できません。教えて頂きたいです
#include <stdio.h> #include <stdlib.h>
#define NN 1600000
void trace(unsigned char image[], int im, int jm, int starti, int startj, int fcode[], int *num);
void findStartPt(unsigned char image[], int im, int jm, int *starti, int *startj);
int main(int argc, char *argv[]) {
int im,jm; char fname[100]; unsigned char image[NN];
int i,j;
int th;
int col;
int starti, startj;
int num=0;
int fcode[NN];
printf("元の画像ファイル名を入れてください: \n"); scanf("%s",fname);
read_pnm(fname, &im, &jm, &col, image); findStartPt(image,im,jm,&starti,&startj);
printf("%d %d\n", starti, startj);
num=1;
trace(image,im,jm,starti, startj, fcode, &num);
} void trace(unsigned char image[], int im, int jm, int starti, int startj, int fcode[], int *num) {
int x,y,i;
x = starti;
y=startj;
num=0;
while(x<=im && y<=jm){
if(image[y*im+x]==0){ if(image[(y-1)*im+(x-1)]==0){
*fcode=5; x=x-1; y=y-1; num++;
} else{
if(image[(y-1)*im+x]==0){
*fcode=6; y=y-1; num++;
} else{
if(image[(y-1)*im+(x+1)]==0){
*fcode=7; x=x+1; y=y-1; num++; }
else{
if(image[y*im+(x+1)]==0){
*fcode=0; x=x+1; num++;
} else{
if(image[y*im+(x-1)]==0){
*fcode=4; x=x-1; num++;
} else{
if(image[(y+1)*im+(x-1)]==0){
*fcode=3;
x=x-1;
y=y+1;
num++;
}else{ if(image[(y+1)*im+x]==0){
*fcode=2; y=y+1; num++; }
else{
if(image[(y+1)*im+(x+1)]==0){
*fcode=1;
x=x+1;
y=y+1;
num++;
}
}
}
}
}
}
} void findStartPt(unsigned char image[], int im, int jm, int *starti, int *startj) {
int i, j;
int dist;
int dmin=im*im+jm*jm;
// find start point
for (j=0;j<jm;++j) {
for (i=0;i<im;++i) {
if (image[i+j*im]==255) {
dist=i*i+j*j;
if (dist<dmin) {
*starti=i; *startj=j; dmin=dist;
}
}
}
}
}
void read_pnm(char filename[],int *im,int *jm, int *col, unsigned char image[]) {
int i,j; FILE *fp; char buf[10000]; if((fp=fopen(filename,"rb"))==NULL) {
printf("file %s can not open ",filename); exit(0);
}
check_pnm(buf,fp,im,jm,col); fread(image,sizeof(unsigned char),(*im)*(*jm)*(*col),fp); fclose(fp); }

A 回答 (2件)

>trace関数部分が実行できません。


とはどの様な事象なのかを書かないと駄目ですね。

コンパイルエラーなのか実行時にエラーになるのか何もせず次へ行くのかや、メッセージが出る(その内容)のかで無いのか。
    • good
    • 0
この回答へのお礼

文字数制限で入力できませんでした。
エラーが起きず、
他の関数部分のprintfだけ出力されて
trace関数部分は何も実行されずに終了します。
trace関数のいろいろな部分にprintfを入れて調べたところ、whileの中が実行されていないみたいでした。

お礼日時:2021/01/02 13:07

関数がちゃんと閉じかっこされてないような。

ネストが浅くなるようにコードを書いてみては。

(行頭空白を全角空白にしてみたものが以下)
#include <stdio.h> #include <stdlib.h>
#define NN 1600000
void trace(unsigned char image[], int im, int jm, int starti, int startj, int fcode[], int *num);
void findStartPt(unsigned char image[], int im, int jm, int *starti, int *startj);
int main(int argc, char *argv[]) {
  int im,jm; char fname[100]; unsigned char image[NN];
  int i,j;
  int th;
  int col;
  int starti, startj;
  int num=0;
  int fcode[NN];
  printf("元の画像ファイル名を入れてください: \n"); scanf("%s",fname);
  read_pnm(fname, &im, &jm, &col, image); findStartPt(image,im,jm,&starti,&startj);
  printf("%d %d\n", starti, startj);
  num=1;
  trace(image,im,jm,starti, startj, fcode, &num);
}
void trace(unsigned char image[], int im, int jm, int starti, int startj, int fcode[], int *num) {
  int x,y,i;
  x = starti;
  y=startj;
  num=0;
  while(x<=im && y<=jm){
    if(image[y*im+x]==0){
      if(image[(y-1)*im+(x-1)]==0){
        *fcode=5; x=x-1; y=y-1; num++;
      } else{
        if(image[(y-1)*im+x]==0){
          *fcode=6; y=y-1; num++;
        } else{
          if(image[(y-1)*im+(x+1)]==0){
            *fcode=7; x=x+1; y=y-1; num++;
          } else{
            if(image[y*im+(x+1)]==0){
              *fcode=0; x=x+1; num++;
            } else{
              if(image[y*im+(x-1)]==0){
                *fcode=4; x=x-1; num++;
              } else{
                if(image[(y+1)*im+(x-1)]==0){
                  *fcode=3;
                  x=x-1;
                  y=y+1;
                  num++;
                }else{
                  if(image[(y+1)*im+x]==0){
                    *fcode=2; y=y+1; num++;
                  } else{
                    if(image[(y+1)*im+(x+1)]==0){
                      *fcode=1;
                      x=x+1;
                      y=y+1;
                      num++;
                    }
                  }
                }
              }
            }
          }
        }

void findStartPt(unsigned char image[], int im, int jm, int *starti, int *startj) {
  int i, j;
  int dist;
  int dmin=im*im+jm*jm;
  // find start point
  for (j=0;j<jm;++j) {
    for (i=0;i<im;++i) {
      if (image[i+j*im]==255) {
        dist=i*i+j*j;
        if (dist<dmin) {
          *starti=i; *startj=j; dmin=dist;
        }
      }
    }
  }
}
void read_pnm(char filename[],int *im,int *jm, int *col, unsigned char image[]) {
  int i,j; FILE *fp; char buf[10000]; if((fp=fopen(filename,"rb"))==NULL) {
    printf("file %s can not open ",filename); exit(0);
  }
  check_pnm(buf,fp,im,jm,col); fread(image,sizeof(unsigned char),(*im)*(*jm)*(*col),fp); fclose(fp);
}
    • good
    • 0
この回答へのお礼

ネストという言葉を初めて聞きました…
ありがとうございます。
実行させてみたのですが、うまくいかなかったです。
ありがとうございます。

お礼日時:2021/01/01 23:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!