这个构造函数代码如何将指针作为参数?

时间:2017-05-30 15:57:18

标签: c++ class pointers arduino dereference

下面的代码有三个double *类型的参数。代码是Arduino PID库的一部分,用户通常会将模拟端口或某种传感器的读数作为“输入”术语的参数,将某些固定值或用户控制的变量作为“设定值”的值“一词。但是参数是double *类型。用户在提供双倍时不应该出错吗?

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的地址?

如果用户正在读取某些温度数据,请说double temp = AnalogRead(1)。因此,读取模拟引脚1中的任何内容,myOutput只是那些传入温度读数的地址吗?

myInput,myOutput和mySetpoint在另一个成员函数中被取消引用。

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

1 个答案:

答案 0 :(得分:1)

对此有一些可能的解释。

可选参数:

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

在代码中,如果传递空指针,则不使用设定值。

您已经提到Setpoint在另一个函数中被取消引用,因此它可能不是可选的。

<强>出PARAM:

C没有引用,因此out-params通常作为指针传递。为了更改函数调用者可见的参数,将其作为指针传递

void setFoo(double* in)
{
    *in = 5;
}

double foo;
setFoo(&foo); // pass the memory address of your variable

此时foo的值为5。

在C ++中,您可以使用引用,因此如果您想要一个out-param,但需要用户提供一个值,那么您将使用double& Setpoint

允许外部更改可见:

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

double setpoint = 1;

PID p(&input, &output, &setpoint, ...)

p.foobar(); // setpoint=1 

setpoint = 3;
p.foobar(); // setpoint=3

同样,在C ++中,您可以使用引用来获得相同的行为(尽管这会使您的对象不可分配)。

正如您所看到的,有几种可能的解释,因此如果没有进一步的细节,您无法确切地说为什么库作者要求您使用指针而不是按值语义