我知道这些帖子中有大约一百万,但我不知道如何解决这个问题。是因为elua_adc_ch_state在上面定义然后再次使用?错误的行被标记。
typedef struct
{
// Status Bit Flags
volatile u8 op_pending: 1, // Is there a pending conversion?
blocking: 1, // Are we in blocking or non-blocking mode? (0 - blocking, 1 - nonblocking)
freerunning: 1, // If true, we don't stop when we've acquired the requested number of samples
smooth_ready: 1, // Has smoothing filter warmed up (i.e. smoothlen samples collected)
value_fresh: 1; // Whether the value pointed to by value_ptr is fresh
unsigned id;
u8 logsmoothlen;
volatile u16 smoothidx;
volatile u32 smoothsum;
u16 *smoothbuf;
volatile u16 reqsamples;
volatile u16 *value_ptr;
} elua_adc_ch_state;
typedef struct
{
elua_adc_ch_state *ch_state[ NUM_ADC ]; *** <----
volatile u16 sample_buf[ NUM_ADC ]; *** <----
volatile u8 clocked: 1,
force_reseq: 1,
skip_cycle: 1,
running: 1; // Whether or not sequence is running
volatile u32 ch_active; // bits represent whether channel should be converted on this device
volatile u32 last_ch_active; // keep copy of old configuration
unsigned timer_id, seq_id; // Timer bound to device, sequencer device id
volatile u8 seq_ctr, seq_len;
} elua_adc_dev_state;
定义并包含所有u16,u8,NUM_ADC个分配。我只是不确定为什么第二个结构在第一个结构正常时失败...没有循环标头依赖性。
由于
答案 0 :(得分:3)
最有可能的问题是结构顶部的可变长度数组灵活数组成员,它们不是真正可移植的。关于 VLA 灵活阵列成员的规则要求(§6.7.2.1p3)它们位于结构定义的 end :
typedef struct{
int foo;
unsigned int bar;
int foobar []
} barfoo;
我强烈建议不要使用 VLA 灵活数组成员,因为它们只存在于ANSI C99中并且是optional in ISO C11 (参见§6.10.8.3),这是实施得更广泛。 ANSI标准似乎甚至没有指定在C11中的结构中使用VLA的行为,因此它可能是未定义的行为。
Per Casey在下面的评论中将它们定义为灵活的数组成员 (§6.7.2.1p18)但是它们确实存在许多未定义行为的情况(§6.7.2.1p21),即使在标准中也应该避免