- ベストアンサー
以下のプログラムが・・・。
以下のプログラムが暴走します。ちなみにビジュアルC++6.0でやりました。 j=99; n=1000;の条件で for(m=1;m<=n;m++){ t=dertat*m; ey[0]=a*sin(w*t); if((fp=fopen("jikai","w"))==NULL){ printf("磁界あきません。n=[%d] hz[%d]\n",m,k);exit(1); } for(k=0;k<=j;k++){ hz[k]=hz[k]+(dertat*(ey[k]-ey[k-1]))/(dertax*u0); /* printf("hz[%d] = %1.14lf\n",k,hz[k]);*/ fprintf(fp,"%1.14lf\n",hz[k]); } /* if((fp=fopen("denkai","w"))==NULL) exit(2);*/ for(k=0;k<=j;k++){ ey[k]=ey[k]+(dertat*(hz[k+1]-hz[k]))/(dertax*eps1); /* fprintf(fp1,"%1.36lf\n",ey[k]);*/ } まだプログラムの途中ですがnを1000回に設定してjを99に設定しているのに nが510回めになるとif((fp=fopen("jikai","w"))==NULL){ printf("磁界あきません。n=[%d] hz[%d]\n",m,k);exit(1); の制限がかかりとまってしまいます。hzは99までしかいかないはずなのに nが510回目になると勝手にないはずのhz[100]計算してしまいとまります。 原因がわかりませんので詳しく教えていただけませんか?あとFILEの 書き込みについてのやり方も教えてください。よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
解析をしてわかった部分について回答します。 >nが510回めになるとif((fp=fopen("jikai","w"))==NULL){ > printf("磁界あきません。n=[%d] hz[%d]\n",m,k);exit(1); >の制限がかかりとまってしまいます 「nを1000回に設定して・・・」とあるので、1000回ループしてると思いますが、 ループのはじめでファイルをオープンしているのですが、次のループに入る前に閉じていますでしょうか? ファイルを閉じないで1000回開いてみたところ、私もエラーが発生しました。 1回ループするごとにfcloseで閉じてやれば問題は解決されます。 例) if((fp=fopen("jikai","w"))==NULL){ printf("磁界あきません。n=[%d] hz[%d]\n",m,k);exit(1); } (なんらかの処理) fclose(fp) ファイルを開いたら最後には閉じるのが決まりなので、ファイルはしっかり閉じるようにしましょう。 >あとFILEの >書き込みについてのやり方も教えてください。よろしくお願いします。 fwriteを使えば書き込むことができます。 fwrite(出力用領域の先頭ポインタ, 出力領域1つの大きさ(バイト), 最大出力データの数, ファイルポインタ) hz[100]を計算してしまう理由については・・・今も調査中です^^;
その他の回答 (4)
- slackware
- ベストアンサー率59% (22/37)
他の方と回答が重複している部分もあるかと思いますが. ソースを実際に検証したわけではありません. --> for(m=1;m<=n;m++){ ..... if((fp=fopen("jikai","w"))==NULL){ printf("磁界あきません。n=[%d] hz[%d]\n",m,k);exit(1); } ... } <-- ここで、ループするたびに、ファイルを新たに開いている事に なるので、「ファイルの開きすぎ」を起こしているのでは ないでしょうか?? 開いたら(fopen)、閉じる(fclose)のが原則なのですが このプログラム上で --> /* fprintf(fp1,"%1.36lf\n",ey[k]);*/ fclose(fp); /* 追加 */ } <-- と単に書いただけだと、fopen した瞬間に今まで書き込んだ データはパァになってしまいます. なので、fopen は for ループの中ではなく、ループに入る前に 行い、ループを抜けた後に、fclose すればよいのではないでしょうか?? (ループの中で、fopen をしたい意図があるのかもしれませんが...) こんな風に書き換えてみるとうまくいくのでは. --> if((fp=fopen("jikai","w"))==NULL){ printf("FILE OPEN ERROR",m,k);exit(1); } for(m=1;m<=n;m++){ ...... ..... } fclose(fp); <-- === hz[100] というのは、エラーメッセージ(fopen の失敗の時)で 表示されているのでしょうか?? だとすれば、それは合っていますよ. --> for(k=0;k<=j;k++){ hz[k]=hz[k]+(dertat*(ey[k]-ey[k-1]))/(dertax*u0); /* printf("hz[%d] = %1.14lf\n",k,hz[k]);*/ fprintf(fp,"%1.14lf\n",hz[k]); } <-- このループを抜けてきたときに、k の値は 100 (99 + 1)に なっている筈です. ご参考まで.
- madman
- ベストアンサー率24% (612/2465)
追加です。 >nが510回目になると勝手にないはずのhz[100]計算してしまいとまります。 とありますが、 for(k=0;k<=j;k++){ ey[k]=ey[k]+(dertat*(hz[k+1]-hz[k]))/(dertax*eps1); /* fprintf(fp1,"%1.36lf\n",ey[k]);*/ } jが99なので、k<=jなので、Kが99までまわり、hz[K+1]はhz[100]となります。 hz[100]で宣言しているのであれば、ループの判定は「k<j」です。 変数宣言等がわからないので、的外れかもしれませんが。
- madman
- ベストアンサー率24% (612/2465)
ソースが途中なのでなんとも言えませんが、 for(m=1;m<=n;m++){ } の中で、fopen()を繰り返していますが、fclose()は行っているのでしょうか? close()を行わないと、いくら同じファイルポインタに代入していても、限界がありますよ。 Windowsがどのくらいファイルを同時オープンできるのかは知らないですが...
- QPchan
- ベストアンサー率22% (8/36)
fp=fopen("jikai","w"))==NULLの部分はjikai.拡張子はなくていいんでしょうか? hz[k]=hz[k]+(dertat*(ey[k]-ey[k-1]))/(dertax*u0); k=0→99の部分ですが、ey[k-1]がk=0の時、ey[-1]になってますね。 けど、これだと1回目のループで不正な処理のメッセージがでて止まるはずなんだけど。。。 fileの書きこみは、別にこれでいいと思います。スピード上げようするんなら、バイナリで書き出すって手もありますが。
お礼
ありがとうございました。 おかげでプログラムもうまくいってます. 皆さんのアドバイスがあったからこそ出来ました。 これからもなんかありましたらよろしくお願いします。