Проблема Форматирования Строк Arduino
Я делаю часы с питанием от Arduino, и в процессе я пытаюсь форматировать целые числа в двухзначные форматированные строки для считывания времени (например, 1 в "01").
следующее дает мне "error: expected primary-expression before' {'token":
char * formatTimeDigits (int num) {
char strOut[3] = "00";
if (num < 10) {
strOut = {'0', char(num)};
}
else {
strOut = char(num);
}
return strOut;
}
Я пытаюсь использовать его следующим образом:
void serialOutput12() {
printWeekday(weekday); // picks the right word to print for the weekday
Serial.print(", "); // a comma after the weekday
Serial.print(hour12, DEC); // the hour, sent to the screen in decimal format
Serial.print(":"); // a colon between the hour and the minute
Serial.print(formatTimeDigits(minute)); // the minute
Serial.print(":"); // a colon between the minute and the second
Serial.print(formatTimeDigits(second)); // the second
}
есть идеи относительно того, что мне здесь не хватает?
3 ответов
синтаксис фигурной скобки допустим для начального объявления переменной, но не для назначения после факта.
кроме того, вы возвращаете указатель на автоматическую переменную, которая больше не выделяется после возврата (и будет разбита следующим вызовом, например print
). Вам нужно сделать что-то вроде этого:
void formatTimeDigits(char strOut[3], int num)
{
strOut[0] = '0' + (num / 10);
strOut[1] = '0' + (num % 10);
strOut[2] = '';
}
void serialOutput12()
{
char strOut[3]; // the allocation is in this stack frame, not formatTimeDigits
printWeekday(weekday); // picks the right word to print for the weekday
Serial.print(", "); // a comma after the weekday
Serial.print(hour12, DEC); // the hour, sent to the screen in decimal format
Serial.print(":"); // a colon between the hour and the minute
formatTimeDigits(strOut, minute);
Serial.print(strOut); // the minute
Serial.print(":"); // a colon between the minute and the second
formatTimeDigits(strOut, second);
Serial.print(strOut); // the second
}
в C, вы не можете напрямую установить содержимое массива с =
оператор присваивания (вы можете инициализации массив, но это другое дело, хоть он и похож).
дополнительно:
- это не похоже на проводку
char(value)
функция/оператор делает то, что вы хотите; и - если вы хотите вернуть указатель на этот
strOut
array, вам нужно будет сделать его статическим хранилищем продолжительность.
самый простой способ сделать то, что вы хотите sprintf
:
char * formatTimeDigits (int num)
{
static char strOut[3];
if (num >= 0 && num < 100) {
sprintf(strOut, "%02d", num);
} else {
strcpy(strOut, "XX");
}
return strOut;
}
пару вопросов:
- вы не можете присвоить массив:
strOut = {'0', (char)num};
- вы возвращаете адрес объекта, который перестанет существовать сразу после оператора return.
для первой задачи назначьте элементам массива:
strOut[0] = '0';
strOut[1] = num;
strOut[2] = '';
для 2-й проблемы решение немного сложнее. Лучше всего было бы передать строку назначения в FormatTimeDigits()
функция и пусть вызывающий абонент беспокоиться о он.
FormatTimeDigits(char *destination, int num); /* prototype */
FormatTimeDigits(char *destination, size_t size, int num); /* or another prototype */
еще один момент на 1-м пункте: вы, возможно, видели что-то подобное в инициализации. Это отличается от назначения,и это позволяет аналогичную конструкцию, как назначение.
char strOut[] = {'a', 'b', 'c', ''}; /* ok, initialization */
strOut = {'a', 'b', 'c', ''}; /* wrong, cannot assign to array */