我的情况与stackoverflow.com/questions/16676973有点类似,但由于缺乏知识,我无法从中学到必要的教训......
我想要实现的是在编译时将常量图像数据加载到内存中(不知道每个图像的大小)并获取每个图像的标识符数组,以便我可以在代码中随时访问它们。 理想的方法是指向每个图像开头的指针数组,然而有一个问题是如何确定每个图像的确切大小。当我调用图像[i]时,sizeof(imagedatatype)会根据我的变化...(我猜 - 不。那么怎么样?)
我是如何尝试这样做的:
typedef struct _imagedatatype {
uint8_t imageId;
uint8_t dataofoneimage[]
} imagedatatype;
const imagedatatype images [] = {
{1,{A, ,L,O,T, ,O,F, ,C,O,N,V,E,R,T,E,D, ,I,M,A,G,E, ,D,A,T,A, ,I,N, ,H,E,X}},
{2,{A, ,L,O,T, ,O,F, ,C,O,N,V,E,R,T,E,D, ,I,M,A,G,E, ,D,A,T,A, ,I,N, ,H,E,X}}
//of course, data is fake here, just for illustration purposes, normally it is 0x00, 0x0c, etc
};
当然,它会抛出错误,例如“数组的初始化程序太多......”。
简而言之 - 我觉得我在那里有很多错误,主要是意识形态,但正如我所说我是C的新手,所以我试图快速学习所有这些复杂的东西..
请帮忙。
答案 0 :(得分:2)
不幸的是N1570 6.7.2.1.18说:
作为一种特殊情况,具有多个命名成员的结构的最后一个元素可以 有一个不完整的数组类型;这被称为灵活的阵列成员。在大多数情况下, 灵活的数组成员被忽略。特别是,结构的大小就像是 灵活的数组成员被省略,除了它可能有更多的尾随填充 遗漏意味着
这意味着您无法使用此方法,因为无法正确计算数组中单个元素的地址。
您可以通过将图像数据与结构分开来解决这个问题:
typedef struct _imagedatatype {
uint8_t imageId;
size_t size;
uint8_t const * data;
} imagedatatype;
uint8_t const img1data [] = { ... };
uint8_t const img2data [] = { ... };
const imagedatatype images [] = {
{ 1, sizeof img1data, img1data },
{ 2, sizeof img2data, img2data },
}
如果您绝对想要使用结构定义图像数据,可以使用X-macros来解决此限制,但基础方法仍然是相同的。 X-macros可能会变得混乱,所以请注意。
答案 1 :(得分:0)
typedef struct _imagedatatype {
uint8_t imageId;
uint8_t dataofoneimage[]; // you missed the trailing ; here
} imagedatatype;
没有指定数组大小的 dataofoneimage
成员是一个称为灵活数组成员的特殊C功能(有关语义,请参阅c99,6.7.2.1p16)。它只能在你的结构声明的结尾(你正确做了什么),但它不能在声明时初始化。
使用malloc
分配此结构和分配或复制以填充其dataofoneimage
成员。