8


1

Arduino文字列のフォーマットの問題

私はArduinoを搭載した時計を作っています、そしてその過程で、時間の読み出しのために整数を2桁のフォーマットされた文字列にフォーマットしようとしています(例えば、 1から「01」へ)。

以下は、「エラー: '\ {'トークンの前にプライマリ式が必要です」というエラーを表示します。

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 Answer


9


中括弧構文は、変数の初期宣言には有効ですが、事後の代入には有効ではありません。

また、自動変数へのポインターを返します。自動変数は、返されると有効に割り当てられなくなります(そして、 `print`などの次の呼び出しで破壊されます)。 あなたはこのようなことをする必要があります:

void formatTimeDigits(char strOut[3], int num)
{
  strOut[0] = '0' + (num / 10);
  strOut[1] = '0' + (num % 10);
  strOut[2] = '\0';
}

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
}


1


Cでは、 `=`代入演算子を使用して配列の内容を直接設定することはできません(配列を初期化できますが、似ているように見えても別のことです)。

さらに:

  • Wiringの `char(value)`関数/演算子のようには聞こえません あなたが欲しいもの;そして

  • その `strOut`配列へのポインタを返したい場合は、 静的な保存期間を持つようにします。

あなたがしたいことをする簡単な方法は `sprintf`です:

char * formatTimeDigits (int num)
{
  static char strOut[3];

  if (num >= 0 && num < 100) {
    sprintf(strOut, "%02d", num);
  } else {
    strcpy(strOut, "XX");
  }

  return strOut;
}


0


いくつかのこと:

  • 配列に割り当てることはできません: strOut = {'0'、(char)num};

  • 存在しなくなるオブジェクトのアドレスを返します returnステートメントの後。

最初の問題では、配列要素に割り当てます。

strOut[0] = '0';
strOut[1] = num;
strOut[2] = '\0';

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', '\0'}; /* ok, initialization */
strOut = {'a', 'b', 'c', '\0'}; /* wrong, cannot assign to array */