

SPRESENSE Arduino IDE（Ver1.8.16）でプログラム作成をしています。

Arduino言語でfloatやdoubleの値を書式付ける時によく使用する `dtostrf` という関数ですが、以下のコンパイルエラーが出ます。

[code]

    dtostrf_test:13:24: error: 'dtostrf' was not declared in this scope
          dtostrf(val1, 3, 1, s);
                               ^
    exit status 1
    'dtostrf' was not declared in this scope
    
[/code]

Arduino言語では `sprintf` 関数がfloat／doubleに対応していないので、`dtostrf`
をよく使用するのですが、SPRESENSE のライブラリーではサポートしていないのでしょうか？

使用例：

[code]

    char s[7];
    char t[7];
    char buf[20];
    float val1 = -10.254;
    float val2 = 97.623;
    dtostrf(val1, 3, 1, s);
    dtostrf(val2, 3, 1, t);
    sprintf(buf, "%s,%s", s, t );
    
[/code]

よろしくお願いいたします。


CC BY-SA 4.0
2021-12-03T07:49:57.467
83936
2021-12-03T16:13:25.677
2021-12-03T16:13:25.677
3060
49331
question
spresense arduino
SPRESENSE Arduino IDEでの「dtostrf」サポートについて


**その①**  
sprintfが浮動小数点をサポートしているので、dtostrfを使わずに実装する。

[code]

      sprintf(buf, "%3.1f,%3.1f", val1, val2);
    
[/code]

**その②**  
Stringクラスを使って文字列に変換する。

[code]

      String ss(val1, 1);
      String tt(val2, 1);
      sprintf(buf, "%s,%s", ss.c_str(), tt.c_str());
    
[/code]

**その③**  
すでにdtostrfが多用されていて置き換えるのが難しい場合は、  
Stringクラスにあるdtostrf関数を抜き出してローカルに定義してそれを利用する。

[code]

    #ifdef ARDUINO_ARCH_SPRESENSE
    char * dtostrf(double value, unsigned int width, unsigned int decimalPlaces, char* buf)
    {
      char fmt[20];
    
      snprintf(fmt, 20, "%%%d.%df", width, decimalPlaces);
      sprintf(buf, fmt, value);
      return buf;
    }
    #endif
    
[/code]

個人的には、dtostrfが特殊すぎるので、  
一般的なC言語標準ライブラリの使い方である①がおススメです。


CC BY-SA 4.0
2021-12-03T12:45:55.777
83941
2021-12-03T15:04:40.633
2021-12-03T15:04:40.633
31378
31378
83936
answer