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

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

};


person Ms.K    schedule 13.03.2017    source источник
comment
Вы также можете проверить этот вопрос Ожидаемый неквалифицированный идентификатор перед токеном '['   -  person Bo Persson    schedule 13.03.2017
comment
Возможный дубликат Ожидаемый неквалифицированный идентификатор перед токеном '['   -  person m7913d    schedule 13.03.2017


Ответы (3)


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

Из 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)

Решение:

Используйте исправленное объявление выше.

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

person MABVT    schedule 13.03.2017

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;
};
person KIIV    schedule 13.03.2017

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

По крайней мере, никаких синтаксических ошибок. Остальное выше моего понимания.

person Scheff's Cat    schedule 13.03.2017