Ничего не получено от функции, возвращающей массив строк

Моя функция read возвращает массив строк. т.е. ssid и пароль

String* configuration::read() {
    String rw_ssid = "";
    String rw_pswd = "";
    const int keys = 2;
    String read_ssid_pswd [keys];
    if (EEPROM.read(0) != 0) {

      for (int i = 0; i < 32; ++i) {
        rw_ssid += char(EEPROM.read(i));
      }
      for (int i = 32; i < 96; ++i) {
        rw_pswd += char(EEPROM.read(i));
      }
      Serial.print("rPASSWORD: ");
      Serial.println(rw_pswd);
      read_ssid_pswd[0] = rw_ssid;
      read_ssid_pswd[1] = rw_pswd;
      Serial.print("Sending ssid:");
      Serial.print(read_ssid_pswd[0]);
      Serial.print(" Pswd: ");
      Serial.println(read_ssid_pswd[1]);
      return read_ssid_pswd;
    } else {
      Serial.println("Data wifi not found!");
      return read_ssid_pswd;
    }
}

Я вижу печать в последовательном мониторе.

Sending ssid:SSID Pswd: password

но там, откуда эта функция вызывается, я настроил ее так:

void setup() {
  Serial.begin(115200);
  Eeprom::configuration::initialize();
  String* ssid_password = Eeprom::configuration::read();
  Serial.print(">SSID: ");
  Serial.println(ssid_password[0]);
  Serial.print(">Password: ");
  Serial.println(ssid_password[1]);
  Funcs::connection::connectWifi(ssid_password[0], ssid_password[1]);  
}

и я получаю кое-что в отпечатках, я думал, что это не дает никаких ошибок во время компиляции, так что это должно быть правильно.

, 👍1


2 ответа


Лучший ответ:

1

Маженко прав, ваш массив String должен быть выделен в Setup(). Обратите внимание, что я передал в качестве возвращаемого значения успех/неудачу вашего первоначального теста EEPROM.

void setup() {
  Serial.begin(115200);
  Eeprom::configuration::initialize();
  const int keys = 2;
  String ssid_password[keys];  
  if (Eeprom::configuration::read(ssid_password)) {  
    Serial.print(">SSID: ");
    Serial.println(ssid_password[0]);
    Serial.print(">Password: ");
    Serial.println(ssid_password[1]);
    Funcs::connection::connectWifi(ssid_password[0], ssid_password[1]);  
  } else {
    Serial.println("Data wifi was not found!");
  }
}

Массив String является параметром, а не возвращаемым значением. Он передается по ссылке. Копирование символов EEPROM в String не обязательно должно быть во временные переменные, на самом деле это неэффективно и бессмысленно; он может перейти прямо в read_ssid_pswd[0] и [1], но я не хотел чрезмерно изменять ваш код и удалять отладочные последовательные записи.

bool configuration::read(String read_ssid_pswd[]) {
    String rw_ssid = "";
    String rw_pswd = "";
    if (EEPROM.read(0) != 0) {

      for (int i = 0; i < 32; ++i) {
        rw_ssid += char(EEPROM.read(i));
      }
      for (int i = 32; i < 96; ++i) {
        rw_pswd += char(EEPROM.read(i));
      }
      Serial.print("rSSID: ");
      Serial.println(rw_ssid);
      Serial.print("rPASSWORD: ");
      Serial.println(rw_pswd);

      read_ssid_pswd[0] = rw_ssid;
      read_ssid_pswd[1] = rw_pswd;
      Serial.print("Sending ssid:");
      Serial.print(read_ssid_pswd[0]);
      Serial.print(" Pswd: ");
      Serial.println(read_ssid_pswd[1]);
      return true;
    } else {
      Serial.println("Data wifi not found!");
      return false;
    }
}
,

Я вижу это только потому, что массив инициализируется в методе установки, и мне не нужно возвращать массив. спасибо за публикацию примера., @Ciasto piekarz

попробовал ваше предложение, но получил эту ошибку: «ожидается» или «...» перед «read_ssid_pswd» в «boolean configuration::read(String[] read_ssid_pswd) {`, @Ciasto piekarz

Виноват. Попробуйте прочитать (String read_ssid_pswd[]) {, @MAXdB

Спасибо за правки в операторе if и определении функции, и то, и другое было моими ошибками., @MAXdB


2

Такие локально определенные массивы возвращать нельзя. Массив существует только в функции, и все, что вы делаете, это возвращаете указатель на то место, где был этот массив. Поскольку массив исчез, когда вы покидаете функцию, ваш указатель просто указывает на мусор.

Вместо этого вы должны передать массив функции, которую затем заполняет функция.

,

но сохранение находится в другом файле cpp, и я пытаюсь получить доступ из функции настройки скетча., @Ciasto piekarz

Так? Как это влияет на то, что вы передаете функции?, @Majenko

вы сказали, что функция затем заполняется!, @Ciasto piekarz

ах, я вижу, просто объявите read_ssid_pswd вне уровня функционального модуля., @Ciasto piekarz

Определите свой массив в setup(), затем передайте его в качестве параметра функции чтения. Затем функция чтения использует этот переданный массив, что означает, что setup() видит те же данные. Затем вы можете использовать возвращаемое значение для обозначения успеха или неудачи., @Majenko

Я сделал это, извините, я получил сообщение об ошибке "несовместимые типы при назначении" String * "на "String [2]", функция, которая возвращает массив, объявлена как "String * configuration:: read (String read_ssid_pswd [2] ) {...}`, @Ciasto piekarz

Вы должны иметь String * в качестве типа приема., @Majenko

вы имеете в виду String* configuration::read(String *read_ssid_pswd) {...} ?, @Ciasto piekarz

Ага. Только то., @Majenko

Понятно, поэтому у меня работает компиляция, но в последовательном мониторе я получаю массивную трассировку стека, однако ранее я пытался сделать массив с зарезервированной длиной только 2 элементов., @Ciasto piekarz