- ベストアンサー
forループで試行を繰返し、その度の結果を全て別出力したい (メモリが足りない?)
ほぼ同じ試行をforループで繰り返しているのですが、一つ一つの宣言している配列が非常に大きいせいか、メモリ不足の為に勝手に終了してしまいます。一回の試行だけなら特に問題なく走ってくれるので、 ・ループする前に結果を出力 ・出力し終わったら頭に戻って繰り返す ・また出た結果を今度は別の名前か何かで前のファイルに上書きせず出力 という作業を繰り返したいです。そこで、出力する際にどうすれば全部の結果を出せるのかが分からず困ってます。出力する名前を施行毎に変えたりできるのでしょうか? ちなみに、メモリが足りない可能性はmallocを使ってみましたが駄目でした。何かmalloc以外でメモリ不足を解決する方法があれば、そちらの解決方法でも構いません。 宜しく御願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>名前にカウンタ値のほうですが是非、補足の方を御願いします。 ループカウンター:i 名前:TEST00000~TEST99999とします。(iは0から99999迄ループとします) char file_name[16]; sprintf(file_name,"TEST%05d",i); とすると、file_nameに TEST00000...TEST00010のように文字が格納されます。 したがって for (変数iでループ){ sprintf(file_name,"TEST%05d",i); } のように使います。 メモリの解放は、 for(変数iでループ) malloc(1回のループの頭) free(1回のループ最後) } という意味です。 malloc(最初に確保) for(変数iでループ) } なら free(最後に解放)でかまいません。 for文の中で毎回mallocしているように見受けられたので、 1回のループの最後に解放するように回答しました。
その他の回答 (2)
- clsdi99
- ベストアンサー率63% (31/49)
どのような処理を行っているか分からないので違っているかもしれませんが、mallocを試す前で「一回の試行だけなら特に問題なく走ってくれるので」ということですので、問題は違う場所のような気がします。 それに同じ処理を何度も試行するのであれば、同じメモリを再利用しますよね?であれば、2回目以降(1回目の処理の最後など)に問題があるのではないでしょうか? それともnewを使っているとか?あるいは再帰?
お礼
回答ありがとうございます。 メモリより他が原因の可能性が高そうですね。 プログラムが本当にド素人で、前にも凡ミスを沢山していましたので、もっと細かくチェックしてみたいと思います。 newとか再帰という言葉は知らないので、使ってないはずです。 (あと、説明が下手だったかもしれませんが、毎回の試行でちょっとした誤差がでてくるので、それをデータとして抑えておきたいです。もし、何か良い方法があえば教えて欲しいです。)
- tatsu99
- ベストアンサー率52% (391/751)
>一回の試行だけなら特に問題なく走ってくれるので、 >ちなみに、メモリが足りない可能性はmallocを使ってみましたが駄目でした。 上記のことから、mallocしたメモリを使用済みになったあと、解放してないように思われます。使用済みのメモリはきちんとfreeしていますか。 1回のループの後に使用済みのメモリがあるなら、freeしてください。 >出力する名前を施行毎に変えたりできるのでしょうか? 出力する名前にループのカウンタの値を組み込みます。 i=0~10000のループならファイル名を TEST00000~TEST10000のようにします。(このようにする方法が判らないときは補足してください)
お礼
回答ありがとうございます。 ループの最後にfreeですね。確かにループ後にfreeにしてました。 名前にカウンタ値のほうですが、組み込もうとしてイマイチ上手くいってなくて困ってました。是非、補足の方を御願いします。こちらの方でも詳しい人には聞いて見たいと思います。
お礼
回答、ありがとうございます。 非常にわかりやすいです。 ちょうど作業最中ですので、早速取り掛かってみたいと思います。