アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
等 を加えることで初期化のエラーは消えたのですが、次に上記のようなエラーメッセージが出始めました。

専門用語等解らないことも多いのですが、どうすればよういか解らず、御教授頂きたいです。
どうか宜しくお願い致します。

A 回答 (3件)

恐らくlfitの中で初期化されていないポインタを使ったと思います。


0x004127f4 は例外の発生したコードのアドレスです。
0xccccccd0 はデータとしては通常はあり得ないアドレスです。
そもそも、0xCCは機械語でINT3に相当し、ブレークポイント用の
割り込み命令です。スタックなどの未使用領域は当初はこの値で
埋められるので、初期化されない自動変数はよくこの値になります。
    • good
    • 6

TRACEでデバッグ文を表示するとか、ブレークポイントやトレース実行などを使って、エラーの箇所を絞り込みましょう。



メッセージは重要ですが、メッセージがどこで出ているのかが重要です。
    • good
    • 2

lfit関数のソースも見せてください。



lfit関数から別の自作関数を呼んでいれば、そのソースも見せてください。

この回答への補足

アドバイスをありがとうございます。

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;
の部分でエラーが出ているようです。
これでは初期化していることにならないのでしょうか?
何か加えると上手くいくのでしょうか?
宜しくお願い致します。

補足日時:2009/11/03 23:33
    • good
    • 1

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

このQ&Aを見た人はこんなQ&Aも見ています