У меня проблемы с решением неизвестной проблемы, с которой я никогда не сталкивался на 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;
};
От http://en.cppreference.com/w/cpp/language/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)
Используйте исправленную декларацию выше.
Совет:
Используйте РАЗМЕР для массива в скобках.
Если вы еще не знаете размер, используйте указатель по причинам, указанным выше.
struct op[] {
… }
ерунда в любом случае. Если ты хочешь struct
тип по имени 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
должен быть также анонимным:
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[] {
… }
выглядит странно для меня. (Я даже не знаю, как читать / интерпретировать это.)
Таким образом, я протестировал это с помощью gcc на cygwin (в упрощенной версии):
$ 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
По крайней мере, нет синтаксических ошибок. Остальное за пределами моих знаний.