Я новичок в C, и эта структура, представляющая изображение, сбивает меня с толку. Это используется в этом Графике 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)
и заполнено соответствующими указателями строк?
Обновление
Я думаю, что понял. Этот пример блока действителен?
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);
Наконец, на современных компьютерах (с большим объемом памяти) имеет ли смысл использовать такой массив указателей на линии сканирования, а не двумерный массив? В этом случае единственной разницей будет неявное умножение указателя.