创建一个结构数组

时间:2017-09-08 19:22:41

标签: c arrays struct

在尝试解决此问题时,我一直在复制此问题中给出的示例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]实际上是存储数据地址的地方而不是存储数据的地方?但我不知道如何纠正这个问题并将数据放在我想要的数组中。

2 个答案:

答案 0 :(得分:0)

将结构重写为

struct trace
{
    …
};

您现有代码的问题是您已经为trace定义了一个匿名结构和一个引用该结构的typedef。这意味着没有类型struct trace,因此您的行struct trace traces[NUM_TRACES]指的是不存在的类型。

您还可以将结构定义为

typedef struct trace
{
    …
} trace;

如果你愿意,这会给你tracestruct 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)会更好,并坚持下去。