以下のプログラムが暴走します。ちなみにビジュアル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.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.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)に
なっている筈です.
ご参考まで.
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.3
- 回答日時:
ソースが途中なのでなんとも言えませんが、
for(m=1;m<=n;m++){
}
の中で、fopen()を繰り返していますが、fclose()は行っているのでしょうか?
close()を行わないと、いくら同じファイルポインタに代入していても、限界がありますよ。
Windowsがどのくらいファイルを同時オープンできるのかは知らないですが...
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UWSCの終了の仕方
-
Escキーを押すと、中断する時と...
-
VBA Dir関数でファイルをループ...
-
DoEventsが必要な理由について
-
アクティブセルから、A列最終行...
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
ループフリー
-
CSVファイルの特定の行だけを読...
-
VBAでの一時停止と再開の方法
-
imacros 内でのループ処理
-
VBA for i=1 to lastrow
-
VBS オーバーフローの原因
-
乱数の桁数指定、または範囲指定。
-
sscanfより速い方法について。
-
ボタンが押された時にループか...
-
``` #include <stdio.h> #inclu...
-
範囲指定したセルを1つずつ飛...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UWSCの終了の仕方
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
Escキーを押すと、中断する時と...
-
DoEventsが必要な理由について
-
VBAでの一時停止と再開の方法
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
GIFアニメをループさせたくない
-
VBA for i=1 to lastrow
-
乱数の桁数指定、または範囲指定。
-
ループフリー
-
vb.netからエクセル関数書き込み
-
エクセル関数で1〜12の数字がル...
-
vbscriptでIE自動入力(途中で...
-
null 参照の例外が実行時に発生...
-
アクティブセルから、A列最終行...
-
Do whileでExitせず、ループの...
-
UWSCに制限時間を付けたいです
-
CSVファイルの特定の行だけを読...
おすすめ情報