C++ BITMAPINFO结构的颜色字段
C++ BITMAPINFO结构的颜色字段,c++,arrays,windows,struct,C++,Arrays,Windows,Struct,BITMAPINFO结构具有以下声明 typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; 为什么RGBQUAD数组是静态的?为什么它不是指针?它是否是静态的并不重要。问题是,您仍然需要为调色板分配足够的内存。它是一个RGBguad,因为它只存储R、G、B、a,其他什么都不存储 例如: for(i = 0; i < 256; i++) {
BITMAPINFO
结构具有以下声明
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
为什么
RGBQUAD
数组是静态的?为什么它不是指针?它是否是静态的并不重要。问题是,您仍然需要为调色板分配足够的内存。它是一个RGBguad,因为它只存储R、G、B、a,其他什么都不存储
例如:
for(i = 0; i < 256; i++)
{
lpbmpinfo->bmiColors[i].rgbRed = some_r;
lpbmpinfo->bmiColors[i].rgbGreen = some_g;
lpbmpinfo->bmiColors[i].rgbBlue = some_b;
lpbmpinfo->bmiColors[i].rgbReserved = 0;
}
(i=0;i<256;i++)的
{
lpbmpinfo->bmiColors[i].rgbreed=some\r;
lpbmpinfo->bmiColors[i].rgbGreen=some\u g;
lpbmpinfo->bmiColors[i].rgbBlue=some_b;
lpbmpinfo->bmiColors[i].rgbReserved=0;
}
声明可变大小的结构是一个标准技巧。颜色表从不只有一个条目,对于单色位图,它至少有2个条目,对于8bpp位图,通常是256个条目,等等,由bmiHeader.biclrued成员指示。因此,结构的实际大小取决于位图格式
因为C语言不允许声明这样的数据结构,所以这是最接近的匹配。创建结构需要malloc()分配足够的字节来存储根据BICLRUSE计算的结构。然后对(BITMAPINFO*)进行简单的强制转换,使其可用。声明中没有
static
关键字。它是一个完全正常的结构成员。它用于声明一个可变大小的结构,最后是一个可变大小的数组
数组的大小只有在编译时才知道,因此我们将使用array[1]
。请参阅中陈雷蒙女士的详细解释
在某些编译器(如GCC)上,允许零长度数组作为扩展,因此Linux和许多其他平台通常使用array[0]
而不是array[1]
GNUC中允许声明长度为零的数组作为扩展。零长度数组可用作结构的最后一个元素,该结构实际上是可变长度对象的标头:
struct line {
int length;
char contents[0];
};
struct line *thisline = (struct line *)
malloc (sizeof (struct line) + this_length);
thisline->length = this_length;
在C99中,引入了一个名为的新特性。从那时起,为了便于移植,最好使用array[]
struct vectord {
size_t len;
double arr[]; // the flexible array member must be last
};
另见