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);
}
No.3ベストアンサー
- 回答日時:
★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行以内を心がけています。
・以上。参考に!
お礼が大変遅くなりまして失礼いたしました。
とりあえず今回は何とか解決いたしました。
ご助言いただきましてありがとうございました。
No.4
- 回答日時:
>セグメンテーションエラーは、これまでメモリアクセスの途中で
発生していたのですが、今回はファイルオープンの段階で発生しているようです。同じ名前のファイルがあるわけでもないのに、困惑していたところです。
この状況から察するに、提示された以外の部分(2000ステップの未提示部)でメモリの破壊を行っている可能性が高いです。
セグメンテーションエラーでcoreを吐くと思いますので、それをデバッガで追えば、メモリ破壊の手がかりがつかめるかもしれません。
そういう意味では、使用OS、コンパイラの情報も提示されると、良い回答がえられるかもしれません。
お礼が大変遅くなりまして、失礼いたしました。
デバッガを使用したことがありませんでしたが、
今回を期に今後は使いたいと思います。
ご助言に感謝します。
No.2
- 回答日時:
全ソースを提示して下さい。
これだけだと、正しいようにおもわれます。たとえば、iに0を設定してから、while(i<100)を実行していると信じたいのですが、i=-1000;等もしくは、iを初期化していない状態で、while(i<100)に突入すると、かなりのループをしますし、data[i]で、dataが破壊されます。そのような不信感をすべて取り除くには、全ソースを公開して下さい。それも、タイプミスを防ぐため、転記ではなく、ソースをコピーして、張り付けて下さい。
早速ご指摘いただきましてありがとうございます。
iについては確認しましたが問題なさそうです。
このソースファイルは2000行近くになっておりますので、
すべてを記載するのは困難ですね。
セグメンテーションエラーは、これまでメモリアクセスの途中で
発生していたのですが、今回はファイルオープンの段階で発生しているようです。同じ名前のファイルがあるわけでもないのに、困惑していたところです。
もし同じようなご経験をお持ちであれば教えてください。
取り急ぎお礼まで。
No.1
- 回答日時:
★謎です。
・ソースを見たかぎりでは、特に問題は無いように見えますが、変数の宣言部も見ないと正しく
原因を推測できませんね。
・とりあえず下のソースで実行してみて下さい。
サンプル:
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 );
}
}
最後に:
・上記のソースでエラーが出るかどうか試して下さい。
・あと変数の宣言なども補足してくれますか?
・以上。
早速のご回答ありがとうございます。
提示していただいたソースは、問題なく実行されました。
実は、質問文のソースだけなら問題なく実行できるのですが、
すべてのプログラムを実行すると、"aaaaa"を出力後、
"bbbbb"が出る前に止まってしまいます。。。
お探しの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# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- 画像編集・動画編集・音楽編集 DVD Styler トラブル解決方法 6 2022/10/29 16:00
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- その他(プログラミング・Web制作) Pythonを勉強しています。 5 2023/08/25 09:51
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
Excelのエラーで困ってます。
-
適切な変換関数が存在しない???
-
エクセルでマクロを実行すると...
-
fortranでプログラムを実行する...
-
デバッグ中のエラーのことで教...
-
sys/time.hのインクルードがで...
-
HEWを使用しているのですが、こ...
-
Fortran コンパイルエラーについて
-
ccコマンド時の0711-317エラー
-
ビルド失敗 指定されたファイ...
-
LPCWSTRとchar
-
atlstr.hのインクルードによる...
-
visual C++ でビルドの中止がで...
-
「指定したフォルダにあるファ...
-
RightとLeft関数のライブ...
-
multiple definitionというエラー
-
バッチからsqlplusの接続エラー...
-
VBScriptのエラーの見つけ方及...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
Excelのエラーで困ってます。
-
fortranでプログラムを実行する...
-
適切な変換関数が存在しない???
-
HEWを使用しているのですが、こ...
-
コンパイルできません。
-
バッチからsqlplusの接続エラー...
-
デバッグ中のエラーのことで教...
-
visual C++ でビルドの中止がで...
-
VB2008で定数に色の設定をした...
-
ビルド失敗 指定されたファイ...
-
Handlesについて
-
RightとLeft関数のライブ...
-
エラー 'iostream.h' : No su...
-
sys/time.hのインクルードがで...
-
DLL関数を使ったプログラム
-
Visual Studioのstrcpy_sについて
-
レコードセットをcloseする所で...
-
LPCWSTRとchar
おすすめ情報