【发布时间】:2019-07-24 10:46:00
【问题描述】:
这里有新的想成为程序员的人。我目前正在做作业,遇到了一些问题。
任务如下:
FanControl 功能在温度超过限制时打开风扇,在温度低于限制时关闭风扇。
1.1。滞后应对称地施加在开关限制上。
1.2。滞后和默认限制应在编译时进行配置。
1.2.1.默认限制为25°C,默认滞后值为2°C。
1.3。通过读取GetTemperature()函数获取温度。
1.4。风扇应通过使用参数 FAN_ON 调用 SetState() 函数来打开,它 应通过使用 FAN_OFF 参数调用它来关闭它。
- 如果输入温度超出其有效限制 (-20°C..+160°C),则 组件会报错。
2.1。错误报告应由 SendErrorReport() 函数发出。举报原因 应存储到 errorCode 字段和温度值到温度 字段。
2.1.1.在温度过高的情况下,errorCode应设置为ERROR_CODE_OVER_TEMP。
2.1.2.在温度过低的情况下,错误代码应设置为 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' 的未定义引用”,但我认为这是因为缺少文件。恐怕我写的代码会传递存储值的地址而不是当前值。我迫切需要一些帮助。
【问题讨论】:
-
欢迎来到 SO。与您的问题无关,但您真的不应该多次致电
GetTemperatur。将返回值存储到一个变量中,并将该值用于所有if语句。否则,结果可能会在调用之间发生变化。而且需要更多时间 -
如果您无法访问其他文件,因为它们是其他人分配的一部分,您可以创建这些函数的空存根版本,这些函数或多或少会返回一些随机值。
标签: c function pointers struct