我试图在一个Structure中累积所有类型的列表,并从该结构中引用每个列表而不是使用不同的结构名称
#include <stdio.h>
#define TRUE 1
#define FALSE 0
typedef struct test_s {
int val;
int p;
}test_t;
test_t list_1[] = {
{ TRUE, 1},
{ TRUE, 2},
{ TRUE, 3}
};
test_t list_2[] = {
{FALSE, 1},
{TRUE , 2},
{TRUE , 3}
};
test_t list_types[][] = { list_1, list_2 };
test_t *list = NULL;
void
main() {
list = list_types[0];
int iter = 0;
for ( iter = 0; iter < sizeof(list)/sizeof(list[0]); iter++){
printf("Bool: %d Val: %d\n",list[0].val, list[0].p);
}
}
我是
当我尝试编译时,我收到了以下错误。请突出显示我在此代码段中缺少的内容
test.c:22:8: error: array type has incomplete element type
答案 0 :(得分:0)
编辑回答有关初始化的问题:
正如我在你的帖子中的评论中提到的,你的&#39; list_types`变量的初始化是不正确的。
使用原始版本的list_types
变量:
test_t **list_types = { list_1, list_2 };
我的编译器抛出错误:
Invalid initialization type;found
指向指向test_t的指针的test_texpected
指针
使用此版本(稍后编辑):
test_t list_types[][] = { list_1, list_2 };
我的编译器抛出错误:
多维数组的更高维度缺少数组大小。
这些初始化都不起作用。将初始化的形式更改为:
test_t *list_types[] = { list_1, list_2 };
并且它不会抛出任何错误,并且包含`test_t的两个实例。
结束编辑。
...从该结构中引用每个而不是使用不同的名称...
通过如上所示进行初始化,您现在可以使用如下所示的相同名称来引用每个结构:
....
//test_t **list_types = { list_1, list_2 };//incorrect initialization...
test_t *list = NULL;
void main(void) {
list = &list_1[0]; //assign list_1 to list
int iter = 0;
for ( iter = 0; iter < 3; iter++){
printf("Bool: %d Val: %d\n",list[iter].val, list[iter].p);
}
list = &list_2[0];//assign list_2 to list
iter = 0;
for ( iter = 0; iter < 3; iter++){
printf("Bool: %d Val: %d\n",list[iter].val, list[iter].p);
}
getchar();//stops execution in my environment
}
以下说明了list
实例的内容:
首次转让后:
第二次任命后:
答案 1 :(得分:0)
实际上,您想要创建一个struct-pointer数组。
第1步 - 使用。声明并初始化数组。
test_t *list_types[] = { list_1, list_2 };
而不是:
test_t list_types[][] = { list_1, list_2 };
第2步 - 使用该数组而不是指向该数组的指针到现在的大小。
使用索引
iter
在list_1
或list_2
之间进行选择, 否则您将访问list_1
。要访问一个
list_<x>
的所有项目,有必要存储 大小
for ( iter = 0; iter < sizeof(list_types)/sizeof(list_types[0]); iter++){
list = list_types[iter];
printf("Bool: %d Val: %d\n",list[0].val, list[0].p);
}
而不是:
for ( iter = 0; iter < sizeof(list)/sizeof(list[0]); iter++){
printf("Bool: %d Val: %d\n",list[0].val, list[0].p);
}