【问题标题】:printing a double variable with %f and the terminal is displaying a "?" [duplicate]使用 %f 打印双变量,终端显示“?” [复制]
【发布时间】:2015-08-07 19:08:39
【问题描述】:

我完全不知道如何处理这个问题。我对 c 语言不是很熟悉,但我知道足以为我的 Atmel MCU 进行控制项目编程。我遇到了一个问题,我尝试打印双变量,我得到的只是问号而不是值。这是一些代码:

axg = ax/MPU6050_AXGAIN;
ayg = ay/MPU6050_AYGAIN;
azg = az/MPU6050_AZGAIN;
gxds = gx/MPU6050_GXGAIN;
gyds = gy/MPU6050_GYGAIN;
gzds = gz/MPU6050_GZGAIN;

printf("converted\n\n");
printf(" %f;\n\n %f;\n\n %f;\n\n %f;\n\n %f;\n\n f;\n\n",axg,ayg,azg,gxds,gyds,gzds);

所有打印的变量都定义为双精度数。 ax,ay,ay,gx,gy,gz 都是 uint16_t 变量。我正在做的是从 IMU 读取 8 位数据并将这些值存储在 ax 等中。然后我需要根据 IMU 数据表中的信息转换它们(MPU 6050,以防有人好奇)。谁能指出我解决这个问题的方向?我遇到的一切都表明我应该获得价值,我不知道再去哪里看。

提前致谢。

这是我的终端读出

转换

?;

?;

?;

?;

?;

?;

【问题讨论】:

标签: c printf double


【解决方案1】:

听起来您正在链接不支持浮点的printf 版本。

这通常是嵌入式系统编译器的默认配置,因为它们没有硬件 FPU,并且软件浮点支持使用了大多数应用程序不需要的宝贵空间。

请查阅您正在使用的工具链的文档以查看是否讨论了此问题。 Link to similar thread for gcc/Arduino

还要考虑您的代码是否可以重写为不使用浮点。

【讨论】:

  • 谢谢你解决了我的问题。在 atmel 工作室中,有一个配置菜单,其中包含工具链选项卡。在那个选项卡中,我转到了树中的 AVR/GNU 标签,其下方有一个常规选项卡。在常规选项卡中,这是一个复选标记框。
【解决方案2】:

我正在做的是从 IMU 读取 8 位数据并将这些值存储在 ax 等中。

对于 8 位数据,我更喜欢 unsigned char。而这个问题有一个打印uint16_t类型数据的答案:Format specifiers for uint8_t, uint16_t, …?

请告诉我们更多有关您运行此代码的环境的信息。

【讨论】:

    【解决方案3】:

    我在开发 AVR 时遇到了类似的问题。 由于我出于调试目的而实现它并且代码 sn-p 不会成为实际源代码的一部分,因此我没有在编译器及其优化级别和其他依赖项上投入太多,因为它可能会在其他地方引起问题优化级别是否已更改。 所以这个修复对我有用。

    #include<stdio.h>
    #include<string.h>
    
    void foo(float fl_value, float fl_limit)
    {
        char str[20];
        memset(str, 0, 20);
        sprintf(str, "%0.2f", fl_value);
        sprintf(str+4, " %0.2f", fl_limit);
        printf(str);
    }
    
    int main(void)
    {
        foo(5.4, 10.8);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多