该构造函数代码如何将指针作为参数



下面的代码具有三个类型double*的参数。该代码是Arduino PID库的一部分,用户通常会读取模拟端口或某种传感器作为"输入"术语的参数以及某些固定值或用户控制的变量作为"设置点的值" 学期。但是该论点是双型*。用户提供双重时,他不应该出错吗?

PID::PID(double* Input, double* Output, double* Setpoint,
        double Kp, double Ki, double Kd, int ControllerDirection)
{
    myOutput = Output;
    myInput = Input;
    mySetpoint = Setpoint;
    inAuto = false;
    PID::SetOutputLimits(0, 255); // default output limit corresponds to 
                                  // the arduino pwm limits
    SampleTime = 100;             // default Controller Sample Time is 0.1 seconds
    PID::SetControllerDirection(ControllerDirection);
    PID::SetTunings(Kp, Ki, Kd);
    lastTime = millis()-SampleTime;
}

构造函数是否只需获取用户提供的双重地址?

如果用户正在读取某些温度数据,例如double temp = alaleogread(1(。因此,阅读模拟引脚1所传递的内容,MyOutput是否只是那些传入的温度读数的地址?

myInput,myOutput和mysetpoint在另一个成员函数中被删除。

double input = *myInput;
double error = *mySetpoint - input;

有一些可能的解释。

可选参数:

一种可能的解释是Setpoint是可选的,因此您可以通过nullptr

在代码中,如果您通过了空指针,则不使用设定点。

您已经提到Setpoint在另一个功能中被授予,因此它可能不是可选的。

OUT-PARAM:

c没有参考,因此通常将少量作为指针传递。为了更改函数呼叫者可见的参数,您将其传递为指针

void setFoo(double* in)
{
    *in = 5;
}
double foo;
setFoo(&foo); // pass the memory address of your variable

此时foo的值为5。

在C 中,您可以使用参考,因此,如果您想拥有一个外帕拉姆,但要求用户提供一个值,则使用double& Setpoint

允许可见外部更改:

可能最有可能的解释是允许您提供Setpoint的地址,然后如果您以后更改Setpoint的值,则该对象会观察这些更改。

double setpoint = 1;
PID p(&input, &output, &setpoint, ...)
p.foobar(); // setpoint=1 
setpoint = 3;
p.foobar(); // setpoint=3

再次,在C 中,您可以使用参考来获得相同的行为(尽管这会使您的对象不可分配(。

您可以看到有几种可能的解释,因此,如果没有更多的详细信息,您无法真正确定图书馆作者要求您使用指针而不是副价值语义

相关内容

  • 没有找到相关文章

最新更新