我在由perl脚本生成的文件中有以下声明(在编译期间):
struct _gamedata
{
short res_count;
struct
{
void * resptr;
short id;
short type;
} res_table[3];
}
_gamecoderes =
{
3,
{
{ &char_resource_ID_RES_welcome_object_ID,1002, 1001 },
{ &blah_resource_ID_RES_another_object_ID,1004, 1003 },
{ &char_resource_ID_RES_someting_object_ID,8019, 1001 },
}
};
Run Code Online (Sandbox Code Playgroud)
我的问题是struct _gamedata
在编译期间生成,并且项目的数量res_table
会有所不同.所以我不能提供一种res_table
预先声明尺寸的类型.
我需要解析这个结构的一个实例,最初我是通过一个指向char的指针(并没有定义struct _gamedata
为一个类型.)但我正在定义res_table
.
例如
char * pb = (char *)_gamecoderes;
// i.e. pb points to the instance of `struct _gamedata`.
short res_count = (short *)pb;
pb+=2;
res_table * entry = (res_table *)pb;
for( int i = 0; i < res_count; i++ )
{
do_something_with_entry(*entry);
}
Run Code Online (Sandbox Code Playgroud)
我用这个得到了很好的结果.我不知道如何声明一个类型,_struct gamedata
因为我需要能够res_table
在编译时处理一个变量长度.
由于结构是匿名的,因此无法引用此结构的类型.(res_table
只是成员名称,而不是类型的名称).您应该为结构提供一个名称:
struct GameResult {
short type;
short id;
void* resptr;
};
struct _gamedata {
short res_count;
GameResult res_table[3];
};
Run Code Online (Sandbox Code Playgroud)
另外,你不应该把它投到data
一个char*
.的res_count
和entry
的可利用被提取的->
操作者.这样可以正确计算成员偏移量.
_gamedata* data = ...;
short res_count = data->res_count;
GameResult* entry = data->res_table;
Run Code Online (Sandbox Code Playgroud)
或者干脆:
_gamedata* data;
for (int i = 0; i < data->res_count; ++ i)
do_something_with_entry(data->res_table[i]);
Run Code Online (Sandbox Code Playgroud)