- ベストアンサー
ハンドルされていない例外が発生しました
C言語の勉強をしていますが、初心者なものでなかなか思うようにできません。 Visual Studioを使って「lfit5」というプログラムを作っています。下にプログラムのmainを載せています。 int _tmain(int argc, _TCHAR* argv[]) { int ma=2; int mfit=2; int ndata=4; float m; float s=0.0; float *n; float **covar; float *chisq=&s; void (*funcs)(float x[], float *afunc, int ma); float x[4]={1,2,3,4}; float y[4]={0,5,15,24}; float sig[4]={1,1,1,1}; float a[2]; int ia[2]; char buf; //chisq=0; n=&m; covar=&n; funcs=orgfuncs; lfit(x, y, sig, ndata, a, ia, ma, covar, chisq, funcs); buf=getchar(); buf=getchar(); return 0; } ビルドはできたのですが、実行すると lfit5.exe の 0x004127f4 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xccccccd0 に書き込み中にアクセス違反が発生しました。 というエラーメッセージが出ます。 最初は「coverが初期化されていない」というエラーが出ていて、 n=&m; covar=&n; 等 を加えることで初期化のエラーは消えたのですが、次に上記のようなエラーメッセージが出始めました。 専門用語等解らないことも多いのですが、どうすればよういか解らず、御教授頂きたいです。 どうか宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
恐らくlfitの中で初期化されていないポインタを使ったと思います。 0x004127f4 は例外の発生したコードのアドレスです。 0xccccccd0 はデータとしては通常はあり得ないアドレスです。 そもそも、0xCCは機械語でINT3に相当し、ブレークポイント用の 割り込み命令です。スタックなどの未使用領域は当初はこの値で 埋められるので、初期化されない自動変数はよくこの値になります。
補足
アドバイスをありがとうございます。 void covsrt(float **covar, int ma, int ia[], int mfit) { int i,j,k; float swap; for (i=mfit+1;i<=ma;i++) for (j=1;j<=i;j++) covar[i][j]=covar[j][i]=0.0; k=mfit; for (j=ma;j>=1;j--) { if (ia[j]) { for (i=1;i<=ma;i++) SWAP1(covar[i][k],covar[i][j]) for (i=1;i<=ma;i++) SWAP1(covar[k][i],covar[j][i]) k--; } } } void lfit(float x[], float y[], float sig[], int ndata, float a[], int ia[], int ma, float **covar, float *chisq, void (*funcs)(float x[], float *afunc, int ma)) { int i,j,k,l,m,mfit=0; float ym,wt,sum,sig2i,**beta,*afunc; beta=matrix(1,ma,1,1); afunc=vector(1,ma); for (j=1;j<=ma;j++) if (ia[j]) mfit++; if (mfit == 0) nrerror("lfit: no parameters to be fitted"); for (j=1;j<=mfit;j++) { for (k=1;k<=mfit;k++) covar[j][k]=0.0; beta[j][1]=0.0; } for (i=1;i<=ndata;i++) { (*funcs)(x,afunc,ma); ym=y[i]; if (mfit < ma) { for (j=1;j<=ma;j++) if (!ia[j]) ym -= a[j]*afunc[j]; } sig2i=1.0/SQR(sig[i]); for (j=0,l=1;l<=ma;l++) { if (ia[l]) { wt=afunc[l]*sig2i; for (j++,k=0,m=1;m<=l;m++) if (ia[m]) covar[j][++k] += wt*afunc[m]; beta[j][1] += ym*wt; } } } for (j=2;j<=mfit;j++) for (k=1;k<j;k++) covar[k][j]=covar[j][k]; gaussj(covar,mfit,beta,1); for (j=0,l=1;l<=ma;l++) if (ia[l]) a[l]=beta[++j][1]; printf( "a_%d ",l); printf( " %f \n",a[l] ); for (i=1;i<=ndata;i++) { (*funcs)(x,afunc,ma); for (sum=0.0,j=1;j<=ma;j++) sum += a[j]*afunc[j]; *chisq += SQR((y[i]-sum)/sig[i]); } covsrt(covar,ma,ia,mfit); free_vector(afunc,1,ma); free_matrix(beta,1,ma,1,1); } 上記がlfit関数です。 どうやらcoverに問題があるようで、lfitの for (j=1;j<=mfit;j++) { for (k=1;k<=mfit;k++) covar[j][k]=0.0; の部分でエラーが出ているようです。 これでは初期化していることにならないのでしょうか? 何か加えると上手くいくのでしょうか? 宜しくお願い致します。