esp8266-arduinoでSD::remove()が固まる件

fsHandlerを作成している際、表記の問題に遭遇した。
原因は、SD.hの108-109行

  // Delete the file.
  boolean remove(char *filepath);
  boolean remove(const String &filepath) { 
    return remove(filepath.c_str()); }

remove(filepath.c_str())でremov(char *filepath)が呼び出されそうだが、
filepath.c_str()の型は (const char *)つまり書換不可文字列。これを (char *)書換可文字列として関数に渡すわけにはいかない。

不幸なことに String型にはconst char *型引数1つだけのコンストラクタがある。このコンストラクタにより、const char *型の文字列はString型に変換され、remove(const String &filepath)、つまり自分自身を呼び出し続けることになるのであった。

SD::exists,mkdir,rmdirも全く同じなので、固まるはず。

ちなみに、version 2.4.0-rc1では修正されている。

  boolean remove(const char *filepath);
  boolean remove(const String &filepath) { 
    return remove(filepath.c_str()); }

回避策は簡単、(char *)にキャストすれば良い。

  SD.remove((char *)path.c_str());  

気持ち悪いのは我慢.

Leave a Reply

メールアドレスが公開されることはありません。