c++ - 使用 Arduino/C++ 从 SD 卡上的文件中读取一个 float

标签 c++ c optimization arduino

我在 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/

相关文章:

c++ - Visual C++ 无法正确满足构造函数要求

c - 如何使用其他c源文件中的struct?

c - 如何正确地制定计数算法来从文件中计数?

python - 如果 numpy 数组没有维度或者维度小于 n,则条件为 true

c++ - gcc优化标志-O3使代码慢于-O2

c++ - 将 cv::Mat 转换为无符号整型像素

c++ - 是否允许构造 unsigned long long?

c++ - 用于检查语言版本的预处理器#define? C++98/C++03/C++11

c++ - 将自己放入 chrooted 沙箱后如何(合法地)访问文件?

java - 提高 MongoDB 查询性能