- 締切済み
C言語の配列の宣言について
20年以上前に発行された本に書いてある、利用したいCのコードがあります。 JavaやPHPは使ったことがありますが、Cは触ったことすらありません。 とりあえずメモ帳に打ち出して、codepadでC codeで実行してみましたが、正常に動作しません。 どこがおかしいのか、ご教示ください。 よろしくお願いします。 ---- #include <stdio.h> #include <math.h> #define N 20; int main( int argc, char **argv ) { double u[N+1], w[N+1]; double k=0.001; double h, r, s; int i, j; h= 1.0/(double)N; r= k/(h*h); s= 1.0-2.0*r; for( i=0; i<=N; i++ ) w[i]=0.0; for( i=1; i<N; i++ ) u[i]=1.0; u[0]=0.0; u[N]=0.0; for(j=1;j<200;j++){ if((j%10)==0) { printf("%5.31f",(double)j*k); for(i=0;i<=N;i+=2) printf("%5.31f",u[i]); printf("\n"); } for( i=0; i<=w; i++ ) w[i]=r*(u[i+1]+u[i-1])+s*u[i]; for( i=1; i<N; i++ ) u[i]=w[i]; } return 0; }
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
追記。 もし、「C言語作る」のが目的でなく、「そのプログラムの実行結果を得る」のが目的だったら、自分の得意な言語に直せばいいです。 ここにある程度なら、簡単にJavaに直せます。 それなら、C特有の問題は考えなくて済むでしょう。
- TT414
- ベストアンサー率18% (72/384)
unacyoさん >また、5.31f? 小数点以下31桁も表示するのですか? >それとも、5.3lf(エルエフ)の間違い? (double型を表示する際の使い方ですね) とありますが、「5.3lf(エルエフ)の間違い?」は同意できますが、「(double型を表示する際の使い方ですね)」は同意できません。%lfは関数の呼び出し方法を知らない人間の書くインチキ書式です。 doubleの出力に%lfを使うような参考書は捨てましょう。
- kmee
- ベストアンサー率55% (1857/3366)
#defineなどのプリプロセッサ命令は、C言語とは違う処理をされるものですので注意が必要です。 #define N 20; これだと、Nというマクロの内容が「20;」になります。 プリプロセッサによる前処理で、マクロ「N」を「20;」に置き換えていきます。 ここでは「単純な文字列置き換え」しかしません double u[N+1], w[N+1]; → double u[20;+1], w[20;+1]; for( i=0; i<=N; i++ ) w[i]=0.0; for( i=1; i<N; i++ ) u[i]=1.0; → for( i=0; i<=20;; i++ ) w[i]=0.0; for( i=1; i<20;; i++ ) u[i]=1.0; ...となります。そうすると、あきらかに文法的におかしいです。
- unacyo
- ベストアンサー率51% (35/68)
すいません、#2ですが、コンパイル環境は書いてありましたね・・・ #2のコンパイル環境うんぬんは抜きで見て下さい。すいません
- unacyo
- ベストアンサー率51% (35/68)
正常に動作しないというのが、何であるか書かないと判りませんが・・・ エラーで落ちますか?コンパイルが通りませんか? また、どんな環境(コンパイラ)で作ってるかは書いてください。VisualC++? こちらで検証(VisualC++)でチェックしてみたところ、以下のエラーがあります。 (1) #deifneのミス >>> #define N 20; #defineの最後のセミコロンは不要です。入れてしまうと、Nを使っている場所全てにセミコロンが入ってしまってコンパイルが通りませんよ? (それともこれはコンパイラ依存?) (2) for( i=0; i <= w; i++ ) 最後から2つ目のfor()文 整数型(int)と配列の比較はできません。wはNの間違い? (3) w[i]計算時、uの配列の-1を参照する >>> w[i]=r*(u[i+1]+u[-1]) (以下省略) 配列は0から開始しますが、w[i]を計算する際、i=0から開始するので、u[i-1]を計算途中に入れてると、u[-1]となってしまいますよ? 場合によってはメモリアクセスエラーになってアプリが落ちたり、参照できたとしても何が入っているかわからない領域の値を計算に使うので、最初の計算結果が合わないはずです。 せめて、参照して良いかどうかのチェックは必要ではないでしょうか? double temp1 = 0.0; if( i > 0 ) temp1 = u[i-1]; //i>0の場合はtemp1にu[]の値を入れる。i=0の場合はtemp1=0.0とする w[i] = r * (u[i+1] + temp1) + s * u[i]; あと、気になったのは、printf( "%5.31f", u[i] )ですが、実行すると小数点以下の表示と、次に表示する整数部がくっついて表示されて、一見バグったように見えます。ここは1つごとに改行するつもりでしたか?それともこれが意図した出力?せめて、%5.31fの所の前後どちらかにスペース1個は入れたほうが見やすいかと。 また、5.31f? 小数点以下31桁も表示するのですか? それとも、5.3lf(エルエフ)の間違い? (double型を表示する際の使い方ですね) とりあえず、こちらでチェックした際の結果は以上です
- asuncion
- ベストアンサー率33% (2127/6289)
>#define N 20; 最後のセミコロンは、いらないような気がします。