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,分段错误。
0x009823a3 in strlen () from /lib/libc.so.6
缺少单独的调试信息,使用:debuginfo-install glibc-2.9-2.i686 libX11-1.1.4-5.fc10.i386 libXau-1.0.4-1.fc10 .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

当您尝试访问不允许访问的内存时,就会出现段错误。所以请在代码中检查一下。

于 2010-01-20T05:30:58.220 回答
1

代码本身看起来还不错。我可以建议一些继续调试的方法 -

  1. 尝试删除 display() 调用。问题是否仍然存在?(我认为确实如此)。
  2. 尝试找出 CImg 代码中导致分段错误的 strlen() 的位置(通过使用调试器)。这可能会提供额外的提示。
  3. 如果它在 PGM 文件处理中,可能提供的 PGM 文件在某些​​方面无效,并且库不进行错误检测 - 尝试在其他查看器中打开它,然后再次保存(作为 PGM)。如果新的有效,比较两者可能会发现一些东西。

一旦你有更多的信息,就可以说更多。

编辑-

查看您提供的额外信息并查阅代码本身,CImg 在尝试检查您打开的文件类型时似乎失败了。

相关的代码行是 -

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

这是第一次使用“ftype”,这使我得出结论,它具有无效值。

'ftype' 在上面几行被赋予了一个值 -

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

file_type() 函数本身尝试根据其标题猜测要打开哪个文件,可能是因为基于扩展名打开它失败了。只有一种合理的方法可以返回无效值,这会导致 strcmp() 失败 - 当它无法将文件识别为它熟悉的任何内容时,它会返回 NULL(实际上是 0)。

因此,我重申我的建议,即您尝试验证这确实是一个有效文件。我不能指出任何能够打开/保存 PGM 文件的工具,但我猜一个简单的谷歌搜索会有所帮助。尝试打开文件并将其重新保存为 PGM。

于 2010-01-20T05:46:37.587 回答
0

另一个导致分段错误的“有趣”原因是库之间的编译器不匹配——这在使用 C++ 库时尤其普遍。

要检查的事项是:

  1. 您是否使用与编译 CImg 库相同的编译器进行编译?
  2. 您是否使用相同的编译器标志?
  3. 编译您现在没有设置的库时是否设置了任何定义?

这些中的每一个以前都以微妙的方式咬过我。

于 2010-01-20T05:49:30.857 回答