当我需要代码在运行时确定其类型时,我不知道如何正确使用malloc。如何在运行时使用malloc的标头中声明一个可以使用两种不同结构之一的缓冲区?
struct rgb_16 {
unsigned short r;
unsigned short g;
unsigned short b;
};
struct half_16 {
half r;
half g;
half b;
};
(void*)buffer;
if(sample_format == 1) {
buffer = (rgb_16*)malloc(width * height * sizeof(rgb_16));
}
if(sample_format == 3) {
buffer = (half_16*)malloc(width * height * sizeof(half_16));
}
if(tiff.sample_format == 3) {
// data is float. do not normalize
for(int x = 0; x < rgba.size(); x++) {
rgba[x].r = (half)tiff.buffer[x]
.r; // error: Subscript of pointer to incomplete type 'void'
rgba[x].g = (half)tiff.buffer[x]
.g; // error: Subscript of pointer to incomplete type 'void'
rgba[x].b = (half)tiff.buffer[x]
.b; // error: Subscript of pointer to incomplete type 'void'
rgba[x].a = 1.0;
}
}
我收到一条错误消息:
//error: Subscript of pointer to incomplete type 'void'
我希望通过使用void指针,而不关心最终将malloc用于缓冲区的类型。
是否可以在运行时用rgb_16
或half_16
填充缓冲区?
第一次在此发布信息,所以请让我知道我是否应该以其他方式格式化我的信息。谢谢。
答案 0 :(得分:2)
在if( tiff.sample_format == 3) {
之后,您需要类似half_16* h = (half_16*) buffer
的东西。编译器无法知道buffer
是什么类型,因此也不知道第x
个条目要走多远。但是使用h[x]
可以这样做,因为h
的类型为half_16*
。