-PR-
解決済み

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

  • すぐに回答を!
  • 質問No.35009
  • 閲覧数113
  • ありがとう数5
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 20% (1/5)

以下のプログラムが暴走します。ちなみにビジュアル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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル9

ベストアンサー率 34% (15/43)

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

>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

お礼率 20% (1/5)

ありがとうございました。
おかげでプログラムもうまくいってます.
皆さんのアドバイスがあったからこそ出来ました。
これからもなんかありましたらよろしくお願いします。
投稿日時 - 2001-02-05 12:09:03
関連するQ&A
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル8

ベストアンサー率 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回目のループで不正な処理のメッセージがでて止ま ...続きを読む
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の書きこみは、別にこれでいいと思います。スピード上げようするんなら、バイナリで書き出すって手もありますが。


  • 回答No.3
レベル14

ベストアンサー率 24% (612/2465)

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

Windowsがどのくらいファイルを同時オープンできるのかは知らないですが...
  • 回答No.4
レベル14

ベストアンサー率 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<= ...続きを読む
追加です。
>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」です。
変数宣言等がわからないので、的外れかもしれませんが。
  • 回答No.5
レベル8

ベストアンサー率 59% (22/37)

他の方と回答が重複している部分もあるかと思いますが. ソースを実際に検証したわけではありません. --> for(m=1;m<=n;m++){   .....   if((fp=fopen("jikai","w"))==NULL){    printf("磁界あきません。n=[%d] hz[%d]\n",m ...続きを読む
他の方と回答が重複している部分もあるかと思いますが.

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

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

ご参考まで.
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ