我用两种不同的方式编写了代码片段:使用二维数组作为矩阵,并使用boost :: ublas :: matrix。当我在第一种情况下添加此对象时,它正在工作,但在第二种情况下,我遇到了分段错误。我想使用第二种方式,所以如果有人知道我为什么会遇到段错误,我将不胜感激。
代码:
#include <Magick++.h>
#include <string>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
using namespace boost::numeric::ublas;
using namespace std;
using namespace Magick;
class Img
{
public:
Img();
Img(const string path2file);
unsigned int width, height;
string filename;
private:
typedef struct pix
{
Quantum R;
Quantum G;
Quantum B;
} pix;
matrix<pix> p;
pix **pixels;
string format;
};
Img::Img(const string path2file)
{
Image file;
unsigned int i, j;
Color pixel;
file.read(path2file);
filename = path2file;
width = file.size().width();
height = file.size().height();
// begin of first way
pixels = (pix**)malloc(sizeof(pix*)*height);
for(i=0 ; i<height ; ++i)
pixels[i] = (pix*)malloc(sizeof(pix)*width);
for(i=0 ; i<height ; ++i)
{
for(j=0 ; j<width ; ++j)
{
pixel = file.pixelColor(j, i);
pixels[i][j].R = pixel.redQuantum();
pixels[i][j].G = pixel.greenQuantum();
pixels[i][j].B = pixel.blueQuantum();
}
}
// end of first way
// begin of second way
p.resize(height, width);
for(i=0 ; i<height ; ++i)
{
for(j=0 ; j<width ; ++j)
{
pixel = file.pixelColor(j, i);
p(i, j).R = pixel.redQuantum();
p(i, j).G = pixel.greenQuantum();
p(i, j).B = pixel.blueQuantum();
}
}*/
}
// end of second way
我很确定这段代码不是段错误的原因。 但是当我在主程序中使用它时,我会遇到段错误(仅限第二种方式,首先是工作):
#include <iostream>
#include <stdio.h>
#include "img.h"
#include <vector>
using namespace std;
int main(void)
{
std::vector<Img> files;
files.push_back(Img("files/mini.bmp"));
return 0;
}
答案 0 :(得分:2)
将程序加载到gdb中并使其崩溃。键入gdb控制台bt或backtrace,您将获得所有调用的堆栈帧,您可以看到导致段错误的原因。
答案 1 :(得分:1)
问题在于我所写的定义。 应该是:
vector<Img*> files;
而不是
vector<Img> files;
并从
更改初始化对象Img tmp("path_to_file");
到
Img* tmp = new Img("path_to_file");
我整天都厌倦了编码,所以我犯了一些荒谬的错误。
感谢您的帮助!
答案 2 :(得分:0)
在valgrind下运行您的程序,它将帮助您找到段错误的原因和位置。
答案 3 :(得分:0)
pixels = (pix**)malloc(sizeof(pix*)*height);
这看起来很奇怪,malloc返回一个(void)指针,而不是一个指向指针但是它可以用于[] []数组我想。重新校对之后似乎没问题:p
同时使用Img类和然后使用名为“file”的变量实例化的另一个Image可能会有点令人困惑。
某些代码也缺失了(例如'p'是什么),但似乎没问题。如果我是你,我会在这里和那里放一些printf()来缩小程序崩溃的位置。 我最好的选择是p(i,j)索引可能超出范围。
祝你好运!