【问题标题】:How can I store values into a multi-parameter struct and pass typedef struct to a function?如何将值存储到多参数结构中并将 typedef 结构传递给函数?
【发布时间】: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 参数调用它来关闭它。

  1. 如果输入温度超出其有效限制 (-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


【解决方案1】:

恐怕我写的代码会通过存储的地址 值而不是当前值。我迫切需要一些帮助。

下面写的都很好

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

因为SendErrorReportdtErrorMessage* 作为参数。

extern void SendErrorReport(dtErrorMessage* errorMsg);

但有些事情你需要考虑,例如,

  1. SendErrorReport 不应该是异步调用,否则您将有未定义的行为,因为dtErrorMessage low; 将超出范围并消失。

  2. SendErrorReport 不应尝试为其定义中的dtErrorMessage* errorMsg 释放内存。

这些详细信息应作为 API 规范的一部分获得。

【讨论】:

    【解决方案2】:

    嗯,未定义意味着未实现。由于,就像你说的,你没有定义外部函数的源文件,这是有道理的。我看不出你的代码有什么问题,但我建议在第二个条件下使用 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);
    }
    

    【讨论】:

    • 最重要的改进应该是避免多个函数调用。每个块中的结果可能与条件中的结果不同。
    • 我已经采纳了你的建议并重写了它,感谢您指出:)
    • 不确定(这就是我删除它的原因),但是你们如何看待在if(GetTemperature() &lt;= -20) 之前只定义一次errMsg 然后在两种情况下都使用它?如果您不超过限制但会减少代码大小,这将导致可避免的变量定义。
    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2012-05-09
    • 2020-05-04
    相关资源
    最近更新 更多