C++ 在'之前应为不合格id;[';代币和+;

C++ 在'之前应为不合格id;[';代币和+;,c++,struct,arduino,arduino-uno,unions,C++,Struct,Arduino,Arduino Uno,Unions,我在解决一个未知问题时遇到了困难,这是我在Arduino Nano(ATmega328)上从未遇到过的。我正在构建一个无人机源代码,它一直运行良好。但是,Arduino IDE中突然出现了错误。 显然,我是编程新手。所以请帮我找出如何解决这些问题 我犯了这样的错误: 错误:在“[”标记之前应为非限定id 错误:“值”未命名类型 四直升机代码:580:错误:预期为不合格id 在“[”标记之前 结构op[] ^ Quadcopter_代码_Arduino:589:错误:“值”未命名类型 }价值观;

我在解决一个未知问题时遇到了困难,这是我在Arduino Nano(ATmega328)上从未遇到过的。我正在构建一个无人机源代码,它一直运行良好。但是,Arduino IDE中突然出现了错误。
显然,我是编程新手。所以请帮我找出如何解决这些问题

我犯了这样的错误:

错误:在“[”标记之前应为非限定id
错误:“值”未命名类型
四直升机代码:580:错误:预期为不合格id
在“[”标记之前
结构op[]
^
Quadcopter_代码_Arduino:589:错误:“值”未命名类型
}价值观;
^
typedef联轴节加速度陀螺联轴节
{
结构
{
uint8_t x_accel_h;
uint8_t x_加速;
uint8_t y__h;
uint8_t y__l;
uint8_t z__h;
uint8_t z__l;
uint8_t_h;
uint8_t_l;
uint8陀螺;
uint8陀螺;
uint8陀螺;
uint8陀螺;
uint8陀螺;
uint8陀螺;
}注册;
结构op[]
{
int x_加速器;
int y_accel;
int z_accel;
内部温度;
int x_陀螺;
国际陀螺;
int z_陀螺;
}价值观;
};

结构op[]{..
}
在我看来很奇怪(我甚至不知道如何读/解释这个。)

因此,我在cygwin上用gcc对此进行了测试(在简化版本中):

(与
gcc-std=c11的输出相同)

代码可能是错误的,或者至少不是标准C

好的。另外考虑一下:如何修复它

多了解一点背景就好了。因此,将此视为一种方法,并证明如何应用它:

#include <stdint.h>

typedef union accel_t_gyro_union
{
  struct
  {
    uint8_t x_accel_h;
    uint8_t x_accel_l;
    uint8_t y_accel_h;
    uint8_t y_accel_l;
    uint8_t z_accel_h;
    uint8_t z_accel_l;
    uint8_t t_h;
    uint8_t t_l;
    uint8_t x_gyro_h;
    uint8_t x_gyro_l;
    uint8_t y_gyro_h;
    uint8_t y_gyro_l;
    uint8_t z_gyro_h;
    uint8_t z_gyro_l;
  } reg;
  struct op
  {
    int16_t x_accel;
    int16_t y_accel;
    int16_t z_accel;
    int16_t temperature;
    int16_t x_gyro;
    int16_t y_gyro;
    int16_t z_gyro;
  } value;
} accel_t_gyro_union;
至少没有语法错误。其余的我都不知道。

定义/信息: 从

联合是一种特殊的类类型,它只能保存其一个 一次使用非静态数据成员

该联盟的规模仅限于容纳其最大的数据成员。 其他数据成员的分配字节与该部分相同 最大的成员

此外:

您的声明不正确,应:

struct op
{
    int x_accel;
    int y_accel;
    int z_accel;
    int temperature;
    int x_gyro;
    int y_gyro;
    int z_gyro;
} value [SIZE];
我建议您为数组使用一个特定的大小,或者使用结构类型的指针声明来明确说明,稍后您将决定它的堆大小,但是堆栈上的并集将为成员指定一个指针大小

(虽然在空括号中,它仍然可以在我的快速测试中编译和工作……我也应该了解这种行为。:D)

解决方案: 使用上面更正的声明

忠告: 使用括号中的数组大小。
如果您还不知道大小,请出于上述原因使用指针。

结构op[]{
..
}
无论如何都是胡说八道。如果您想要
结构
类型命名为
op
,它应该在联合之外(但这不是真正的问题,在其他地方使用它可能会有问题):

但是根本不需要数组。因此第二个
struct
也应该是匿名的:

union accel_t_gyro_union
{
  struct
  {
    uint8_t x_accel_h;
    uint8_t x_accel_l;
    uint8_t y_accel_h;
    uint8_t y_accel_l;
    uint8_t z_accel_h;
    uint8_t z_accel_l;
    uint8_t t_h;
    uint8_t t_l;
    uint8_t x_gyro_h;
    uint8_t x_gyro_l;
    uint8_t y_gyro_h;
    uint8_t y_gyro_l;
    uint8_t z_gyro_h;
    uint8_t z_gyro_l;
  } reg;
  struct
  {
    int x_accel;
    int y_accel;
    int z_accel;
    int temperature;
    int x_gyro;
    int y_gyro;
    int z_gyro;
  } value;
};

您可能还想检查这个问题,可能存在重复的问题
struct op
{
    int x_accel;
    int y_accel;
    int z_accel;
    int temperature;
    int x_gyro;
    int y_gyro;
    int z_gyro;
} value [SIZE];
struct A {
    uint8_t  low_byte; // depends on byte order 
    uint8_t high_byte;
};

struct B {
    int          word;
};

union U {
    A  reg;
    B  val;
} variable;
union accel_t_gyro_union
{
  struct
  {
    uint8_t x_accel_h;
    uint8_t x_accel_l;
    uint8_t y_accel_h;
    uint8_t y_accel_l;
    uint8_t z_accel_h;
    uint8_t z_accel_l;
    uint8_t t_h;
    uint8_t t_l;
    uint8_t x_gyro_h;
    uint8_t x_gyro_l;
    uint8_t y_gyro_h;
    uint8_t y_gyro_l;
    uint8_t z_gyro_h;
    uint8_t z_gyro_l;
  } reg;
  struct
  {
    int x_accel;
    int y_accel;
    int z_accel;
    int temperature;
    int x_gyro;
    int y_gyro;
    int z_gyro;
  } value;
};