5

这是相当基本的,我可能遗漏了一些非常明显的东西,但这让我有点难过。基本上,假设我正在尝试将整个 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

这里的问题是输出只是一个黑色图像,顶部有几个垃圾像素。我还尝试取出“缓冲区++”,第一个像素似乎毫无问题地转换为红色。但是,当我把它放回去时,没有一个像素是红色的(甚至不是第一个像素)。

我不确定我错过了什么。我知道当你创建一个指针时,你可以通过在指针末尾加上一个“++”来单步执行指针的下一个地址(没有 * 取消引用)。然而,这似乎是个问题。有人可以告诉我我做错了什么吗?

再次感谢,

奥斯汀

4

2 回答 2

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++;}
于 2013-09-09T01:56:25.070 回答
2

要实现的第一个概念buffer是指向像素数组存储的指针。它是指向该存储的唯一指针。如果代码修改了缓冲区,则不再容易访问该存储的开始。

其次,您希望将缓冲区设置为其原始值,以便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);

所以,试试这个。

于 2013-09-09T02:17:03.783 回答