我在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,我得到了“Segmentation Fault”。
当我使用gdb运行代码时,我得到如下输出:
编程接收信号SIGSEGV,分段故障 来自/lib/libc.so.6的strlen()中的0x009823a3 缺少单独的debuginfos,请使用: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
有人可以告诉我这是什么问题吗?以及如何解决它。
谢谢大家
答案 0 :(得分:1)
当您尝试访问不允许访问的记忆时,会出现Segfault。 所以请在代码中查看。
答案 1 :(得分:1)
代码本身看起来很好。我可以建议一些方法来继续调试 -
获得更多信息后,可以说更多信息。
编辑 -
查看您提供的额外信息并查阅代码本身,在尝试检查您要打开的文件类型时,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。
答案 2 :(得分:0)
追踪分段错误的另一个“乐趣”是库之间的错误匹配 - 这在使用C ++库时尤其普遍。
要检查的事项是:
之前每一个都以微妙的方式咬我。