РЕШЕНО Ошибка struct '' has no member named ''

Тема в разделе "ESP8266, ESP32", создана пользователем Evgeniy2017, 15 авг 2020.

  1. Evgeniy2017

    Evgeniy2017 Нерд

    • 5.1. Не создавайте темы с малопонятным содержанием. Темы, озаглавленные "А как так?", "Вопрос от меня", "Завтыкайте фишку", "Нужна помощь!", "Help", "Помогите", "Срочно!" будут удаляться.
    Всем добрый день! (
    Столкнулся с проблемой компила) Так чувство что где-то скобки не правильно стоят. Ведь компилятор как-будто путает тип данных.Весь код не хочется вставлять ибо 1к строк. Вставил все зависимости(для функции) которые заметил.Ошибка будет если раскоментить строку Serial.println(data_manager_write(rx_data_temp_two));
    Код (C++):
    struct type_one_sensor {
      uint8_t id;
      uint8_t type;
      int16_t v_bat;
      uint8_t status_sensor;
      uint8_t signal_lvl;
      uint8_t temp;
      uint8_t humdacity;
      int16_t heat_index;
      uint8_t kef;
    };
    struct type_two_sensor {
      uint8_t id;
      uint8_t type;
      int16_t v_bat;
      uint8_t status_sensor;
      uint8_t signal_lvl;
      boolean relays[5];
      uint8_t kef;
    };

    type_one_sensor last_type_one[40];
    type_two_sensor last_type_two[40];
    uint8_t get_data(uint8_t id_sensor, uint8_t type_sensor) {
      Serial.print("Sensor №: ");
      Serial.print(id_sensor);
      Serial.print(" Type:");
      Serial.println(type_sensor);
      radio.stopListening();
      sensors_template[0] = (uint8_t)id_sensor;
      radio.openWritingPipe(sensors_template);
      uint8_t request = 101;
      radio.write(&request, sizeof(request));
      radio.startListening();
      uint8_t i = 0;
      while (i < 5) {
        if (radio.available()) {
          break;
        }
        delay(10);
        i++;
      }
      delay(5);//Чтобы все что не нужно модуль отфильтровал
      if (i == 5) {
        Serial.println("Sensor did not respond");
        return false;
      }
      switch (type_sensor) {
        case 1:
          Serial.println("[INFO] Sensor type 1 parsing data...");
          type_one_sensor rx_data_temp;
          radio.read(&rx_data_temp, sizeof(rx_data_temp));
          Serial.println("-----------DATA-----------");
          Serial.print("  ID:");
          Serial.println(rx_data_temp.id);
          Serial.print("  Type:");
          Serial.println(rx_data_temp.type);
          Serial.print("  V-BAT:");
          Serial.println(float(rx_data_temp.v_bat) / float(rx_data_temp.kef));
          //Serial.print("  Status sensor:");
          //Serial.println(rx_data_temp.status_sensor);
          //Serial.print("  Level of signal:");
          //Serial.println(rx_data_temp.signal_lvl);
          Serial.print("  Temperature:");
          Serial.println(rx_data_temp.temp);
          Serial.print("  Humdacity:");
          Serial.println(rx_data_temp.humdacity);
          Serial.print("  Heat index:");
          Serial.println(float(rx_data_temp.heat_index) / float(rx_data_temp.kef));
          Serial.println("--------------------------");
          Serial.println(data_manager_write(rx_data_temp));
          break;
        case 2:
          Serial.println("[INFO] Sensor type 2 parsing data");
          type_two_sensor rx_data_temp_two;
          radio.read(&rx_data_temp_two, sizeof(rx_data_temp_two));
          Serial.println("-----------DATA-----------");
          Serial.print("  ID:");
          Serial.println(rx_data_temp_two.id);
          Serial.print("  Type:");
          Serial.println(rx_data_temp_two.type);
          Serial.print("  V-BAT:");
          Serial.println(float(rx_data_temp_two.v_bat) / float(rx_data_temp_two.kef));
          Serial.println("-----------CHANELS-----------");
          for (uint8_t i = 0; i < 5; i++) {
            Serial.print("Chanell ");
            Serial.print(i);
            Serial.print(": ");
            Serial.println(rx_data_temp_two.relays[i]);
          }
          Serial.println("--------------------------");
          //Serial.println(data_manager_write(rx_data_temp_two));
          break;
        default:
          Serial.println("[ERROR] Type of sensor not found!");
          return false;
      }
      return true;
    }
    template<typename T>
    uint8_t data_manager_write(T & pack) {
      /*
        Input packet of recived info
        Return: 1 - memory found and data was writed
                2 - memory found but verifying err
                3 - memory not found! BIG ERROR
                4 - data not understand
      */

      boolean founded = false;
      uint8_t found_index = 0;
      Serial.println("Manager started");
      Serial.print("Sensor id: ");
      Serial.print(pack.id);
      uint8_t type = get_type(pack.id);
      if (type == 0) {
        Serial.println("Type error 0!");
        return 4;
      }
      Serial.print(" Type sensor(and packet)");
      Serial.println(type);
      if (type == 1) {
        uint8_t memory = sizeof(last_type_one) / sizeof(last_type_one[0]);
        for (uint8_t i = 0; i < memory; i++) {
          if (last_type_one[i].id == pack.id) {
            founded = true;
            found_index = i;
            break;
          }
        }
        if (!founded) {
          Serial.println("Previus data from this sensor not found");
          Serial.println("Searching empty memory");
          for (uint8_t i = 0; i < memory; i++) {
            if (last_type_one[i].id == 0) {
              founded = true;
              found_index = i;
              break;
            }
          }
        }
        if (!founded) {
          Serial.println("Empty memory not found!");
          return 3;
        }
        Serial.println("Ok, memory founded!");
        last_type_one[found_index].id = pack.id;
        last_type_one[found_index].type = pack.type;
        last_type_one[found_index].v_bat = pack.v_bat;
        last_type_one[found_index].status_sensor = pack.status_sensor;
        last_type_one[found_index].signal_lvl = pack.signal_lvl;
        last_type_one[found_index].temp = pack.temp;
        last_type_one[found_index].humdacity = pack.humdacity;
        last_type_one[found_index].heat_index = pack.heat_index;
        last_type_one[found_index].kef = pack.kef;
        Serial.println("Verifying..");
        if (last_type_one[found_index].id == pack.id and last_type_one[found_index].temp == pack.temp and last_type_one[found_index].humdacity == pack.humdacity) {
          Serial.println("Verifyed!");
          return 1;
        }
        return 2;
      }
      else if (type == 2) {
        Serial.println("Data type 2");
        uint8_t memory = sizeof(last_type_two) / sizeof(last_type_two[0]);
        for (uint8_t i = 0; i < memory; i++) {
          if (last_type_two[i].id == pack.id) {
            founded = true;
            found_index = i;
            break;
          }
        }
        if (!founded) {
          Serial.println("Previus data from this sensor not found");
          Serial.println("Searching empty memory");
          for (uint8_t i = 0; i < memory; i++) {
            if (last_type_two[i].id == 0) {
              founded = true;
              found_index = i;
              break;
            }
          }
        }
        if (!founded) {
          Serial.println("Empty memory not found!");
          return 3;
        }
        Serial.println("Ok, memory founded!");
        last_type_two[found_index].id = pack.id;
        last_type_two[found_index].type = pack.type;
        last_type_two[found_index].v_bat = pack.v_bat;
        last_type_two[found_index].status_sensor = pack.status_sensor;
        last_type_two[found_index].signal_lvl = pack.signal_lvl;
        last_type_two[found_index].kef = pack.kef;
        for (uint8_t i = 0; i < 5; i++) {
          last_type_two[found_index].relays[i] = pack.relays[i];
        }
        Serial.println("Verifying..");
        if (last_type_two[found_index].id == pack.id and last_type_two[found_index].type == pack.type) {
          Serial.println("Verifyed!");
          return 1;
        }
        return 2;
      }
      else {
        Serial.println("Data ERROR");
        return 4;
      }
    }
    D:\disk_SYSTEM_2020_02_05\ARDUINO_SMART_HOME\__Smart_home_2020\RX_esp8266_v.1.1\RX_esp8266_v.1.1.ino: In instantiation of 'uint8_t data_manager_write(T&) [with T = type_one_sensor; uint8_t = unsigned char]':

    D:\disk_SYSTEM_2020_02_05\ARDUINO_SMART_HOME\__Smart_home_2020\RX_esp8266_v.1.1\RX_esp8266_v.1.1.ino:352:53: required from here

    RX_esp8266_v.1.1:551:57: error: 'struct type_one_sensor' has no member named 'relays'

    last_type_two[found_index].relays = pack.relays;

    ^

    D:\disk_SYSTEM_2020_02_05\ARDUINO_SMART_HOME\__Smart_home_2020\RX_esp8266_v.1.1\RX_esp8266_v.1.1.ino: In instantiation of 'uint8_t data_manager_write(T&) [with T = type_two_sensor; uint8_t = unsigned char]':

    D:\disk_SYSTEM_2020_02_05\ARDUINO_SMART_HOME\__Smart_home_2020\RX_esp8266_v.1.1\RX_esp8266_v.1.1.ino:374:57: required from here

    RX_esp8266_v.1.1:507:37: error: 'struct type_two_sensor' has no member named 'temp'

    last_type_one[found_index].temp = pack.temp;

    ^

    RX_esp8266_v.1.1:508:42: error: 'struct type_two_sensor' has no member named 'humdacity'

    last_type_one[found_index].humdacity = pack.humdacity;

    ^

    RX_esp8266_v.1.1:509:43: error: 'struct type_two_sensor' has no member named 'heat_index'

    last_type_one[found_index].heat_index = pack.heat_index;

    ^

    RX_esp8266_v.1.1:512:140: error: 'struct type_two_sensor' has no member named 'humdacity'

    if (last_type_one[found_index].id == pack.id and last_type_one[found_index].temp == pack.temp and last_type_one[found_index].humdacity == pack.humdacity) {

    ^

    RX_esp8266_v.1.1:512:86: error: 'struct type_two_sensor' has no member named 'temp'

    if (last_type_one[found_index].id == pack.id and last_type_one[found_index].temp == pack.temp and last_type_one[found_index].humdacity == pack.humdacity) {

    ^

    exit status 1
    'struct type_one_sensor' has no member named 'relays'
     
    Последнее редактирование: 15 авг 2020
  2. parovoZZ

    parovoZZ Гуру

    Так юзай нормальную IDE с подсветкой синтаксиса. Тот же VSC от MS запросто находит пропущенную скобку.
     
  3. Daniil

    Daniil Гуру

    Пробежался по коду и ошибкам:
    1. в с++ нет оператора "and".
    2. Проверяйте у каких структур какие поля запрашиваете, последние ошибки прямо так и говорят, что temp не из той структуры берете.
    3. Radio.read где объявлено? Она структуру вам заполнит? Что такое radio?

    Исправляйте и заходите на 2-й раунд.
     
  4. Asper Daffy

    Asper Daffy Иксперд

    Да, ладно! Это Вы подзабыли чего-то к вечеру.
     
  5. Evgeniy2017

    Evgeniy2017 Нерд

    На самом деле я где-то читал что и вправду нету, но я попробовал =) и работает, а раз работает то не трогать ;)
     
  6. Evgeniy2017

    Evgeniy2017 Нерд

    1. Работает ведь... =) вообщем исправил.
    2. Вообщем там я их по типу разбираю, поле "тип" есть и в той и в той, а как мне подсказали на другом форуме компилятору возможно не нравиться что я обращаюсь к одному "pack" и пытаюсь достать из него разные поля, хотя если бы не ошибка компилятора оно бы работало.
    3. Radio объявлено выше не суть) я исп nrf24l01+ а к нему RF24(http://tmrh20.github.io/RF24/). Да, структуру заполняет.
    Если запустить код то компил пройдет и будет хорошо работать, но если раскоментить строку Serial.println(data_manager_write(rx_data_temp_two)); которая нужна для записи показаний со второго датчика, то крах)
    Все исправил, и получаю ту же ошибку. Что бы прояснить ситуацию думаю можно скрин сделать =).
    upload_2020-8-15_20-43-26.png
     
  7. b707

    b707 Гуру

    Я бы написал это без шаблонов. У вас в обоих типах структур зашит ее тип, поэтому передаете функции ссылку на структуру, читаете поле type и в зависимости от значения поля приводите ссылку к первому или второму типу. И все будет работать.
     
  8. Asper Daffy

    Asper Daffy Иксперд

    И где вы все такое читаете? В языке есть и and, и or, и bitand, и bitor, и xor'ы всякие с комплементами. Причём есть это и в С, и в С++. Да, когда-то не было, но уж лет двадцать, как есть. Но почему-то на форумах постоянно приходится слышать утверждение, что нет.
     
    Un_ka нравится это.
  9. Evgeniy2017

    Evgeniy2017 Нерд

    Тогда звиняйте)
    Как-то так я и сделаю =) пока что придумал сделать через "Перегруженные функции".
     
  10. b707

    b707 Гуру

    Получилось?
    Через перегруженные функции "красивее", а через приведение типов - короче.
     
  11. Evgeniy2017

    Evgeniy2017 Нерд

    Приведение типов не шарю, почитаю что за зверь. Если раздуплю тогда будет короче =), если не пойму будет красивее ;)
     
  12. SergeiL

    SergeiL Оракул Модератор

    И как сейчас, согласно новым тенденциям будет правильней?
    && или and?
     
    Daniil нравится это.
  13. Daniil

    Daniil Гуру

    я специально взял в ковычки с сохранением пунктуации ТС.
    Тут проблема как у новичков с "=" в условиях
    прощу прощения за плохо сформулированное свое замечание)
     
  14. Asper Daffy

    Asper Daffy Иксперд

    Пофиг. В описании языка прямо подчёркивается их (альтернативных написаний) полная эквивалентность основным: "In all respects of the language, each alternative token behaves the same, respectively, as its primary token, except for its spelling"
     
    Andrey12 и Daniil нравится это.
  15. Daniil

    Daniil Гуру

    И всё же на "and" АтмелСтудия ругается, если заменить на "&&" проблем нет.
    tst.png
    Может я где-то галочки забыл проставить, но именно так работает "из коробки" атмел.
     
  16. Asper Daffy

    Asper Daffy Иксперд

    Ну, не все компиляторы одинаково хорошо поддерживают стандарт языка (хотя именно это введено ещё в 1998 году).

    У меня, например, в атмел студии 7.0 это поддерживается из коробки (хотя, мож и замутил какую опцию - не помню)

    Но во многих компиляторах поддержку этих вещей сделали через макросы и чтобы они работали нужно включить #include <iso646.h> Попробуйте, должно заработать
     
    Последнее редактирование: 17 авг 2020
    Daniil нравится это.
  17. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Если не затруднит поясните тему кто вылез из танка и залез в трактор... чему соответствует "and"... этому: "&" или этому "&&".
    Для второго случая надо наверное "andand" по логике вещей:) Думаю не надо поганить наш великий и могучий язык Си.
     
  18. Asper Daffy

    Asper Daffy Иксперд

    Ссылки на действующие стандарты С и С++ есть вот здесь.

    Для С++ - см. таблицу 1 на стр. 37 внизу.
    Для С - см. таблицу на стр. 173 вверху.

    Номера страниц указаны по PDF файлу, чтобы удобно на них перейти было, а не номеру внизу страницы.

    Поздно пить боржом, уж 20+ лет как испоганили :-(

    Ты посмотри, что там щас делается (при подготовке нового стандарта С++) - уму непостижимо!
     
    Daniil нравится это.
  19. Daniil

    Daniil Гуру

    есть контакт! Спасибо)
    Спасибо за ссылочки.
     
  20. Igor68

    Igor68 Гуру

    Да не спорю.... хоть через #define пусть делают. Только вот зачем? Целое слово писать вместо символа. Это пользователи наверное по Pascal скучают, что в Delphi. То биш школьники. Я с начала 90-х такого не встречал. Вообще-то матом можно и в Си наверное, но более длинно и не информативно... в Русском это более коротко и информативно.
     
    parovoZZ нравится это.