我无法解决一个未知的问题,我从未体验过Arduino Nano(ATmega328)。我正在构建一个无人机源代码,它一直表现良好。但是,Arduino IDE中突然出现了错误 显然,我是编程方面的新手。所以帮助我找出如何解决这个问题。
我遇到这样的错误:
error: expected unqualified-id before '[' token
error: 'value' does not name a type
Quadcopter_Code_Arduino:580: error: expected unqualified-id
before '[' token
struct op[]
^
Quadcopter_Code_Arduino:589: error: 'value' does not name a type
} value;
^
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[]
{
int x_accel;
int y_accel;
int z_accel;
int temperature;
int x_gyro;
int y_gyro;
int z_gyro;
} value;
};
答案 0 :(得分:1)
struct op[] {
... }
对我来说很奇怪。 (我甚至不知道如何阅读/解释这个。)
因此,我在cygwin上用gcc测试了这个(简化版):
$ gcc --version
gcc (GCC) 5.4.0
$ echo 'typedef union u { struct op[] { int i; } value; };
> int main() { return 0; }
> ' > test-weird-union.c
$ gcc test-weird-union.c
test-weird-union.c:1:28: error: expected identifier or '(' before '[' token
typedef union u { struct op[] { int i; } value; };
^
test-weird-union.c:1:42: error: expected ';' before 'value'
typedef union u { struct op[] { int i; } value; };
^
test-weird-union.c:1:42: warning: useless storage class specifier in empty declaration
(与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;
我做了以下事情:
删除[]
后面的op
以修复语法错误。
将int
更改为int16_t
。这可以确保此代码也适用于非16位平台。
将accel_t_gyro_union
添加到typedef
的末尾。这可能没有必要,但我觉得这很舒服。
再次使用gcc在cygwin上检查:
$ gcc -std=c11 test-weird-union.c
至少没有语法错误。其余的是我所不知道的。
答案 1 :(得分:1)
来自http://en.cppreference.com/w/cpp/language/union
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)
使用上面更正的声明。
建议: 在括号中使用SIZE作为数组。 如果您还不知道尺寸,请使用指针,原因如上所述。
答案 2 :(得分:1)
struct op[] {
... }
无论如何都是废话。如果你想要名为struct
的{{1}}类型,它应该在联合之外(但它不是真正的问题,在其他地方使用它可能有问题):
op
但根本不需要阵列。所以第二个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;
也应该是匿名的:
struct