• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Что не так со структурой?

Atom

Member
Всем привет.

написал следующий код:

C++:
typedef struct{
  bool check1: 1;
  bool check2: 1;
  bool check3: 1;
  bool check4: 1;
  bool check5: 1;
  bool check6: 1;
  uint8_t rest78: 2;
  uint8_t  timer2off;
} bits64_t;

typedef union {
  bits64_t bits_;
  uint64_t int_;
} userdata_t;

void hh_check_arguments( bool nup, userdata_t* a_ud ){

  userdata_t ud;
    ........
}       
.......
и получаю сообщения от компилятора:

Bash:
Z:\Arduino\esp\esp8266_smartswitch2\esp8266_smartswitch2.ino: At global scope:
esp8266_smartswitch2:155:36: error: 'userdata_t' has not been declared
  155 | void hh_check_arguments( bool nup, userdata_t* a_ud ){
      |                                    ^~~~~~~~~~
В чем не прав?
 

enjoynering

Well-known member
Если мне не изменяет память, в struct нельзя задавать default values.

Te вот так нельзя :
Код:
bool check1: 1;
Вот так можно:
Код:
bool check1;
 

enjoynering

Well-known member
Спасибо, очень интересно. Не знал.

Я пакую так:
Код:
typedef struct
  uint8_t rest78;
  bool check;
} __attribute__((packed)) foo;
 

Atom

Member
Я пакую так:
Код:
typedef struct
  uint8_t rest78;
  bool check;
} __attribute__((packed)) foo;
Структуры помимо прочего подвергаются выравниванию по размеру сегмента. Обычно это 16 байт. Реально используется всего 2 байта, но компилятор добавит еще 14. Хотя экспресиффовский компилятор ставит align 8 байт, то будет добавлено 6. Заданием этого атрибута ты обрезаешь ненужные байты. но твой bool будет использовать 8 бит там, где нужен только 1 бит.
Так как я засовываю эту басню в eeprom, то каждый бит играет значение.

Но это не в тему, оффтоп. Меня волнует проблема с компиляцией функции, где входной параметр указан в виде ссыли на структуру, а не на тип.
 
Сверху Снизу