あなたの「必」の書き順を教えてください

こんにちは

プログラムが異常終了して困っているので質問します.
全部は長いため,一部を以下に載せます.

.....................
printf("e\n");
free(home->obp);
home->obp=NULL;
free(home->Stress);
home->Stress=NULL;
printf("f\n");
   fclose(fp);
    printf("g\n");
fclose(fpc);
printf("h\n");
fclose(fpr);
・・・・・・・・・・・・・・・・・・・・・

の部分で,出力が,
e
f
g
-------------------------------------------------------
Primary job terminated normally, but 1 process returned
a non-zero exit code. Per user-direction, the job has been aborted.
-------------------------------------------------------
--------------------------------------------------------------------------
mpirun noticed that process rank 0 with PID 0 on node katsura exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------
となって終了します.
printfの所で改行を抜かすとeの文字すら出ないのもよくわかりません.printf("e\n");までは問題なくできてます.

ちなみに,割当は以下のように行い,
home->obp=(real8 *)calloc(3*r,sizeof(real8));
home->Stress=(real8 *)calloc(6*r,sizeof(real8));
ファイルへの書き込みはうまくいってます.

どなたかお知恵を拝借できないでしょうか.

質問者からの補足コメント

  • つらい・・・

    異常終了は,プログラムを繰り返し実行することで起こります.つまり,最初は何の問題もなく実行されています.

      補足日時:2018/03/08 11:28
  • OSはfedora27で、コンパイラはgcc、バージョンは7.2.1です
    実行時のコマンドはmpirun -np 1 <プログラム名> と打ち込んでいます

      補足日時:2018/03/09 16:26

A 回答 (4件)

肝心のバッファを使った処理のソースが無いんじゃ手も足も


出ないですね。

メモリ破壊(Segmentation fault)だと、原因と影響を受けるところが
かけ離れることが多いから、何処でコケているかはたいした手掛かりには
ならないです。

確保したバッファの外にアクセスしていないか丹念にソースを
調べるしかないです。
ファイル出力が正しいことはメモリ操作が正しいことを全く保証しません。
目を皿のようにしてー文字ー文字ソースを調べましょう。
    • good
    • 0
この回答へのお礼

free()忘れと割り付けた領域が足りなくなることもあるのが犯人でした.

数々の回答ありがとうございました.

お礼日時:2018/03/18 11:19

ソース全部ないとなんとも言えません。

やっぱり。
カンではSegmentation fault……。
理由は、単に、昔、繰り返し実行する事でおこる異常終了で、
バッファオーバーフローで異常終了するときと問題なくそのまま続行される時があって
その時と状況が似ているなってだけですが。
それくらいしか……すみません。
    • good
    • 0

補足要求です。


1)OSとコンパイラはなんでしょうか。
2)ソースが一部だけ提示されていますが、異常終了の原因は提示されていない箇所にあるように思われます。
https://ideone.com/
上記のサイトは、ユーザー登録不要のソース共有サイトです。こちらに全ソースを提示可能でしょうか。
3)上記のプロフラムは、他のシェル等から呼び出されているように見えます。
どのように実行しているのでしょうか。

以上、この問題を私が解決できる保証はありませんが、上記について開示していただくと、より良い回答がつくかとおもいます。
    • good
    • 0
この回答へのお礼

ありがとうございます。補足させていただきます。

2については、今現在手元にプログラムを置いてないため、しばらくはソースコードをお見せすることはできません。すみません。

お礼日時:2018/03/09 16:23

この部分は、問題のあるジョブだけが実行するものでしょうか?


とすると、fclose(fpc);かfclose(fpr);のどちらかが犯人でしょうね。
より具体的には、fpcまたはfprがこれよりも前にfcloseされている、もしくはそもそもfopenされていない可能性があります。
ある条件下でのみfopenするものであったり、エラー処理でリソース解放のためにfcloseしていながらreturnやexitを書き忘れる、なんてことはよくありがちです。

>printfの所で改行を抜かすとeの文字すら出ないのもよくわかりません.

これは、FILE構造体を利用する関数特有の動作です。
fprintfなど「f」で始まる関数は、引数にFILE構造体を取ります(printf(fmt, ...)はfprintf(stdout, fmt, ...)と同じ意味です)。
FILE構造体の中には、出力先ファイルなどの情報とともに、読み込んだり書き込んだりしたデータを一時的に蓄えるバッファを持っています。デバイスから読み込む、デバイスに書き込む操作には、システムコールという重い処理を伴うため、これをあまり頻繁に実行したくありません。このため、こういった関数では、頃合いを見てシステムコールを発生させるようにしています。

具体的には、書き込みの場合は例えば「\n」が現れたり、ためた書き込みバッファ上のデータが一定量以上になった時などにシステムコールを発生させる=デバイスに実際に出力します。なので、prinff("e"); は、stdoutというFILE構造体の中にある書き込みバッファの末尾に1バイトのデータが書き加えられるだけで、画面に出力する動作は起きないでしょう。なお、強制的に書き込みバッファにあるデータをデバイスに出力させるときは、fflush()という関数を使います。
    • good
    • 0
この回答へのお礼

ありがとうございます!
FILE構造体の話は初耳だったのでとても助かります.

しかし,異常終了の問題は最初は発生せず,何回か繰り返した時に起こるんですよね...
ですから,fopenしていない,fcloseをどこかでしている,ということは無いです(確認しました).最も,プログラムに書き込むことなしに自動でそういった処理が行われている等していれば話は別ですが.そんなことありますかね??

お礼日時:2018/03/08 11:26

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


おすすめ情報