在尝试解决此问题时,我一直在复制此问题中给出的示例How do you make an array of structs in C? 所以现在我的代码看起来像这样:
#define NUM_TRACES 6
typedef struct
{
uint32_t upstream_pin;
uint32_t dnstream_pin;
uint32_t led_pin;
}trace;
struct trace traces[NUM_TRACES];
traces[0] = {GPIO_Pin_3, GPIO_Pin_7 , GPIO_Pin_0};
traces[1] = {GPIO_Pin_4, GPIO_Pin_6 , GPIO_Pin_1};
但我收到以下错误
src/hal.c:17:14: error: array type has incomplete element type
struct trace traces[NUM_TRACES];
^
src/hal.c:19:1: warning: data definition has no type or storage class
traces[0] = {GPIO_Pin_3, GPIO_Pin_7 , GPIO_Pin_0};
我可以通过使数组成为跟踪结构的指针数组来修复第一个错误,我认为这是有意义的
struct trace* traces[NUM_TRACES];
但是这些行会出错
src/hal.c:19:1: warning: data definition has no type or storage class
traces[0] = {GPIO_Pin_3, GPIO_Pin_7 , GPIO_Pin_0};
^
src/hal.c:19:1: warning: type defaults to 'int' in declaration of 'traces'
src/hal.c:19:1: error: conflicting types for 'traces'
src/hal.c:17:15: note: previous declaration of 'traces' was here
struct trace* traces[NUM_TRACES];
^
src/hal.c:19:1: warning: excess elements in array initializer
traces[0] = {GPIO_Pin_3, GPIO_Pin_7 , GPIO_Pin_0};
^
我认为是由trace [0]实际上是存储数据地址的地方而不是存储数据的地方?但我不知道如何纠正这个问题并将数据放在我想要的数组中。
答案 0 :(得分:0)
将结构重写为
struct trace
{
…
};
您现有代码的问题是您已经为trace
定义了一个匿名结构和一个引用该结构的typedef。这意味着没有类型struct trace
,因此您的行struct trace traces[NUM_TRACES]
指的是不存在的类型。
您还可以将结构定义为
typedef struct trace
{
…
} trace;
如果你愿意,这会给你trace
和struct trace
,但实际上没有任何意义。
当然,您可以保留当前的类型,只需说出trace traces[NUM_TRACES]
。
您的代码行traces[0] = {GPIO_Pin_3, GPIO_Pin_7 , GPIO_Pin_0 };
也不正确。编译器将此解释为没有类型的零长度数组的声明。如果要初始化traces
数组,则必须在实际初始化程序中执行此操作,如
struct trace traces[NUM_TRACES] = { {GPIO_Pin_3, GPIO_Pin_7 , GPIO_Pin_0} };
(如果NUM_TRACES
大于1
,这将使数组的其余部分零初始化)
答案 1 :(得分:0)
您使用的是您未提供定义的struct trace
类型。你可以用这样的结构类型做一些事情,但不能做任何需要系统知道大小或成员的东西。
所做的定义的是无标记结构类型,按类型名称trace
别名。因为它是无标记的,所以只能通过定义的别名来引用该类型:
/* no struct */ trace traces[NUM_TRACES];
或者,如果您事实上声明了标记为trace
的结构类型,则可以使用原始数组声明:
struct trace
{
uint32_t upstream_pin;
uint32_t dnstream_pin;
uint32_t led_pin;
} /* no instances declared here in this case */ ;
特别注意,您不需要typedef
来声明结构类型;其目的是声明类型名称别名。但是,您可以一次性为其定义标记结构类型和别名,以便您可以使用或不使用struct
关键字来引用它:
typedef struct trace
{
uint32_t upstream_pin;
uint32_t dnstream_pin;
uint32_t led_pin;
} trace ;
我并不是真的建议这样做 - 但在风格上选择一个表单(struct <tag>
或aliased_type_name
)会更好,并坚持下去。