c/c++语言开发共享函数返回无穷大的字符串导致嵌入式编译器

我正在尝试执行字符串到双重转换。 在gnu c编译器中我得到了正确的值。 但是如果我在我的嵌入式编译器(renesas CS +)中使用它,它会给出未定义的行为,比如返回无穷大的结果。

这是我的代码:

double str_to_double_func(char a[]) { char str[30] = {'0'}; int loop ; double result; int len ; int pos,n; for(loop = 0;a[loop]!='';loop++) { str[loop] = a[loop]; } str[loop] = ''; pos = 0; len = sizeof(str)-1; for (n = 0; n < len; n++) { if (str[n] == '.') { pos = len - n - 1; } else { result = result * 10.0f + (str[n]-'0'); } } while ( pos--) { result = result/10.0f; } return result; } void geo_app_main() { double d,i; d = str_to_double_func("12.345678"); } 

我在CS +编译器(瑞萨微控制器)中使用的相同代码没有printf语句。 当我在模拟器中运行此代码时,它返回无限值(d =无限值)。

现在我改变了我的代码

 double str_to_double_func(char str[]) { double result = 0.0; int len = 0; int pos = 0, n; while(str[len]!=''){ len++; } for (n = 0; n < len; n++) { if (str[n] == '.') { pos = len - n - 1; } else { result = result * 10.0f + (str[n]-'0'); } } while ( pos--) { result = result/1.0f; } return result; } Here the problem is getting 1.234567800000000E+001 instead of 12.345678 in my CS+(renesasa micro) compiler.i checked this code with cigwin compiler.There i'm getting correct output. 

模拟器输出结果=结果1.234567800000000E + 001 double(8)R6:REG,R7:REG

    您必须初始化result 。 当你定义

     double result; 

    它不能保证为零。 它可以有任何价值,可能是垃圾。 特别是如果每​​个后续操作依赖于具有有效值的结果:

     result = result * 10.0f + (str[n]-'0'); ... result = result/10.0f; 

    您应该将变量初始化为

     double result = 0.0; 

    诸如Valgrind之类的内存检查器可以帮助您查找未初始化值的操作。

    还有Sourav Ghosh指出的问题: sizeof不会给你一个字符串的长度。 您应该使用 strlen 。 但在你的情况下,你并不真的需要它,因为你已经确定了在loop复制字符串时的长度。

    而且,当然,你应该明确地将pos初始化为零。 否则,可能无法正确解析没有小数点的字符串。

    (最后,复制字符串不会给你带来任何东西,但会引入覆盖30个字符的临时缓冲区的危险。)

    除了M Oehm的回答:

    你的str_to_double_func过于复杂。 在进行转换之前无需复制字符串。

    这是一个更简单的版本:

     #include  #include  double str_to_double_func(char str[]) { double result = 0; int len = strlen(str); int pos = 0, n; for (n = 0; n < len; n++) { if (str[n] == '.') { pos = len - n - 1; } else { result = result * 10.0f + (str[n]-'0'); } } while ( pos--) { result = result/10.0f; } return result; } 

      以上就是c/c++开发分享函数返回无穷大的字符串导致嵌入式编译器相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/519053.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐