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());
気持ち悪いのは我慢.
最近のコメント