用%f打印一个双变量,终端显示"?"

时间:2015-05-26 08:08:46

标签: c printf double

我完全不知道如何解决这个问题。我对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的数据表中的信息)转换它们以防万一有人好奇。任何人都可以指出我解决这个问题的方向吗?我遇到的一切都表明我应该获得价值观,而且我不知道在哪里再看。

提前感谢。

这是我的终端读出

  

转化

     

     

     

     

     

     

3 个答案:

答案 0 :(得分:2)

听起来你正在链接一个没有浮点支持的printf版本。

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

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

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

答案 1 :(得分:0)

  

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

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

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

答案 2 :(得分:0)

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

#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;
}