我在 Eclipse 中使用 Arduino。我想从配置文件中读取一个 double 值。我做了这些功能:
void Settings::readDouble(char buff, String data, bool flag, double dataToStore) {
data = "";
int intPart = 0;
int probablyFloatPart = 0;
while(buff != '\n') {
if(isdigit(buff)) {
data.concat(buff);
Serial.println(data);
}
else if (buff == '.') {
char charBuf[data.length()+1];
data.toCharArray(charBuf,data.length()+1);
// Convert chars to int
intPart = atoi(charBuf);
Serial.println(intPart);
data="";
flag = false;
}
buff = theSettings.read();
};
// Convert string to array of chars
char charBuf[data.length()+1];
data.toCharArray(charBuf,data.length()+1);
// Convert chars to integer
probablyFloatPart = atoi(charBuf);
Serial.println(probablyFloatPart);
if (!flag) {
dataToStore = intPart + (probablyFloatPart/pow(10, data.length()));
}
else {
dataToStore = probablyFloatPart;
}
flag = true;
//Serial.println(dataToStore, 5);
}
从 serial.printing 我注意到如果我想读取的数字在 int 或 decimal 部分有超过四位数字,它会给出错误。基本上,我无法将超过四个字节的字符串转换为 int。我该怎么做?
最佳答案
您将需要使用 long
来存储超过 32767 的值(或以无符号形式存储超过 65535 的值)。
我会带着一段更简单的代码回来——我认为你的代码比它需要的更复杂。
除了 isdigit
之外,这段代码没有使用任何标准函数,只是遍历数字。对数字的大小没有限制(很明显,如果您超过 double
的限制,那么它将失败)。错误处理可能需要一些改进。我已经对它进行了一些温和的测试...
double str_to_double(const char *data, size_t len)
{
double d = 0.0;
bool neg = false;
int index = 0;
if (data[index] == '-')
{
index++;
neg = true;
}
while(data[index] != '.' && index < len)
{
if (isdigit(data[index]))
{
d = d * 10 + (data[index] - '0');
index ++;
}
else
{
// Handle "bad input" ...
return -1;
}
}
if (data[index] == '.')
{
index ++;
double div = 10.0;
while(index < len)
{
if (isdigit(data[index]))
{
d += (data[index] - '0') / div;
div *= 10;
index++;
}
else
{
// Handle bad input
return -1;
}
}
}
// Flip sign if need be.
if (neg)
{
d = -d;
}
return d;
}
关于c++ - 使用 Arduino/C++ 从 SD 卡上的文件中读取一个 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17552469/