在源代码中初始化stuct时出错

时间:2015-06-20 13:33:39

标签: c struct types arduino typedef

我正在使用其他人制作的代码,用arduino将kalman过滤器实现到我的imu中。我理解它的绝大多数和它背后的数学,但我在实现它时遇到一些我无法理解的错误(严重缺乏对typdef和结构的知识并初始化它们)。如果有人能向我解释这个错误,我将不胜感激。

头文件包含此内容......

struct kalman_data{

    float x1, x2, x3;

    float p11, p12, p13, 
          p21, p22, p23, 
          p31, p32, p33;

    float q1, q2, q3;
};

typedef struct _kalman_data kalman_data;

void kalman_data(kalman_data* data);
void kalman_calc(kalman_data* data, float z1, float z2);

我的arduino代码包含了这个..

kalman_data pitch_data;
kalman_data roll_data;

void loop(){

  kalman_data(&pitch_data);
  kalman_data(&roll_data);
  kalman_calc(&pitch_data, pitch, gyro_yz); 
  kalman_calc(&roll_data, roll, gyro_xz);
}

这就是我得到的错误......

  

在test.ino中包含的文件中:2:0:   E:\ Users \ Alexander \ Documents \ Arduino \ libraries \ Kalman / kalman.h:30:29:错误:冲突声明'typedef struct _kalman_data kalman_data'
   typedef struct _kalman_data kalman_data;

     

E:\ Users \ Alexander \ Documents \ Arduino \ libraries \ Kalman / kalman.h:17:8:错误:'struct kalman_data'之前的声明为'struct kalman_data'    struct kalman_data {

2 个答案:

答案 0 :(得分:1)

struct kalman_data{

应该是

struct _kalman_data{

以便对应后续的

typedef struct _kalman_data kalman_data;

然后,功能

void kalman_data(kalman_data* data);

应该更好地重命名。我记得C和C ++允许你重用一个函数的类型名称,同时在范围内同时使用,但即使它允许它绝对不是一个好主意。非常混乱。

答案 1 :(得分:0)

struct定义保留名称kalman_data,并且typedef尝试再次为名为_kalman_data的结构保留名称。这会导致错误。

要解决此问题,请使用struct _kalman_data,然后typedef将按预期工作。