这是相当基本的,我可能会遗漏一些非常明显的东西,但这个让我有点难过。基本上,假设我试图将整个PPM图像变为红色(这实际上并不是我正在做的事情,但为了排除故障,我们将继续这样做)。我有一个结构,我用来存储像素值。
typedef struct pixel_type
{
unsigned char r;
unsigned char g;
unsigned char b;
} pixel_t;
我用来指向该结构的指针是“缓冲区”。
pixel_t *buffer;
我还分配了我需要的空间量(图像的宽度*图像的高度*像素值的数量[3])
buffer = malloc(WIDTH*HEIGHT*sizeof(pixel_t));
然后我有一个'for'循环,我用它来逐步通过缓冲区指针并将每个像素值转换为红色。
int i;
for (i=0;i<(WIDTH*HEIGHT);i++){
buffer->r=255;
buffer->g=0;
buffer->b=0;
buffer++;} //this part appears to be the problem
这里的问题是输出只是一个黑色图像,顶部有几个垃圾像素。我也尝试取出'buffer ++',并且第一个像素似乎转换为红色而没有任何问题。但是,当我把它重新放入时,没有像素是红色的(甚至不是第一个)。
我不确定我错过了什么。我知道当你创建一个指针时,你可以直接通过在末尾用'++'做指针(没有*取消引用)来逐步指向指针的下一个地址。然而,这似乎是个问题。有人能告诉我我做错了什么吗?
再次感谢,
奥斯汀
答案 0 :(得分:3)
我认为问题在于您没有存储已分配的缓冲区指针的初始值。您可以在循环中递增指针,因此buffer
指向循环结束后缓冲区的末尾。
在循环中使用不同的指针来解决此问题:
int i;
pixel_t *ptr;
for (i=0, ptr = buffer;i<(WIDTH*HEIGHT);i++){
ptr->r=255;
ptr->g=0;
ptr->b=0;
ptr++;}
答案 1 :(得分:2)
要实现的第一个概念是buffer
是指向像素数组存储的指针。它是指向该存储的 ONLY 指针。如果代码修改了缓冲区,则不再容易访问该存储的启动。
其次,您希望将缓冲区设置为其原始值,以便可以反转malloc
。因此,保留两个指针来访问像素数组。其中一个是“锚”,另一个是索引器:
pixel_t *buffer, *pix;
buffer = malloc(WIDTH*HEIGHT*sizeof(pixel_t));
for (pix = buffer; pix < buffer + (WIDTH*HEIGHT); pix++)
{
pix->r = 255;
pix->g = 0;
pix->b = 0;
}
// later in your code
free(buffer);
所以,试试这个。