C程序中比较浮点数值卡住了

3

我正在为嵌入式软件课程做任务,但我遇到了奇怪的问题。

使用以下代码:

void decidePotato(float held)
{
    printf("Deciding Potato, held for %f seconds \n", held);
    if (held >= 1.99)
    {
        printf("Held for more than 1.99s \n", held);
        returnPotato();
    }
    printf("I evaluated the if statement above \n");

}

我得到以下输出:
Deciding Potato, held for 0.010000 seconds

我甚至没有看到“我评估了以上的if语句”消息,所以程序在评估该if语句时出现了某种卡顿。并且它一直卡着,直到我重新编程板子。这怎么可能呢?


2
returnPotato 里面是什么? - ouah
1
returnPotato 包含什么? - jsalonen
1
在C++程序中简单复制您的函数并不会导致任何错误。您能否发布一个SSCCE来重现这个问题? - Sam I am says Reinstate Monica
@SamIam:C#?原帖中是在用C语言。 - RichieHindle
3
尝试在代码中加入fflush(stdout)。有时候消息会在通道中被阻塞(尽管通常假定启用了行缓冲),导致不清晰的行为。一旦理解了问题,别忘了将它们删除 - 它们可能非常低效。 - sh1
显示剩余3条评论
3个回答

2
我建议在函数末尾加上 fflush():即使有新行,您应该强制打印,但您的编译器可能有“奇怪”的实现......

顺便说一句:您是否将输出重定向到文件?因为在这种情况下,这可能适用。

无论如何,正如Scotty Bauer注意到的那样,您必须更正if块中的printf:您可能还收到了编译器警告。

从 fflush 手册中可以看出:

如果流参数为空,则 fflush() 刷新所有打开的输出流。

通常您会执行 fflush(stdout)。


0
如果您的程序真的卡住了,我会怀疑是通过调用printf()而导致堆栈溢出。然后,您的程序尝试跳转到未定义的内存或取消引用垃圾指针并引发异常,并且在默认异常处理程序中被锁定在无限循环中。printf在嵌入式世界中是一种奢侈品。您需要足够大的堆栈来处理它,特别是当您正在编写复杂的设备驱动程序或驱动程序使用了过多的内存时。

将堆栈大小更改为您可用的最大值,然后查看程序是否更改。

(对于printf()的额外参数未使用不是问题。这不是一个好主意,但它们只是被忽略掉而已。


有些编译器允许您调用一个不支持float的“微小”printf。在printf中使用float非常昂贵。 - Mark Lakata

-1

不看returnPotato()的代码是无法确定问题的。可能是你在returnPotato()中被阻塞了,printf没有刷新。

请注意,你还有

printf("Held for more than 1.99s \n", held);

您的格式字符串中没有%f可以放置占位符。


1
如果held的值为0.010000,那么returnPotato()函数如何被执行到? - Sam I am says Reinstate Monica
2
哇喔,我需要小睡一会儿!不管怎样,你仍然需要一个%f。 - Scotty Bauer
我不建议这样做。"持有时间超过<持有值>"将是一种谎言! - sh1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接