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

时间:2013-07-15 21:30:09

标签: c

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

使用以下代码:

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语句。它一直停滞不前,直到我重新编程电路板,这怎么可能呢?

3 个答案:

答案 0 :(得分:2)

我建议在你的函数结尾添加一个fflush():即使使用新行你应该force printing,也许你的编译器有一个“奇怪的”实现...

顺便问一下:你是否将输出重定向到文件?因为在那种情况下this could apply

无论如何,正如Scotty Bauer注意到的那样,你必须纠正if块中的printf:你可能还有一个编译器警告。

来自fflush手册的注释:

  

如果stream参数为NULL,则fflush()刷新全部打开   输出流。

通常你会做fflush(stdout)

答案 1 :(得分:0)

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

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

(没有使用printf()的额外args不是问题。这不是一个好主意,但它们只是被忽略了。

答案 2 :(得分:-1)

如果不查看returnPotato(),就不可能知道。可能是你在returnPotato并被阻止在那里,而printf没有冲洗。

请注意,你有

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

你的格式字符串中没有%f来放置。