对于varisty项目,我的任务是构建一个操作PGM文件的程序。我几个小时以来一直在反对这个问题,我终于决定放弃并寻求帮助。
我的问题围绕着两个类:
这是我的代码:(我试图剥离到导致我出现问题的成员和函数)
pixel_traits.h
class pixel_traits
{
public:
typedef unsigned char pixel;
static inline pixel invert(pixel value)
{
return 255-value;
}
};
}
pgmImage.h
class pgmImage
{
public:
typedef unsigned char pixel;
int width;
int height;
int pixelStart;
pixel *pixels;
class iterator{
public:
int x;
int y;
iterator(pgmImage& img, int xx, int yy);
pixel& operator*();
private:
pgmImage* image;
};
static void pgmImage::invert(pgmImage::iterator &first, pgmImage::iterator &last,
pgmImage::iterator &result);
pgmImage::iterator pgmImage::begin(void);
pgmImage::iterator pgmImage::end(void);
};
}
pgmImage.cpp
pgmImage::iterator pgmImage::begin(void)
{
return iterator(*this,0,0);
}
pgmImage::iterator pgmImage::end(void)
{
return iterator(*this,width,height);
}
void pgmImage::invert(pgmImage::iterator & first, pgmImage::iterator & last, pgmImage::iterator & result)
{
for (first.x;first.x!=last.x;first.x++){
for (first.y;first.y!=last.y;first.y++){
*result=pixel_traits::invert(*first);
result.y++;
}
result.x++;
}
}
iterator.cpp
pgmImage::iterator::iterator(pgmImage& img, int xx, int yy)
{
x=xx;
y=yy;
image=&img;
}
pgmImage::pixel& pgmImage::iterator::operator*()
{
return (*image).pixels[(*image).pixelStart+(y*(*image).width)+x];
}
现在我的问题是调用我的反转方法不会改变PGM的像素。
示例:
cout<<img(10,10)<<"\n";
pgmImage::invert(img.begin(),img.end(),img.begin());
cout<<img(10,10)<<"\n";
两个打印件都将返回相同的值,而第二个应为255减去第一个值。
现在让我疯狂的是,当我调试它时,反转功能似乎正在工作。如果我在反转方法中添加一些打印件。即
cout<<*result<<"\n";
*result=pixel_traits::invert(*first);
cout<<*result<<"\n";
然后我会第二次打印出反转值。但由于某种原因,这种变化并没有反映出实际的pgmImage对象。
编辑:问题已解决!
原来我没有在invert方法中重置其中一个迭代器位置。解决方案:
void pgmImage::invert(pgmImage::iterator & first, pgmImage::iterator & last,
pgmImage::iterator & result){
for (first.x;first.x!=last.x;first.x++){
for (first.y;first.y!=last.y;first.y++){
*result=pixel_traits::invert(*first);
result.y++;
}
result.y=0;
first.y=0;
result.x++;
}
}
谢谢大家!