Ubuntuでは実行できたがmacでは実行エラーが出る

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
akitake

Ubuntuでは実行できたがmacでは実行エラーが出る

#1

投稿記事 by akitake » 4年前

[1] 質問文
 [1.1] 自分が今行いたい事は何か
macで実行エラーが出るプログラムコードを、エラーが出ないように書き直したい
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
画像変換のプログラムです。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define M 256*256
#define N 256
#define bit 6//dの長さ nビット n=L*2
#define FILE_NAME "boat256.bmp"//画像データ
#define q 8 //n=log(N)

int main(){
  FILE *fp1;
  FILE *fp2;
  FILE *fp3,*fp4,*fp5,*fp6,*fp7,*fp8,*fp9,*fp10,*fp11,*fp12,*fp13,*fp17,*fp18,*fp19,*fp20,*fp22,*fp30;
  
  int h1[N][N];
  int h[N][N];
h1[0][0]=1; 
  
  int n, i, j,k,walsh,T,L ,p, psum, s, t,b,c;
int gaso_c1[M];
 int gaso_c2_wada[M],gaso_c2_deb[M];
 double A[M]; 
int abs(int def);
 double def,a;
  int deb[N][N];//デブルイン系列
  int debs[N]; //シフトさせたデブルイン
  int hdeb[N][N];//デブルイン系列でアダマール行列を並び替えた行列
 char copy[1];
  int P[n];//デブルイン系列でアダマール行列を並び替えるときに使う
  int gaso[M];
  double X_wada[M],X_deb[M];
 int D=64;//用いるデブルインの行
  int l, m=0;//mだけシフト
int ggaso1[M],ggaso[M];
int x_n_wada[M],x_n_deb[M];

double skichi=300.0;//しきい値
int img_k,img_j,img_w,img_h;
unsigned char buf[1000000];
 unsigned char header[54];




  
  fp1=fopen("grayscale.dat","r");
  //fp2=fopen("wada32-lena.dat","w");
  //fp3=fopen("wada32.dat","w");
  //fp4=fopen("./16/wada16-deb-k.dat","w");
  //fp5=fopen("./16/wada16-deb-8bit-k.dat","w");
 fp6=fopen("16/new_gaso_wada16-deb-6bit.dat","w");
 fp7=fopen("16/deb256.dat","r");
fp10=fopen("16/new_gaso_wada16-6bit.dat","w");
fp13=fopen("NPCR,UACI_bit_int.dat","a"); 
fp12=fopen("16/Lena-wada16-6bit.bmp","wb"); 
fp9=fopen("16/Lena-wada16-deb-6bit.bmp","wb");
fp17=fopen("./16/1_debggaso2.dat","w");//逆変換後のデータ
fp18=fopen("./16/sum2.dat","w");//逆変換前のデータ
fp19=fopen("./16/1_ggaso2.dat","w");//逆変換後のデータ
fp20=fopen("./16/2_henkanmae.dat","w");//2次画素
fp22=fopen("./16/2_deb.dat","w");//ドブ2次画素

L=pow(2,bit-1);
 
  //データの読み取り

 
  for(i=0;i<M;i++){
    fscanf(fp1, "%d", &gaso[i]);
  }
  fclose(fp1);
 
  /* for(i=0; i<N; i++){
    printf("%d\n",gaso[i]);
  }
  */





 
//アダマール変換行列
  for(n=2; n<=N; n*=2){
    for(j=0; j<=n/2-1; j++){
      for(i=0; i<=n/2-1; i++){
	h[j][i]=h1[j][i];
	h[j+(n/2)][i]=h1[j][i];
	h[j][i+(n/2)]=h1[j][i];
	h[j+(n/2)][i+(n/2)]=-h1[j][i];
      }
    }
    for(l=0; l<N; l++){
      for(k=0; k<=N-1; k++){
	h1[l][k]=h[l][k];
	
      }
    }
  }
  //ウォルシュ順に並び替えていく
  for(j=0; j<N; j++){
    walsh=0;
    for(i=0; i<N-1; i++){
      if(h1[j][i]!=h1[j][i+1]){
	walsh=walsh+1;
      }
    }
    // printf("%d\n", walsh);
    for(i=0; i<N; i++){
      h[walsh][i]=h1[j][i];
    }
  }
	

  
  /*一文字ずつ半角スペースずつ空けて*/
 for(l=0; l<=N-1; l++){
    for(k=0; k<=N-1; k++){
      // fprintf(fp3,"%d%s",h[l][k]," ");
      // printf("%d%s", h[l][k]," ");
    }
    // fprintf(fp3,"\n");
    // printf("\n");
 }



 //デブルイン系列のデータを読み込む
  //デブルインのデータは空白で区切られていない
  for(j=0; j<N; j++){
    for(i=0; i<N; i++){
      copy[0]=fgetc(fp7);
      if(copy[0]=='\n'){ //改行コードのときは次に進む(取り込まないようにする)
	copy[0]=fgetc(fp7);
      }
      deb[j][i]=atoi(copy);//十進数に変換
      //  printf("%d", deb[j][i]);
    }
    // printf("\n");
  }
  //printf("\n");
  fclose(fp7);

 //ドブルイン系列を巡回シフトさせる
  for(l=0; l<N; l++){
    debs[l]=deb[D][(l+m)%N];
    // printf("%d", debs[l]);
  }
  // printf("\n");
   

  // printf("\n");

  //ここからアダマール変換をデブルイン系列で並び替えていく
  for(s=0; s<N; s++){
    psum=0;
    for(t=0; t<q; t++){
      if(s+t==N|s+t>N){
	P[t]=debs[s+t-N];//deb[][s+t-N]は用いるデブルインの行を入れる
      }
      else {
	P[t]=debs[s+t];
      }
      p=P[t]*pow(2, pow(t, P[t]))+psum;
      psum=p;
    }
    for(j=0; j<N; j++){
      hdeb[j][s]=h[j][psum];
    }
  }



  for(j=0; j<N; j++){
    for(i=0; i<N; i++){
      //   printf("%d",hdeb[j][i]);
       // fprintf(fp4,"%d%s",hdeb[j][i]," ");
    }
    //printf("\n");
    //fprintf(fp4,"\n");
  }
  //fclose(fp4);
  
 //  printf("\n");



//アダマール


  int x=0,y=0,z;
  double ada=0,sum,sum1[N][N],gaso1[256][256];
 int m1,m2,k0=0,k1,k2,l1=0,l2=0,n1,n2;
double N2=256.0;
 for(n1=0;n1<256;n1++){
   for(n2=0;n2<256;n2++){
     gaso1[n1][n2]=gaso[k0];
     k0++;
   }
 }


 for(k1=0;k1<N;k1++){
    for(k2=0;k2<N;k2++){

      fprintf(fp20,"%d %d %f\n",k1,k2,gaso1[k1][k2]);

    }
 }

 
 for(m1=0;m1<N;m1++){
    for(m2=0;m2<N;m2++){
     sum1[m1][m2]=0;
    }
 }

 
 for(m1=0;m1<256/N;m1++){
   for(m2=0;m2<256/N;m2++){
     for(k1=0;k1<N;k1++){
       for(k2=0;k2<N;k2++){
	 sum=0; //syokika  
	 for(n1=0;n1<N;n1++){
	   for(n2=0;n2<N;n2++){
	     ada=1/N2*gaso1[n1+m1*256/N][n2+m2*256/N]*h[k1][n1]*h[k2][n2];
	     sum=ada+sum; 
	   }
	 }
	 sum1[k1][k2]=sum1[k1][k2]+sum;
       }
     }
   }
 }

  
   double skd=1;

for(k1=0;k1<N;k1++){
    for(k2=0;k2<N;k2++){
      
       if(-skichi<sum1[k1][k2]&&sum1[k1][k2]<skichi){
	skd = 0;
       }else{
	 skd = 1;
       }
       sum1[k1][k2]=sum1[k1][k2]*skd;
 

    }
    }


    //逆変換

ada = 0;
 double ghen1[N][N];//逆変換後

//ghen2の初期化
 for(m1=0;m1<N;m1++){
    for(m2=0;m2<N;m2++){
     ghen1[m1][m2]=0;
    }
 }

 for(m1=0;m1<256/N;m1++){
   for(m2=0;m2<256/N;m2++){
         for(n1=0;n1<N;n1++){
      for(n2=0;n2<N;n2++){
         sum=0; //初期化 
         for(k1=0;k1<N;k1++){
          for(k2=0;k2<N;k2++){
             ada=1/N2*sum1[k1][k2]*h[k1][n1]*h[k2][n2];
             sum=ada+sum;
           }
         }
         ghen1[n1][n2]=sum;

       }
     }

   }
 }

k0=0;

//ghen1をggaso1に入れる   

 for(n1=0;n1<256;n1++){
   for(n2=0;n2<256;n2++){
     ggaso1[k0]=ghen1[n1][n2];//アダマール逆変換後のデータを1次元に戻した
     k0++;
   }
 }

//画素値を0~255に収める
for(i=0;i<M;i++){
	if(ggaso[i]<0){
	ggaso[i]=0;
	}else if(ggaso[i]>255){
	ggaso[i]=255;
	}
}

//ggasoをファイルに書き込む
for(k1=0;k1<M;k1++){   
  fprintf(fp19 ,"%d",ggaso1[k1]);//fp19は1_ggaso2
 fprintf(fp19,"\n");
}
 



//ドブルイン

 ada = 0;
 double sum2[N][N];
double henkanmae[N][N];



 for(m1=0;m1<N;m1++){
    for(m2=0;m2<N;m2++){
     sum2[m1][m2]=0;
    }
 }

 for(m1=0;m1<256/N;m1++){
   for(m2=0;m2<256/N;m2++){
     for(k1=0;k1<N;k1++){
       for(k2=0;k2<N;k2++){
	 sum=0; //syokika  
	 for(n1=0;n1<N;n1++){
	   for(n2=0;n2<N;n2++){
	     ada=1/N2*gaso1[n1+m1*256/N][n2+m2*256/N]*hdeb[k1][n1]*hdeb[k2][n2];
	     sum=ada+sum; 
	   }
	 }
	 sum2[k1][k2]=sum2[k1][k2]+sum;
       }
     }
   }
 }
 
 fp30=fopen("./16/kakougo.dat","w");

 for(k1=0;k1<N;k1++){
    for(k2=0;k2<N;k2++){

      fprintf(fp18,"%d %d %f\n",k1, k2, sum2[k1][k2]);

    }
 }

//ドブルイン逆変換
 double sum22[N][N];

for(k1=0;k1<N;k1++){
    for(k2=0;k2<N;k2++){
      
       if(-skichi<sum2[k1][k2]&&sum2[k1][k2]<skichi){
	skd = 0;
       }else{
	 skd = 1;
       }
       sum2[k1][k2]=sum2[k1][k2]*skd;
      fprintf(fp30,"%d %d %f\n",k1,k2,sum2[k1][k2]);

    }
    }

ada = 0;
 double ghen2[N][N];//逆変換後

//ghen2の初期化
 for(m1=0;m1<N;m1++){
    for(m2=0;m2<N;m2++){
     ghen2[m1][m2]=0;
    }
 }

//先生のアドバイスのやつ
 for(m1=0;m1<256/N;m1++){
   for(m2=0;m2<256/N;m2++){
         for(n1=0;n1<N;n1++){
      for(n2=0;n2<N;n2++){
         sum=0; //初期化 
         for(k1=0;k1<N;k1++){
          for(k2=0;k2<N;k2++){
             ada=1/N2*sum2[k1][k2]*hdeb[k1][n1]*hdeb[k2][n2];
             sum=ada+sum;
           }
         }
         ghen2[n1][n2]=sum;

       }
     }

   }
 }

 for(k1=0;k1<N;k1++){
    for(k2=0;k2<N;k2++){

      fprintf(fp22,"%f\n",ghen2[k1][k2]);

    }
 }

k0=0;
//ghen2をggasoに入れる   
for(n1=0;n1<256;n1++){
 for(n2=0;n2<256;n2++){

   ggaso[k0]=ghen2[n1][n2];
     k0++;
   }
 }

for(i=0;i<M;i++){
	if(ggaso[i]<0){
	ggaso[i]=0;
	}else if(ggaso[i]>255){
	ggaso[i]=255;
	}
 }

//ggasoをファイルに書き込む
for(k1=0;k1<M;k1++){   
  fprintf(fp17 ,"%d",ggaso[k1]);//fp17は1_debggaso2
 fprintf(fp17,"\n");
}
 

 

  //画像データの読み込み  アダマール

fp8= fopen(FILE_NAME, "rb");
fread(buf, sizeof(unsigned char), 54 ,fp8);
	fclose(fp8);


//ヘッダの情報


	img_k = (buf[28] + buf[29]*256)/8;
	img_w = (buf[18] + buf[19]*256 + buf[20]*65536 + buf[21]*16777216);
	img_h = (buf[22] + buf[23]*256 + buf[24]*65536 + buf[25]*16777216);
	img_j = img_w * img_h * img_k ;


unsigned char screen_wada[img_w][img_h][img_k];	

/* ファイルから読む */
fp8=fopen(FILE_NAME,"rb"); /*ビットマップ形式 256*256ピクセル,24ビットカラー */
fread(header,1,54,fp8); /* ヘッダ(54バイト)を飛ばす */
fread(screen_wada,1,img_j,fp8); /* 残りはデータ(最下行から順に入る) */
fclose(fp8);
 

 y=0;
 
 for(i=0;i<img_w;i++){
  
   for(j=0;j<img_h;j++){
   
 
   
   screen_wada[i][j][0]=ggaso1[j+y];
   screen_wada[i][j][1]=ggaso1[j+y];
   screen_wada[i][j][2]=ggaso1[j+y];
    fprintf(fp10,"%d\n",ggaso1[j+y]);
   //printf("%lf\n",x_n[j+y]);
 

}
   y=y+img_w;
  

 }
 


  //画像データの読み込み  ドブルイン

fp8= fopen(FILE_NAME, "rb");
fread(buf, sizeof(unsigned char), 54 ,fp8);
	fclose(fp8);


//ヘッダの情報


	img_k = (buf[28] + buf[29]*256)/8;
	img_w = (buf[18] + buf[19]*256 + buf[20]*65536 + buf[21]*16777216);
	img_h = (buf[22] + buf[23]*256 + buf[24]*65536 + buf[25]*16777216);
	img_j = img_w * img_h * img_k ;


unsigned char screen_deb[img_w][img_h][img_k];	

/* ファイルから読む */
fp8=fopen(FILE_NAME,"rb"); /*ビットマップ形式 256*256ピクセル,24ビットカラー */
fread(header,1,54,fp8); /* ヘッダ(54バイト)を飛ばす */
fread(screen_deb,1,img_j,fp8); /* 残りはデータ(最下行から順に入る) */
fclose(fp8);
 

 y=0;
 
 for(i=0;i<img_w;i++){
  
   for(j=0;j<img_h;j++){
   
 
   
   screen_deb[i][j][0]=ggaso[j+y];
   screen_deb[i][j][1]=ggaso[j+y];
   screen_deb[i][j][2]=ggaso[j+y];
    fprintf(fp6,"%d\n",ggaso[j+y]);
   //printf("%lf\n",x_n[j+y]);
 

}
   y=y+img_w;
  

 }
 


 /* ファイルに書く */

fwrite(header,1,54,fp12); /* ヘッダ */
 fwrite(screen_wada,1,img_w*img_h*img_k,fp12); /* データ */
fclose(fp12);

 
fwrite(header,1,54,fp9); /* ヘッダ */
 fwrite(screen_deb,1,img_w*img_h*img_k,fp9); /* データ */
fclose(fp9);


   
    return 0; 

 }
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
segmentation faultが出ます。lldbを用いてデバッグを試みましたが、原因の特定ができませんでした。Ubuntuでは実行できましたが、macではエラーが出たのでOSの違いによるものかと考えています
 [1.4] 今何がわからないのか、知りたいのか
macでエラーがでないようにするにはどのようにコードを書き換えればいいかわからないです。
エラーが出たと思われる箇所を載せます。

コード:

y=0;

for(i=0;i<img_w;i++){

 for(j=0;j<img_h;j++){



   screen_wada[i][j][0]=ggaso1[j+y];
   screen_wada[i][j][1]=ggaso1[j+y];
   screen_wada[i][j][2]=ggaso1[j+y];
   fprintf(fp10,"%d",ggaso1[j+y]);
   //printf("%lf\n",x_n[j+y]);


 }
 y=y+img_w;


}
fclose(fp10);
他にもあるかもしれませんが、ここでエラーが出るようです。
[2] 環境  
 [2.1] OS : Windows, Linux等々
OS:macOS (catalina)
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
gcc 9.2.0

よろしくお願いします。

かずま

Re: Ubuntuでは実行できたがmacでは実行エラーが出る

#2

投稿記事 by かずま » 4年前

gcc -Wall でコンパイルして、警告が出ないようにしてみてください。

とりあえず、次の修正を試してみたらどうなりますか?
・int P[n]; を int P[q]; にする。
・unsigned char buf[1000000]; を static unsigned char buf[1000000]; にする。

akitake

Re: Ubuntuでは実行できたがmacでは実行エラーが出る

#3

投稿記事 by akitake » 4年前

警告がでないようになりましたが、思った通りの挙動になりませんでした。

akitake

Re: Ubuntuでは実行できたがmacでは実行エラーが出る

#4

投稿記事 by akitake » 4年前

すみません、似た別のコードを書き換えていて挙動がおかしかったようです。
掲示板に掲載したコードを言われた通り書き直したところうまく行きました。
ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る