- ベストアンサー
C言語による判別分析法プログラムの作成とセグメンテーションエラーの解決方法
- C言語で判別分析法を行うプログラムを作成しましたが、セグメンテーションエラーが発生しています。メモリ不足が原因の可能性があります。
- また、mallocやfreeの使い方が分からず、メモリの確保と解放がうまく行えません。
- セグメンテーションエラーの解決方法として、メモリの使用方法を見直すことが必要です。mallocやfreeの使い方について学習し、適切なメモリの確保と解放を行うように修正することでエラーを解消できます。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
No4 編集ミスってました 以下のように修正 for(kido=0;kido<255;kido++){ count=0; r = pPic->r; for(i=0 ; i<pPic->y ; i++){ for(j=0 ; j<pPic->x ; j++){ if(*(r++)==kido){ count++; } } } hist[kido]=count;//←ここがあやしい //printf("%d\n",count);debug } ただ処理回数増やして実行速度落とすだけで非常に無駄なコードなので私なら 以下のようにする count=0; for(i=0 ; i<pPic->y ; i++){ for(j=0 ; j<pPic->x ; j++){ if(*(r++)==kido){ count++; } } } for(kido=0;kido<255;kido++){ hist[kido]=count;//←ここがあやしい //printf("%d\n",count);debug }
その他の回答 (6)
- koi1234
- ベストアンサー率53% (1866/3459)
>No.5の後者のだとうまくいかなかった(countは各kidoで初期化したい)ので前者のでいきました。 そんなことないだろ と思ってよく見たら kido と比較してましたね そりゃうごかんわ 失礼しました
- koi1234
- ベストアンサー率53% (1866/3459)
追加です 全体のソースまともに見もしなかったけど軽く見たら No5の変更したとしても それ以降で同じことやってるのでそれだけじゃ治りません 必要なところに r = pPic->r; を加えてポインタを適切な位置に再設定してください それがどこかはあえて書かない
- koi1234
- ベストアンサー率53% (1866/3459)
前からの継続かな?(内容は違うけど 構造体自体は同じように見えるので) ここが怪しいと書かれた上の for(i=0 ; i<pPic->y ; i++){ for(j=0 ; j<pPic->x ; j++){ if(*(r++)==kido){ count++; } } } まではいいが それを for(kido=0;kido<=255;kido++){ でループさせてるために 結果として *(r++) でとんでもないところをアクセスしてエラーになる コード全体の検証はしてないからそれで求める結果を得られるかは知らないが エラーをなくしたいのであれば以下のようにすればエラーはなくなると思われる for(kido=0;kido<255;kido++){ r = pPic->r; for(j=0 ; j<pPic->x ; j++){ if(*(r++)==kido){ count++; } } } hist[kido]=count;//←ここがあやしい //printf("%d\n",count);debug }
- kmee
- ベストアンサー率55% (1857/3366)
バッファオーバーランの原因は「*(r++)」でしょうね。 あと、sumhei1を始め、配列の中身を確認してください。むちゃくちゃになっていると思います。
- samtomsan
- ベストアンサー率55% (1060/1897)
> hist[kido]=count;//←ここがあやしい この前で kido の値を表示してみれば「あやしい」かどうか判ります。 デバッグの方法を考えてみてください。 配列が hist[256] になっていますから、kido が 256 になっていればご自分で考えた通りに「あやしい」ことになります。
補足
debugのところをkidoを出力するようにして実行してみたら 0 1 2 3 segmentation fault(コアダンプ) となりました。別の理由であやしいようですが、見当がつきません・・・。
- wormhole
- ベストアンサー率28% (1626/5665)
>hist[kido]=count;//←ここがあやしい なぜあやしいと思ったんですか。 あやしいと思ったからには何か根拠があるんですよね? int hist[256]; で、添字として使って大丈夫なのはいくつからいくつまでかわかりますか?
補足
いやーお恥ずかしい、<=255を<255に変えました。 ですが、debugのところを//を外して実行すると、 8 37 59 9 segmentation fault(コアダンプ) となるので、配列をはみ出したとかではないなと考えます。(いやさっきまではみ出してましたが) 4回だけループしてセグフォする理由が分かりません・・・
お礼
ようやく画像がちゃんと2値化されました。 こんな無能な僕に丁寧に教えてくださり本当にありがとうございました。 よければ勉強法も教えていただきたいです。やはり経験あるのみなのでしょうか。
補足
朝に引き続いての回答ありがとうございます。 No.5の後者のだとうまくいかなかった(countは各kidoで初期化したい)ので前者のでいきました。 r=pPic->rは r = pPic->r; for(i=0 ; i<pPic->y ; i++){ for(j=0 ; j<pPic->x ; j++){ if(*(r++) < Msikiin) のとこにいれました。 結果、画像が2値化されず、真っ黒になったので、現在調査中です。