Передача значения переменной в объект структуры
в этом коде я хочу передать значение массива переменных символов «pass» в объект «MyObject». Но я получаю эту ошибку.
Arduino: 1.6.11 (Windows 8.1), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"
C:\Users\XXX\Desktop\EEPROM_put\EEPROM_put.ino: In function 'void setup()':
EEPROM_put:17: error: array must be initialized with a brace-enclosed initializer
};
^
exit status 1
array must be initialized with a brace-enclosed initializer
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
когда я меняю pass на *pass, результат EEPROM.get() равен 1 и 6 вместо 1, 62345, 7539514682.
#include <EEPROM.h>
struct MyObject {
boolean stat;
char password[6];
char mobile[11];
};
char pass[6]="62345";
void setup() {
Serial.begin(9600);
while (!Serial);
MyObject customVar = {
1,
pass,
"7539514682"
};
EEPROM.put(1, customVar);
Serial.print("Written custom data type!");
}
void loop() {
}
@Tanmay Yerunkar, 👍1
2 ответа
Лучший ответ:
Используйте класс
и конструктор
#include <EEPROM.h>
class MyObject {
boolean stat;
char password[6];
char mobile[11];
public:
MyObject(bool tempStat, char tempPassword[], char tempMobile[])
{
stat = tempStat;
strcpy(password, tempPassword);//Как предложил mikael
strcpy(mobile, tempMobile);
}
};
char pass[6] = "62345";
void setup() {
Serial.begin(9600);
while (!Serial);
MyObject customVar(true, pass, "7539514682");
EEPROM.put(1, customVar);
Serial.print("Written custom data type!");
}
Хотя метод из ответа Снайпера работает, он включает в себя копирование
данных, чего часто хочется избежать на Arduino.
Самым простым решением вашей проблемы, вероятно, будет инициализация вашего пароля
поле с текстовой строкой, как вы это делали с полем mobile
:
MyObject customVar = {
1,
"62345",
"7539514682"
};
или, может быть, если вы хотите, чтобы пароль был написан в верхней части программа,
#define PASS "62345"
MyObject customVar = {
1,
PASS,
"7539514682"
};
Другой вариант — не хранить строки в объекте. Вместо этого хранить их в другом месте и пусть объект хранит только указатели на них:
struct MyObject {
boolean stat;
const char *password;
const char *mobile;
};
char pass[6] = "62345";
[...]
MyObject customVar = {
1,
pass,
"7539514682"
};
Обратите внимание, что в этом случае номер мобильного телефона сохраняется компилятором как
неименованная строковая константа. Поскольку она константа, поле mobile
был введен как const char *
. Я ввел поле password
то же самое для симметрии, но в этом случае он не обязательно должен быть const
.
- Arduino Mega сохраняет состояния после перепрограммирования
- Чтение чипа Flash ROM (M45PE20) через SPI с ATMEGA 2560 -- вывод только FF
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Как читать и записывать EEPROM в ESP8266
- Как сбросить или отформатировать Arduino?
- Какой реальный срок службы EEPROM?
получаем вывод вроде этого: Чтение пользовательского объекта из EEPROM: 1 62345 7539514682Т 7539514682Т, @Tanmay Yerunkar
Каков ожидаемый результат?, @Sniper
Стоит ли копировать с sizeof(password) и не останавливаться на нуле? strcpy() может быть проще., @Mikael Patel
Извините, забыл NULL-терминальный символ. Внесены изменения, @Sniper
@Sniper по-прежнему не получает правильный вывод, теперь получает какие-то случайные символы, вывод такой: 1 62г! 75 75 Ожидаемый результат: 1, 62345, 7539514682, @Tanmay Yerunkar
Сработала ли strcpy?, @Sniper