Проблема Форматирования Строк 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 */