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;
等 を加えることで初期化のエラーは消えたのですが、次に上記のようなエラーメッセージが出始めました。
専門用語等解らないことも多いのですが、どうすればよういか解らず、御教授頂きたいです。
どうか宜しくお願い致します。
No.3ベストアンサー
- 回答日時:
恐らくlfitの中で初期化されていないポインタを使ったと思います。
0x004127f4 は例外の発生したコードのアドレスです。
0xccccccd0 はデータとしては通常はあり得ないアドレスです。
そもそも、0xCCは機械語でINT3に相当し、ブレークポイント用の
割り込み命令です。スタックなどの未使用領域は当初はこの値で
埋められるので、初期化されない自動変数はよくこの値になります。
No.2
- 回答日時:
TRACEでデバッグ文を表示するとか、ブレークポイントやトレース実行などを使って、エラーの箇所を絞り込みましょう。
メッセージは重要ですが、メッセージがどこで出ているのかが重要です。
No.1
- 回答日時:
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;
の部分でエラーが出ているようです。
これでは初期化していることにならないのでしょうか?
何か加えると上手くいくのでしょうか?
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) 物理の斜方投射のシミュレーションにおける位置や速度の単位について 4 2023/05/31 09:50
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# キャスト演算について。 1 2023/07/15 15:28
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
どんなプログラムを書いても指定されたファイルが見つかりません。と出てきます。どうやったら解決しますか
C言語・C++・C#
-
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
Run-Time Check Failure #3というエラーが出ます。
C言語・C++・C#
-
-
4
C言語 配列の長さの上限
C言語・C++・C#
-
5
バッファとは何ですか
C言語・C++・C#
-
6
switch の範囲指定
C言語・C++・C#
-
7
空白を含んだ文字列がうまく格納(表示)できない
C言語・C++・C#
-
8
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
9
e^(x^2)の積分に関して
数学
-
10
適切な変換関数が存在しない???
C言語・C++・C#
-
11
【C++】関数ポインタの使い方
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
unsigned *という宣言について
-
2重定義って??
-
警告 ”値が割り当てられていな...
-
VC++.NETのビルドエラーについて
-
ハンドルされていない例外が発...
-
直接アドレス指定のポインタの...
-
intとINTの違いは?
-
C++のfor文について
-
DLLでLIBファイルが作成されない
-
visualstudio C# テキストボッ...
-
sshdログの意味
-
エラー「invalid conversion fr...
-
関数の実体定義にヘッダファイ...
-
【#define】 defineで定義した...
-
コンパイルすると error C1083 ...
-
C++の分割コンパイルについて
-
プロトタイプが必要な場合
-
const の使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
typedef enumの使い方を教えて...
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
関数の実体定義にヘッダファイ...
-
構造体の要素すべてに対する四...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
main.c:7:43: warning: implici...
-
void func( void )について
-
C言語 宣言した変数になにも代...
-
【#define】 defineで定義した...
-
構造体の宣言でエラーが出ます。
-
C言語での方向キー入力判定
-
プログラムの中で別のmainを呼...
-
C言語について質問です。 子プ...
おすすめ情報