- ベストアンサー
この数式でセグメンテーションエラーがでてしまいます
c言語でこの数式を入れるとコンパイルは可能なのですがセグメンテーションエラーが出てしまいます。 どこが間違えているのかご指摘お願いします。 w[j+1] = -1*w[j-1] + ( (2+h*h) * w[j] ) / ( 1+h*h*w[j]*w[j] ) + ( ( h*h*h*h*w[j]*w[j]*w[j] ) * ( 1-2*w[j]*w[j] ) ) /(1+h*h*w[j]*w[j] ) ; このような数式なのですがどこが間違えているのでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#1さんが書かれていたとおり、配列の添字が範囲外になっているようです。 double w[1000001]; この定義で使える添字は0~1000000ですね。それに対し、 for(j=1;j<=1000000;j++){ w[j+1] = -1*w[j-1]+((2+dx*dx)*w[j])/(1+dx*dx*w[j]*w[j]) + ((dx*dx*dx*dx*w[j]*w[j]*w[j])*(1-2*w[j]*w[j]))/(1+dx*dx*w[j]*w[j]); } このループで、jが1000000のとき、w[1000001]にアクセスしようとしています。 これは配列の定義範囲外の領域です。何が起きても不思議ではありません。
その他の回答 (4)
#4です。 失礼。確かに#1,#3の言うとおり配列が範囲外になっていますね。 先ほどの回答はスルーしてください。
原因は double w[1000001]; の部分ですね。 こんなに大きな配列をローカル変数におくと、スタック領域からあふれてしまいます。 static double w[1000001]; に直すか、callocなどでヒープ領域にメモリを確保すればセグメンテーションエラーを回避できます。
- asuncion
- ベストアンサー率33% (2127/6289)
提示された箇所でセグメンテーションエラーが出ているということが、 どのようにしてわかったのでしょうか。 なお、提示された部分「だけ」では、何が原因でどう対処すればいいかはわかりません。 配列w[]の定義や、提示された部分を実行している(と思われる)ループの書き方などの 情報も必要だと思います。
- kmee
- ベストアンサー率55% (1857/3366)
セングメンテーションエラーが出る、その場所で配列を使っている、ということから予想されることは ・添字が範囲外 ・そもそも配列として領域が確保されていない(ポインタに領域を設定せずに使う 等) がほとんどです。 変数jの範囲と、配列wの宣言を確認してください。 特にあやしいのは、j+1とj-1です。
補足
そうなのですか、ありがとうございます。勉強します。 それでは #include<stdio.h> #include<math.h> int main(void){ int j; double dx = 0.5; double w[1000001]; double ww; w[0] = 0.000001; w[1] = 0.000001; for(j=1;j<=1000000;j++){ w[j+1] = -1*w[j-1]+((2+dx*dx)*w[j])/(1+dx*dx*w[j]*w[j]); } for(j=0;j<=1000000;j++){ ww = (w[j+1]-w[j])/dx; printf("%lf %lf\n", w[j], ww); } return 0; } このようなプログラミングのときはエラーが出ないのですが。 #include<stdio.h> #include<math.h> int main(void){ int j; double dx = 0.5; double w[1000001]; double ww; w[0] = 0.000001; w[1] = 0.000001; for(j=1;j<=1000000;j++){ w[j+1] = -1*w[j-1]+((2+dx*dx)*w[j])/(1+dx*dx*w[j]*w[j]) + ((dx*dx*dx*dx*w[j]*w[j]*w[j])*(1-2*w[j]*w[j]))/(1+dx*dx*w[j]*w[j]); } for(j=0;j<=1000000;j++){ ww = (w[j+1]-w[j])/dx; printf("%lf %lf\n", w[j], ww); } return 0; } このようなプログラミングのときはエラーが出てきてしまうのですがどこがおかしいのでしょうか?
補足
了解しました。プログラミングの全文をのせてみます。 #include<stdio.h> #include<math.h> int main(void){ int j; double dx = 0.5; double w[1000001]; double ww; w[0] = 0.000001; w[1] = 0.000001; for(j=1;j<=1000000;j++){ w[j+1] = -1*w[j-1]+((2+dx*dx)*w[j])/(1+dx*dx*w[j]*w[j]) + ((dx*dx*dx*dx*w[j]*w[j]*w[j])*(1-2*w[j]*w[j]))/(1+dx*dx*w[j]*w[j]); } for(j=0;j<=1000000;j++){ ww = (w[j+1]-w[j])/dx; printf("%lf %lf\n", w[j], ww); } return 0; } このようなプログラミングなのですがどこかおかしいところはありますか?