0

我使用 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->fehrenheit70 开始的测试,并且大约每秒递减一次。NormalState.h 中的 if/else 语句检查是否需要打开热量。

buffer是 3。MinTemp->fehrenheit - buffer是 65。所以当currentTemp->fehrenheit低于 65 时,热量应该等于 TRUE。但是,该值永远不会改变。同样,如果我bufferminTemp->fehrenheit - bufferif/else 语句中删除,使其只是minTemp->fehrenheit,则 heat 总是被评估为 TRUE。

我一生都无法弄清楚这里发生了什么。我可以说一下我已经通过测试发现的内容:

  • if/else 语句没有被跳过。它只是没有被评估。
  • 我已经检查了currentTemp->fehrenheit和的值minTemp->fehrenheit。它们都等于我期望在给定时间各自的值。
  • 它与作为浮点数的结构数据成员无关。如果我将数据成员Temp设为整数、字节、双精度或浮点数,我也会遇到同样的问题。

我有一种感觉,这与我对指针或转换可能存在的某种基本误解有关。我也可能遗漏了一些非常基本的东西,但我不知道还能去哪里。这里的另一个工程师也想不通。

4

0 回答 0