2

C++ でいくつかの画像処理作業を行っています。このために、私は自分の仕事に適していると感じるCImg.hライブラリを使用しています。

これは、画像を読み取って表示するだけの、私が書いた小さなコードです。

#include "../CImg.h"
#include "iostream"

using namespace std;
using namespace cimg_library;

int main(int argc,char**argv)
{
     CImg<unsigned char> img(argv[1]);
     img.display();  
     return 0;  
}

このコードを入力としてlena.pgmを指定すると、画像が表示されます。たとえば、同じディレクトリに存在する ddnl.pgm など、他のイメージを指定した場合、「セグメンテーション違反」が発生します。

gdb を使用してコードを実行すると、次のような出力が得られます。

プログラム受信信号 SIGSEGV、セグメンテーション違反。
/lib/libc.so.6 からの strlen ()
の 0x009823a3 .i386 libXdmcp-1.0.2-6.fc10.i386 libgcc-4.3.2-7.i386 libstdc++-4.3.2-7.i386 libxcb-1.1.91-5.fc10.i386

誰かが私に何が問題なのか教えてもらえますか? そしてそれを解決する方法。

皆さん、ありがとうございました

4

3 に答える 3

1

Segfault は、アクセスが許可されていないメモリにアクセスしようとすると発生します。そのため、コードで確認してください。

于 2010-01-20T05:30:58.220 に答える
1

コード自体は問題ないようです。デバッグを進める方法をいくつか提案できます-

  1. display() 呼び出しを削除してみてください。問題は引き続き発生しますか? (私はそうすると思います)。
  2. (デバッガーを使用して) セグメンテーション違反を引き起こす strlen() が CImg コードのどこにあるかを調べてみてください。これにより、追加のヒントが得られる場合があります。
  3. PGM ファイルの処理中にある場合は、提供された PGM ファイルが何らかの形で無効である可能性があり、ライブラリはエラー検出を行いません。別のビューアーでファイルを開き、再度 (PGM として) 保存してみてください。新しいものが機能する場合、2 つを比較すると何かが明らかになる可能性があります。

より多くの情報があれば、より多くのことを言うことができます。

編集-

提供された追加情報を見て、コード自体を調べたところ、開こうとしているファイルの種類を確認しようとすると、CImg が失敗しているようです。

関連するコード行は -

if (!cimg::strcmp(ftype,"pnm")) load_pnm(filename);

「ftype」が使用されるのはこれが初めてであり、無効な値を持っているという結論に達しました。

「ftype」には数行上の値が与えられています -

const char *const ftype = cimg::file_type(0,filename);

file_type() 関数自体は、ヘッダーに基づいてどのファイルを開くかを推測しようとします。おそらく、拡張子に基づいて開くことが失敗したためです。後で strcmp() が失敗する原因となる、無効な値を返す適切な方法が 1 つだけあります。ファイルを使い慣れたものとして識別できなかった場合、NULL (実際には 0) を返します。

したがって、これが実際に有効なファイルであることを確認することをお勧めします。PGM ファイルを開いたり保存したりできるツールを紹介することはできませんが、簡単な Google 検索が役立つと思います。ファイルを開き、PGM として再保存してみてください。

于 2010-01-20T05:46:37.587 に答える
0

セグメンテーション違反のもう 1 つの「追跡するのが楽しい」原因は、ライブラリ間のコンパイラの不一致です。これは、C++ ライブラリを使用する場合に特に一般的です。

チェックする項目は次のとおりです。

  1. CImg ライブラリのコンパイルに使用したのと同じコンパイラでコンパイルしていますか?
  2. 同じコンパイラ フラグを使用していますか?
  3. ライブラリのコンパイル時に設定されていて、現在設定していない定義はありましたか?

これらのそれぞれは、以前に微妙な方法で私を噛みました.

于 2010-01-20T05:49:30.857 に答える