ожидаемый неквалифицированный идентификатор перед токеном ‘[‘ и +

У меня проблемы с решением неизвестной проблемы, с которой я никогда не сталкивался на 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;

};

1

Решение

Определение / Информация:

От 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)

Решение:

Используйте исправленную декларацию выше.

Совет:
Используйте РАЗМЕР для массива в скобках.
Если вы еще не знаете размер, используйте указатель по причинам, указанным выше.

1

Другие решения

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;
};
1

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;

Следующие вещи, которые я сделал:

  1. Удалил [] позади op исправить синтаксическую ошибку.

  2. Изменил int в int16_t, Это гарантирует, что этот код работает и на не 16-битных платформах.

  3. добавленной accel_t_gyro_union до конца typedef, Это может не быть необходимым, но я чувствовал себя комфортно с этим.

Снова проверил с помощью gcc на cygwin:

$ gcc -std=c11 test-weird-union.c

По крайней мере, нет синтаксических ошибок. Остальное за пределами моих знаний.

1
По вопросам рекламы [email protected]