[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;
}
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
よろしくお願いします。