0

据我所知,我具有以下功能,nesC其中基本相同!C

event void AdaptiveSampling.dataAvailable(error_t result, float val, bool isRealData)
{       
    if(result == SUCCESS)
    {
        //converting raw ADC to centigrade
        centiGrade = -39.60 + 0.01 * val;                       

        //printing the value to serial port
        if(isRealData)
        {
            printf("REAL: Temperature is: %d CentiGrade\r\n", centiGrade); //line 91
            printf("%d,R,%d,%d\r\n", _counter, val, centiGrade); //line 92
        }   
        else
        {
            printf("PEDICTED: Temperature is: %d CentiGrade\r\n", centiGrade); //line 96
            printf("%d,P,%d,%d\r\n", _counter, val, centiGrade); //line 97
        }   
        _counter++;     
    }
    else
    {
        printf("Error reading sensor!");
    }
}

而且,在我的代码顶部,我定义了这些变量:

uint32_t _counter;
uint16_t centiGrade;

这是我在构建过程中收到的警告:

AdaptiveSamplingC.nc:92:11: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘uint32_t’ [-Wformat]
AdaptiveSamplingC.nc:92:11: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘float’ [-Wformat]
AdaptiveSamplingC.nc:97:11: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘uint32_t’ [-Wformat]
AdaptiveSamplingC.nc:97:11: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘float’ [-Wformat]

这是屏幕上的输出示例:

PEDICTED: Temperature is: 26 CentiGrade
291,P,0,-3402
REAL: Temperature is: 26 CentiGrade
292,R,0,4096
PEDICTED: Temperature is: 26 CentiGrade
293,P,0,-1495

问题:

在第 91 行,我希望看到温度值是浮动的……我的意思是26.25……但由于某种原因,它打印为整数。我试图更改%d为,%f但它没有帮助,因为您看到第 92 行和第 97 行的输出由于我无法弄清楚的原因而几乎损坏!

我也无法解释为什么第 92 和 97 行表现得那么奇怪,以及为什么它们在构建期间会出现警告。

您能告诉我如何改进吗?

4

3 回答 3

1

您的问题是未定义的行为,这就是您收到警告的原因。警告是表明某些事情实际上是错误的。

printf是一个可变参数函数,因此它需要一些关于参数类型的信息。这是格式说明符(例如%d)的工作。

%d告诉printf期待一个int类型化的参数,你的警告消息告诉你:警告:格式%d需要类型的参数int

但是,您提供的类型不是ints. 它们是uint32_tand float,您的警告消息也告诉您:但参数 2 的类型为uint32_t[-Wformat]但参数 3 的类型为float[-Wformat]

有很多解决方案。最好使用正确的格式说明符!(呃)。那是"%d"for int"%"PRIu32foruint32_t"%f"for doublefloat被提升为)。在 的情况下uint32_t,您可以转换为 anunsigned long并使用 , 打印"%lu"

于 2013-06-03T14:35:07.180 回答
0

您在这一行将 16 位无符号整数变量与浮点计算混合在一起centiGrade = -39.60 + 0.01 * val;

您想要的是将 centiGrade 保留为浮点数并将其转换为 int 仅在打印时。

于 2013-06-03T14:32:12.093 回答
0

警告说明了一切。您提供了错误的格式字符串。(记住:警告是伪装的错误。总是修复它们。)

用于%u无符号整数和%f浮点数。您甚至可以提供有关如何格式化浮点数的额外信息。例如%.2f会给你2个小数点后面的数字。

还有这个:

centiGrade = -39.60 + 0.01 * val;  

是错的。您不能将浮点数分配给uint16_t. 只要做centiGrade一个float,你应该没事。

可以在此处找到有关说明符的更多信息:http ://www.cplusplus.com/reference/cstdio/printf/

于 2013-06-03T14:32:23.187 回答