• ベストアンサー

以下のプログラムが・・・。

以下のプログラムが暴走します。ちなみにビジュアル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の 書き込みについてのやり方も教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • arthur
  • ベストアンサー率34% (15/43)
回答No.2

解析をしてわかった部分について回答します。 >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]を計算してしまう理由については・・・今も調査中です^^;

yoshinen
質問者

お礼

ありがとうございました。 おかげでプログラムもうまくいってます. 皆さんのアドバイスがあったからこそ出来ました。 これからもなんかありましたらよろしくお願いします。

その他の回答 (4)

  • slackware
  • ベストアンサー率59% (22/37)
回答No.5

他の方と回答が重複している部分もあるかと思いますが. ソースを実際に検証したわけではありません. --> 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)
回答No.4

追加です。 >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)
回答No.3

ソースが途中なのでなんとも言えませんが、 for(m=1;m<=n;m++){ } の中で、fopen()を繰り返していますが、fclose()は行っているのでしょうか? close()を行わないと、いくら同じファイルポインタに代入していても、限界がありますよ。 Windowsがどのくらいファイルを同時オープンできるのかは知らないですが...

  • QPchan
  • ベストアンサー率22% (8/36)
回答No.1

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の書きこみは、別にこれでいいと思います。スピード上げようするんなら、バイナリで書き出すって手もありますが。

関連するQ&A