gpt4 book ai didi

c - 解释一下这个图像对象中的 "scanline pointer array"?

转载 作者:太空宇宙 更新时间:2023-11-04 00:32:21 28 4
gpt4 key购买 nike

我是 C 的新手,这个表示图像的结构让我感到困惑。它用于此 Graphics Gem .

有人可以解释结构的正确实例化和使用,尤其是关于扫描线指针数组吗?

typedef unsigned char Pixel;

typedef struct {
short Hres; /* no. pixels in x direction */
short Vres; /* no. pixels in y direction */
int Size; /* size in bytes */
Pixel *i; /* pixel array */
Pixel *p[1]; /* scanline pointer array; position (x,y) given by image->p[y][x] */
} Image;

此外:在索引二维数组时是否要避免隐式乘法?它不应该是 **p 可以分配给 Vres * sizeof(size_t) 并填充适当的行指针吗?

更新
我想我明白。这个示例 block 有效吗?

int m, n, y, x; /* Vres, Hres, index variables */
Image *image;
image = malloc(sizeof(Image) + (m - 1) * sizeof(Pixel*));
image->Hres = n;
image->Vres = m;
image->Size = m*n*sizeof(Pixel);
image->i = malloc(image->Size);

for (y=0; y<m; y++)
{
image->p[y] = image->i + (y * n);
for (x=0; x<n; x++)
{
image->p[y][x] = 0; /* or imageSource[y][x] */
}
}
/* use image */
free(image->i);
free(image);

最后,在现代计算机(具有大量内存)上,使用这样的扫描线指针数组而不是二维数组是否有意义?在这种情况下,唯一的区别是隐式指针乘法。

最佳答案

Image 结构的最后一个成员 p 用作 C89 灵活数组成员

灵活数组成员 是 C99 的一项功能,在 C99 之前,人们有时会使用所谓的struct hack 来实现与 C89 类似的行为。

下面是如何动态分配一个只有一个数组元素的Image结构对象:

Image *bla1, *bla2;
bla1 = malloc(sizeof *bla1);

下面是如何使用 n 数组元素分配结构对象:

bla2 = malloc(sizeof *bla2 + (n - 1) * sizeof bla2->p[0]);

p 数组中正确初始化 Pixel * 指针后,您可以像这样访问 Pixel 值:

bla2->p[x][y]

关于 struct hack 的一致性,C99 Rationale 说

the validity of this construct has always been questionable.

而 C 缺陷报告 (DR #051) 是这样说的

The idiom, while common, is not strictly conforming.

关于c - 解释一下这个图像对象中的 "scanline pointer array"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8841291/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com