- 締切済み
浮動小数点エラー
#include<stdio.h> main (){ float D[5][6] = { {0,0,151.9058382,111.8925551,238.1626765,145.6362657}, {0,151.9058382,0,256.9532465,317.3522119,232.5861795}, {0,111.8925551,256.9532465,0,181.0294098,114.6471}, {0,238.1626765,317.3522119,181.0294098,0,93.41311845} , {0,145.6362657,232.5861795,114.6471,93.41311845,0}, }; float data[100][100] ; int n=5; float sum; int i,l; for(i=1;i<=n-2;i++) { sum=0; for(l=i+2;l<=n;l++) { sum=sum+D[i][l]; } ◎ data[i]=D[i][i+1]/(sum/(n-(D+1))); ←この行 } for (i=1;i<=n;i++){ printf("%f",data[i]); } return (0); } 上のプログラムで、◎の行に浮動小数点の不正な使用とエラーがでてしまいます。 参考書、ヘルプで調べたもののなぜエラーとなるか分かりませんでした。 解決できますでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- MarrowG
- ベストアンサー率53% (41/76)
プログラムを眺めていてもう1点気がつきましたので、追加しておきます。 data[i]=D[i][i+1]/(sum/(n-(D+1))); この最後にある「変数D」ですが、これはfloatの二次元配列で宣言されているため、floatへのポインタのポインタになります。 つまりアドレスが入るわけで、ここでの計算に必要なものとは思えません。 #D と書いた場合は &D[0][0] と同じ値になります。 またC言語のコンパイラ次第ですが、(D+1)の値も不定です。 仮にプログラムが正しく動いたとしても実行するたびに結果が違うことになりかねません。 配列とポインタについてもう一度参考書等でご確認ください。
- MarrowG
- ベストアンサー率53% (41/76)
>float data[100][100] ; この行のせいですね。 data変数は二次元配列であるのに、 data[i]=D[i][i+1]/(sum/(n-(D+1))); ここではdata変数を一次元配列として扱っているためです。 data[i]はdata[i][0]へのポインタであるため、代入できないとしてエラーになります。 またちょっと気になったんですが、配列要素は必ず[0]から始まります。 for(i=1;i<=n-2;i++) だと最初のデータは捨てられてしまいますし、 for (i=1;i<=n;i++){ ですと、最後よりもさらにもう1つ後(値は不明)のデータを見に行くことになり結果が不定となります。 最悪プログラムが落ちるかもしれません。
- brogie
- ベストアンサー率33% (131/392)
float data[100][100] ; を float data[100]; と宣言するとエラーは出ないと思います。 そのままの宣言では、下のdata[i]は&data[i][0]になるのではないでしょうか? ◎ data[i]=D[i][i+1]/(sum/(n-(D+1))); ←この行 昔のコンパイラーなら暴走確実ですネ! では、