очакван неквалифициран идентификатор преди токена „[“ и +

Имам проблем с разрешаването на неизвестен проблем, който никога не съм срещал на 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
Може също да искате да проверите този въпрос Очакван неквалифициран-id преди '[' token   -  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];

Съветвам ви да използвате конкретен размер за вашия масив ИЛИ декларация на указател на вашия тип структура, за да стане ясно, че по-късно ще решите, че това е heap-size, но обединението в стека ще има uinter-size за члена. ..

(Въпреки че с празни скоби, той все още се компилира и работи при моето бързо тестване... Трябва да прочета и това поведение. :D)

Решение:

Използвайте коригираната декларация по-горе.

Съвет: Използвайте SIZE за масива в скобите. Ако все още не знаете размера, използвайте показалец поради посочените по-горе причини.

person MABVT    schedule 13.03.2017

struct op[] { ... } така или иначе е глупост. Ако искате struct тип с име op, той трябва да е извън union (но всъщност не е проблем, може да има проблем да го използвате някъде другаде):

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