Aus*_*tin 5 c struct pointers pixel ppm
这是相当基本的,我可能错过了一些非常明显的东西,但是这个让我有点难过.基本上,假设我试图将整个PPM图像变为红色(这实际上并不是我正在做的事情,但为了排除故障,我们将继续这样做).我有一个结构,我用来存储像素值.
typedef struct pixel_type
{
unsigned char r;
unsigned char g;
unsigned char b;
} pixel_t;
Run Code Online (Sandbox Code Playgroud)
我用来指向该结构的指针是"缓冲区".
pixel_t *buffer;
Run Code Online (Sandbox Code Playgroud)
我也分配了我需要的空间量(图像的宽度*图像的高度*像素值的数量[3])
buffer = malloc(WIDTH*HEIGHT*sizeof(pixel_t));
Run Code Online (Sandbox Code Playgroud)
然后我有一个'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
Run Code Online (Sandbox Code Playgroud)
这里的问题是输出只是一个黑色图像,顶部有几个垃圾像素.我也尝试取出'buffer ++',并且第一个像素似乎被转换为红色而没有任何问题.但是,当我把它重新放入时,没有像素是红色的(甚至不是第一个).
我不确定我错过了什么.我知道当你创建一个指针时,你可以直接通过在末尾用'++'做指针(没有*取消引用)来逐步指向指针的下一个地址.然而,这似乎是个问题.有人能告诉我我做错了什么吗?
再次感谢,
奥斯汀
我认为问题在于您没有存储已分配的缓冲区指针的初始值。您在循环中递增指针,因此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++;}
Run Code Online (Sandbox Code Playgroud)