c - 如何将值存储到多参数结构中并将 typedef 结构传递给函数?
问题描述
新的想成为程序员的人在这里。我目前正在做作业,遇到了一些问题。
任务如下:
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. 在温度过低的情况下,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'的未定义引用”,但我认为这是因为缺少文件。恐怕我写的代码会传递存储值的地址而不是当前值。我迫切需要一些帮助。
解决方案
好吧,未定义意味着未实施。正如您所说,由于您没有定义 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);
}
推荐阅读
- node.js - 使用实验模块运行节点脚本时找不到 .ts 模块
- c - 内部和外部变量从一个文件链接到单独文件中的两个单独函数
- dialogflow-es - 如何在响应中为我的 Dialogflow 聊天机器人创建超链接
- apache-kafka - Kafka Streams 应用程序内存不足
- json - 从 kubectl 输出中过滤值
- git - 将文件夹链接到 Herkou 应用程序(对于 Absolute Dummies)
- python - 级联 groupby/transform 操作
- java - 当我单击一个按钮时,我将其放入我的 recyclerview 适配器中,它会影响所有行
- typo3 - Typo3 问题:升级到 9.5.11 后内部链接未正确呈现
- doxygen - 如何使用 Doxygen 链接到“主页”