8

私は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
}

ここで何が欠けているかについてのアイデアはありますか?

4

3 に答える 3

9

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

また、自動変数へのポインターを返しています。これは、返されると有効に割り当てられなくなります ( to などの次の呼び出しによって破壊されます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
}
于 2009-11-24T00:50:17.337 に答える
1

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

さらに:

  • 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;
}
于 2009-11-24T00:52:44.587 に答える
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 */

最初の項目のさらに別のポイント:初期化で似たようなものを見たことがあるかもしれません。これは代入とは異なり、代入と同様の構造を使用できます。

char strOut[] = {'a', 'b', 'c', '\0'}; /* ok, initialization */
strOut = {'a', 'b', 'c', '\0'}; /* wrong, cannot assign to array */
于 2009-11-24T00:57:33.847 に答える