我使用 codewarrior 创建了以下嵌入式 C 代码。我已经对其进行了修改并删减了很多内容以发布此示例。三个文件:
主要.c:
#include <NormalState.h>
#include <Temperatures.h>
struct Temp *currentTemp = createTemp();
struct Temp *minTemp = createTemp();
struct Temp *maxTemp = createTemp();
minTemp->fehrenheit = 68;
maxTemp->fehrenheit = 72;
currentTemp->fehrenheit = 70;
int i = 0;
buffer = 3;
for(;;)
{
runNormalState();
if(i > 10000)
{
if(heat == FALSE)
{
currentTemp->fehrenheit--;
}
else
{
currentTemp->fehrenheit++;
}
i = 0;
}
i++;
}
温度.h:
struct Temp{
float celcius;
float fehrenheit;
float kelvin;
};
struct Temp *createTemp()
{
return malloc(sizeof(struct Temp));
}
正常状态.h:
#include <Temperatures.h>
byte buffer;
bool heat, cool;
void runNormalState()
{
if(currentTemp->fehrenheit <= minTemp->fehrenheit - buffer)
{
heat = TRUE;
}
else if(currentTemp->fehrenheit >= maxTemp->fehrenheit + buffer)
{
cool = TRUE;
}
}
我写了一些从currentTemp->fehrenheit
70 开始的测试,并且大约每秒递减一次。NormalState.h 中的 if/else 语句检查是否需要打开热量。
buffer
是 3。MinTemp->fehrenheit - buffer
是 65。所以当currentTemp->fehrenheit
低于 65 时,热量应该等于 TRUE。但是,该值永远不会改变。同样,如果我buffer
从minTemp->fehrenheit - buffer
if/else 语句中删除,使其只是minTemp->fehrenheit
,则 heat 总是被评估为 TRUE。
我一生都无法弄清楚这里发生了什么。我可以说一下我已经通过测试发现的内容:
- if/else 语句没有被跳过。它只是没有被评估。
- 我已经检查了
currentTemp->fehrenheit
和的值minTemp->fehrenheit
。它们都等于我期望在给定时间各自的值。 - 它与作为浮点数的结构数据成员无关。如果我将数据成员
Temp
设为整数、字节、双精度或浮点数,我也会遇到同样的问题。
我有一种感觉,这与我对指针或转换可能存在的某种基本误解有关。我也可能遗漏了一些非常基本的东西,但我不知道还能去哪里。这里的另一个工程师也想不通。