Синтаксическая ошибка в битовой упаковке структуры в C после переключения компилятора и IDE - PullRequest
2 голосов
/ 20 марта 2019

Хорошо, что мне не хватает ....

Я изначально написал код на IDE / компиляторе IAR для использования на микропроцессоре ARM, и он работал нормально.

Сейчас мы переключаемся на другой контроллер с микропроцессором Tricore и теперь используем IDE code :: blocks с компилятором GNU GCC для TriCore v3.4.6.

При сборке я получаю ошибки с двумя нижеследующими структурами (связанные перечисления приведены для справки):

01| typedef enum equip_states_t {
02|   stopped = 0,
03|   starting = 1,
04|   running = 2,
05|   paused = 3,
06|   stopping = 4
07| }equip_states_t;
08| 
09| typedef enum info_level_t{
10|   clear = 0,
11|   alert = 1,
12|   warning = 2,
13|   error = 3
14| } info_level_t;
15| 
16| typedef struct d2101_equip_states_t {
17|   equip_states_t        AIR_COMP_state:4; //Error starts here
18|   pause_states_t        auto_pause_state:4;
19|   fullness_states_t     BE_fullness:4;
20|   equip_states_t        BE_state:4;
21|   fullness_states_t     BIN_fullness:4;
22|   bin_states_t          BIN_state:4;
23|   bin_states_t          BYPASS_state:4;
24|   control_modes_t       control_mode:4;
25|   equip_states_t        DC_state:4;
26|   source_dest_t         DIV_auto_pause:4;
27|   source_dest_t         DIV_position:4;
28|   equip_states_t        HYDR_state:4;
29|   equip_states_t        QL_state:4;
30|   fullness_states_t     TC_fullness:4;
31|   equip_states_t        TC_state:4;
32|   equip_states_t        TUC_state:4;
33| } d2101_equip_states_t;
34| 
35| typedef struct info_message_t {
36|   uint16_t              ID;  //Error starts here
37|   info_level_t          status:8;
38|   uint8_t               not_used;
39|   uint32_t              time_stamp:32;
40| } info_message_t;

Ошибки:

[18] error: [11705] syntax error before "pause_states_t"
[18] warning: [11407] no semicolon at end of struct or union
[19] error: [11707] syntax error before ':' token
[20] error: [11707] syntax error before ':' token
[21] error: [11707] syntax error before ':' token
[24] error: [11707] syntax error before ':' token
[25] error: [11707] syntax error before ':' token
[26] error: [11707] syntax error before ':' token
[27] error: [11707] syntax error before ':' token
[28] error: [11707] syntax error before ':' token
[29] error: [11707] syntax error before ':' token
[30] error: [11707] syntax error before ':' token
[31] error: [11707] syntax error before ':' token
[32] error: [11707] syntax error before ':' token
[33] warning: [13263] type defaults to 'int' in declaration of 'd2101_equip_states_t'
[33] warning: [10516] data definition has no type or storage class
[37] error: [11705] syntax error before "info_level_t"
[37] warning: [11407] no semicolon at end of struct or union
[39] error: [11707] syntax error before ':' token
[40] warning: [13263] type defaults to 'int' in declaration of 'info_message_t'
[40] warning: [10516] data definition has no type or storage class

ОДНАКО ... Во многих, многих других случаях, в том числе до и после в одном и том же файле, я использую один и тот же синтаксис без ошибок и, следовательно, путаюсь с тем, что происходит не так. Е.Г.

typedef struct rmt2001_feedback_to_remote_t{
  uint8_t               screen_number;
  bool                  fault_present:1;
  switch_states_t       DC:1;
  switch_states_t       air:1;
  switch_states_t       HYDR:1;
  switch_states_t       TUC:1;
  switch_states_t       BE:1;
  switch_states_t       TC:1;
  switch_states_t       green_backlight:1;
  source_dest_t         dest:3;
  equip_states_t        status:3;
  switch_states_t       red_backlight:1;
  switch_states_t       blue_backlight:1;
  uint8_t               gate_percent;
  uint8_t               bin_percent;
  uint8_t               BE_amps_msb;
  uint8_t               BE_amps_lsb;
  uint8_t               not_used;
} rmt2001_feedback_to_remote_t;

typedef struct IO_view_t{
  master_or_slave_t     master_or_slave:1;
  uint8_t               exponent:3;
  uint8_t               controller_id:4;
  uint8_t               io_id:6;
  A_of_D_t              A_or_D:1;
  I_or_O_t              I_or_O:1;
  uint16_t              raw;
  int16_t               value;
} IO_view_t;

Если я правильно помню, то, что я читал в другом месте на этом сайте, это то, что структура битов упаковки не очень согласована между компиляторами, так как она не четко / строго определена стандартом c. Я также читал, что использование побитовых операций с масками и смещениями - это более кроссплатформенный способ создания битовых пакетов и сбой всего, что я могу сделать ... Но я хочу знать, почему это не работает только в этих двух случаях и я надеюсь, что есть какая-то простая маленькая вещь, которая избавит меня от необходимости делать это.

Спасибо всем за ваше время, прочитав это.

1 Ответ

0 голосов
/ 20 марта 2019

И ответ ... это связано с порядком чтения типов данных структуры typedefs между двумя компиляторами и / или из-за незначительных структурных изменений в программе из-за различныхcontroller.

Если я переместу typedef из pause_states_t и info_level_t в другой файл, который определенно читается перед этим файлом, ошибка исчезнет.

Кажется, что вместо получения некоторогоВ некотором роде ошибка «нераспознанный символ» или «нераспознанный тип данных», она обрабатывает ее как пустую, и именно это вызывает ошибки.

Это согласуется с некоторыми другими ошибками, которые я получаю сейчас, когда компиляторсталкивается с типами данных клиента перед чтением typedef.

...