アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (5件)

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

解析をしてわかった部分について回答します。



>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]を計算してしまう理由については・・・今も調査中です^^;
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/02/05 12:09

ソースが途中なのでなんとも言えませんが、


for(m=1;m<=n;m++){
}
の中で、fopen()を繰り返していますが、fclose()は行っているのでしょうか?
close()を行わないと、いくら同じファイルポインタに代入していても、限界がありますよ。

Windowsがどのくらいファイルを同時オープンできるのかは知らないですが...
    • good
    • 0

追加です。


>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」です。
変数宣言等がわからないので、的外れかもしれませんが。
    • good
    • 0

他の方と回答が重複している部分もあるかと思いますが.



ソースを実際に検証したわけではありません.

-->
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)に
なっている筈です.

ご参考まで.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!