初めて自分の家と他人の家が違う、と意識した時

wileのループの途中で、バイナリのファイルを出力しているのですが、しばらくはファイルを出力してくれるものの、毎回決まった回数
ループが回ると、セグメンテーションエラーで止まってしまいます。

症状としては、以下のようなプログラムを実行すると、しばらくは問題なく処理されるのですが、ループの途中で、
aaaaa"の表示の後、"OPEN FAILED"の表示はないまま、
"bbbbb"が表示されるまえに、エラーで止まってしまいます。

原因がよくわかりません。どなたか、原因が推測できる方が
おられましたら教えてください。
よろしくお願いします。
(OSはwindowsXP,コンパイラはgccを使用しております。)

while(i<100){
i++;
data[i] = i;
sprintf(file,"file_%d",i);
printf("aaaaa\n");
if((fp=fopen(file,"wb")) == NULL) {
printf("OPEN FAILED %s\n", file);
exit(0);
}
printf("bbbbb\n");
fwrite(data, sizeof(short), 100, fp);
printf("ccccc\n");
fclose(fp);
}

A 回答 (4件)

★2000行もあるのならば、デバッグを行って下さい。


・まず、全ソースを丸ごと別フォルダにコピーします。
 そして、すべてのサブ関数を取り外します。
 その後に while 文に関わる関数を1つ1つ記述していき、セグメント・エラーを起こす関数を
 突き止めて下さい。おそらく、このようなエラー(バグ)がまだ隠れていて、それが原因となって
 ファイルの入出力管理のメモリも破壊しているのではと思います。
・2000行のソースを見直すのは大変ですが、一度、新規作成して1つ1つの関数を追加して行く
 やり方で原因が早ければ1日(6~8時間)で見つかります。また、それぞれのサブ関数の見直しも
 した方が良いでしょう。→引数、戻り値、処理を明確にするなど。
・サブ関数は、ちょっとした関数マニュアルを作成して、その記述を元に新規作成します。
 サブ関数のソースを覗いて動作を探るようにはしないで下さい。→関数の処理を明確にすること。

余談:
・昔、MS-DOS 時代に優れたフリーソフトがあり、Cソースもあったので覗いた事がありました。
 とても優れた(私が初心者時代の)ソフトでCソースのかなりすっきりとした綺麗な記述だと思って
 期待して覗いたのです。ところが、main 関数だけで記述されていてサブ関数が1つもありません
 でした。さらに main 関数の行数が 1000 行以上もあってかなりショックでした。
 後にも先にも main 関数だけで 1000 行以上の記述されたソースは、それ1つでした。
・よって、分かりやすく関数に分割する良いお手本(反面教師)となりました。
 2000 行のソースも当然、複数のサブ関数から構成されていると思いますが、1関数では最大でも
 50 行以内に収まるよう記述するようにしましょう。→私は 50行以内を心がけています。
・以上。参考に!
    • good
    • 0
この回答へのお礼

お礼が大変遅くなりまして失礼いたしました。
とりあえず今回は何とか解決いたしました。
ご助言いただきましてありがとうございました。

お礼日時:2007/04/22 14:03

>セグメンテーションエラーは、これまでメモリアクセスの途中で


発生していたのですが、今回はファイルオープンの段階で発生しているようです。同じ名前のファイルがあるわけでもないのに、困惑していたところです。
この状況から察するに、提示された以外の部分(2000ステップの未提示部)でメモリの破壊を行っている可能性が高いです。
セグメンテーションエラーでcoreを吐くと思いますので、それをデバッガで追えば、メモリ破壊の手がかりがつかめるかもしれません。
そういう意味では、使用OS、コンパイラの情報も提示されると、良い回答がえられるかもしれません。
    • good
    • 0
この回答へのお礼

お礼が大変遅くなりまして、失礼いたしました。
デバッガを使用したことがありませんでしたが、
今回を期に今後は使いたいと思います。

ご助言に感謝します。

お礼日時:2007/04/22 14:04

全ソースを提示して下さい。

これだけだと、正しいようにおもわれます。
たとえば、iに0を設定してから、while(i<100)を実行していると信じたいのですが、i=-1000;等もしくは、iを初期化していない状態で、while(i<100)に突入すると、かなりのループをしますし、data[i]で、dataが破壊されます。そのような不信感をすべて取り除くには、全ソースを公開して下さい。それも、タイプミスを防ぐため、転記ではなく、ソースをコピーして、張り付けて下さい。
    • good
    • 0
この回答へのお礼

早速ご指摘いただきましてありがとうございます。
iについては確認しましたが問題なさそうです。

このソースファイルは2000行近くになっておりますので、
すべてを記載するのは困難ですね。
セグメンテーションエラーは、これまでメモリアクセスの途中で
発生していたのですが、今回はファイルオープンの段階で発生しているようです。同じ名前のファイルがあるわけでもないのに、困惑していたところです。
もし同じようなご経験をお持ちであれば教えてください。
取り急ぎお礼まで。

お礼日時:2007/04/05 12:28

★謎です。


・ソースを見たかぎりでは、特に問題は無いように見えますが、変数の宣言部も見ないと正しく
 原因を推測できませんね。
・とりあえず下のソースで実行してみて下さい。

サンプル:
char file[ 256 ];
short data[ 100 ] = { 0 };
FILE *fp;
int i;

for ( i = 0 ; i < 100 ; i++ ){
 data[ i ] = (i + 1);
 sprintf( file, "file_%d", i );
 printf( "aaaaa\n" );
 
 if ( (fp = fopen(file,"wb")) != NULL ){
  printf( "bbbbb\n" );
  fwrite( data, sizeof(short), 100, fp );
  printf( "ccccc\n" );
  fclose( fp );
 }
 else{
  printf( "OPEN FAILED %s\n", file );
  exit( 0 );
 }
}

最後に:
・上記のソースでエラーが出るかどうか試して下さい。
・あと変数の宣言なども補足してくれますか?
・以上。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
提示していただいたソースは、問題なく実行されました。
実は、質問文のソースだけなら問題なく実行できるのですが、
すべてのプログラムを実行すると、"aaaaa"を出力後、
"bbbbb"が出る前に止まってしまいます。。。

お礼日時:2007/04/05 12:22

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


おすすめ情報