Я знаю, что вы намерены понять, как использовать массив c вместо класса String, но в вашем коде легко избежать использования String и сохранять массив локальным внутри функции, чтобы сделать код простым и более надежный.
Вам не нужно возвращать строку, просто добавьте Serial.print в конец вашей функции.
void loop() {
RtcDateTime now = Rtc.GetDateTime();
printDateTime(now);
}
void printDateTime(const RtcDateTime& dt)
{
char ret[20];
snprintf_P(ret,
countof(ret),
PSTR("%04u/%02u/%02u %02u:%02u:%02u"),
dt.Year(),
dt.Month(),
dt.Day(),
dt.Hour(),
dt.Minute(),
dt.Second()
);
Serial.println(ret);
}
Если вы действительно предпочитаете использовать функцию чтобы вернуть массив, содержащий отформатированную строку, вы можете объявить ret[20]
как массив static
внутри функции, чтобы значение массива не было освобождено после возврата из вызова функции.
void loop() {
RtcDateTime now = Rtc.GetDateTime();
Serial.println(strDT(now));
}
char* strDT(const RtcDateTime& dt)
{
static char ret[20]; //local static variable
snprintf_P(ret,
countof(ret),
PSTR("%04u/%02u/%02u %02u:%02u:%02u"),
dt.Year(),
dt.Month(),
dt.Day(),
dt.Hour(),
dt.Minute(),
dt.Second()
);
return ret;
}
Заметил, что тип возвращаемого значения из функции должен быть точкой ret
(т.е. char*
).
Обновлено
Класс Arduino String против cstring.h
Библиотека строк , которую вы видите в Arduino, не является частью C ++, она дает Arduino некоторые функции, такие как как python -подобная или Java -подобная конкатенация, такая как String myString = "This string " + this_var + " another string";
, в которой используется динамическое c выделение памяти mallo c в динамической памяти. для новичков в Arduino это выглядит проще, однако это может привести к фрагментации кучи или утечке памяти, особенно если вы новичок в программировании и не совсем понимаете, как работает куча. Чтобы завершить замену использования класса Sting, лучше узнать, как использовать C ++ cstring.h функции для обработки строки.