Ничего не получено от функции, возвращающей массив строк
Моя функция 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]);
}
и я получаю кое-что в отпечатках, я думал, что это не дает никаких ошибок во время компиляции, так что это должно быть правильно.
@Ciasto piekarz, 👍1
2 ответа
Лучший ответ:
Маженко прав, ваш массив 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;
}
}
Такие локально определенные массивы возвращать нельзя. Массив существует только в функции, и все, что вы делаете, это возвращаете указатель на то место, где был этот массив. Поскольку массив исчез, когда вы покидаете функцию, ваш указатель просто указывает на мусор.
Вместо этого вы должны передать массив функции, которую затем заполняет функция.
но сохранение находится в другом файле 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
- Как отсортировать строку с числом по возрастанию
- Преобразование строки в IP-адрес
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- Как добавить в массив из String в ардуино?
- Какова цель F() и FPSTR() в ESP8266WebServer -> FSBrowser?
- Как исправить код утечки памяти в ESP8266/NodeMCU, вызванный концентрацией строк?
- strcmp, похоже, не работает
- Как заменить объекты String массивами символов, продолжая использовать строковые методы
Я вижу это только потому, что массив инициализируется в методе установки, и мне не нужно возвращать массив. спасибо за публикацию примера., @Ciasto piekarz
попробовал ваше предложение, но получил эту ошибку: «ожидается» или «...» перед «read_ssid_pswd» в «boolean configuration::read(String[] read_ssid_pswd) {`, @Ciasto piekarz
Виноват. Попробуйте
прочитать (String read_ssid_pswd[]) {
, @MAXdBСпасибо за правки в операторе if и определении функции, и то, и другое было моими ошибками., @MAXdB