首页 > 解决方案 > 如何将值存储到多参数结构中并将 typedef 结构传递给函数?

问题描述

新的想成为程序员的人在这里。我目前正在做作业,遇到了一些问题。

任务如下:

FanControl 功能在温度超过限制时打开风扇,当温度低于限制时关闭风扇。

1.1。滞后应对称地施加在开关限制上。

1.2. 滞后和默认限制应在编译时可配置。

1.2.1. 默认限值为 25°C,默认滞后值为 2°C。

1.3. 温度应通过读取 GetTemperature() 函数来获取。

1.4. 风扇应通过使用参数 FAN_ON 调用 SetState() 函数来打开,并应通过使用 FAN_OFF 参数调用它来关闭。

  1. 如果输入温度超出其有效限制(-20°C..+160°C),则组件应报告错误。

2.1。错误报告应由 SendErrorReport() 函数发出。报告的原因应存储在errorCode字段中,温度值应存储在温度字段中。

2.1.1. 在温度过高的情况下,errorCode 应设置为 ERROR_CODE_OVER_TEMP。

2.1.2. 在温度过低的情况下,errorCode 应设置为 ERROR_CODE_UNDER_TEMP。

我的问题是任务的第二部分。我很难将值存储到结构中的字段中,而且我似乎也无法将结构传递到所需的字段中,也许是我缺乏一些语法知识。

由于学校没有向我提供编译器需要的其他文件,我无法调试我的代码。我已经尝试过以下方法,但恐怕这行不通。

#ifndef COMPONENTTEST


typedef unsigned char boolean;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
typedef float float32;

typedef struct
{
    uint32 errorCode;
    float32 temperature;
} dtErrorMessage;

typedef enum
{
    FAN_OFF,
    FAN_ON
} dtFanState;

#define ERROR_CODE_OVER_TEMP ((uint32)1u)
#define ERROR_CODE_UNDER_TEMP ((uint32)2u)

extern float32 GetTemperature(void);
extern void SetState(dtFanState fanState);
extern void SendErrorReport(dtErrorMessage* errorMsg);

#endif /* !COMPONENTTEST */

/* Please add your own additions here! */

void FanControl(void)
{
uint16 tempLimit=25;
uint16 hystLimit=tempLimit-2;


if(GetTemperature() <= hystLimit)
{
    SetState(FAN_OFF);
}

if(GetTemperature() >= tempLimit)
{
    SetState(FAN_ON);
}

// From this part I am not sure about!

if(GetTemperature() <= -20)
{
    dtErrorMessage low;
    low.errorCode=ERROR_CODE_UNDER_TEMP;
    low.temperature=GetTemperature();
    SendErrorReport(&low);
}

if(GetTemperature() >= 160)
{
    dtErrorMessage high;
    high.errorCode=ERROR_CODE_OVER_TEMP;
    high.temperature=GetTemperature();
    SendErrorReport(&high);
    }
}

我不断收到“对'GetTemperature'和'SendErrorReport'的未定义引用”,但我认为这是因为缺少文件。恐怕我写的代码会传递存储值的地址而不是当前值。我迫切需要一些帮助。

标签: cfunctionpointersstruct

解决方案


好吧,未定义意味着未实施。正如您所说,由于您没有定义 extern 函数的源文件,这是有道理的。我没有看到您的代码有任何问题,但我建议在第二个条件下使用 else:

if(GetTemperature() <= -20)
{
    dtErrorMessage errMsg;
    errMsg.errorCode=ERROR_CODE_UNDER_TEMP;
    errMsg.temperature=GetTemperature();
    SendErrorReport(&errMsg);
}
else if(GetTemperature() >= 160)
{
    dtErrorMessage errMsg;
    errMsg.errorCode=ERROR_CODE_OVER_TEMP;
    errMsg.temperature=GetTemperature();
    SendErrorReport(&errMsg);
}

推荐阅读