以下のプログラムが暴走します。ちなみにビジュアル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の
書き込みについてのやり方も教えてください。よろしくお願いします。
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の書きこみは、別にこれでいいと思います。スピード上げようするんなら、バイナリで書き出すって手もありますが。
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]を計算してしまう理由については・・・今も調査中です^^;
ありがとうございました。
おかげでプログラムもうまくいってます.
皆さんのアドバイスがあったからこそ出来ました。
これからもなんかありましたらよろしくお願いします。
No.3
- 回答日時:
ソースが途中なのでなんとも言えませんが、
for(m=1;m<=n;m++){
}
の中で、fopen()を繰り返していますが、fclose()は行っているのでしょうか?
close()を行わないと、いくら同じファイルポインタに代入していても、限界がありますよ。
Windowsがどのくらいファイルを同時オープンできるのかは知らないですが...
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」です。
変数宣言等がわからないので、的外れかもしれませんが。
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)に
なっている筈です.
ご参考まで.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- 物理学 風力発電での音 1 2023/04/16 08:55
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- その他(自然科学) 風車音の測定 3 2023/04/28 07:12
- Android(アンドロイド) teamsとzoomの必要用件 2 2023/05/09 10:21
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
エクセルの当番表を作っていま...
-
ネットワークループとルーティ...
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
画面を強制的に再描画させる方法
-
【VBA】指定の範囲から特定の文...
-
while(*s++=*t++)の判定は?
-
イベントの発生を待つ
-
Escキーを押すと、中断する時と...
-
GIFアニメをループさせたくない
-
UWSCの終了の仕方
-
「VC++6」ウィンドウの再描画
-
Java 南京錠
-
EXCEL VBA(初心者)印刷ルー...
-
磁気ループ装置の仕組みと作り方
-
VBA Dir関数でファイルをループ...
-
重複データをテーブルに表示し...
-
一巡伝達関数と開ループ伝達関数
-
CreateJS(TweenJS)での連続した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
流れ図(フローチャート)が分か...
-
乱数の桁数指定、または範囲指定。
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
-
vb.netです。2次元配列の要素を...
おすすめ情報