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

C++ 这个构造函数代码是如何将指针作为参数的?,c++,class,pointers,arduino,dereference,C++,Class,Pointers,Arduino,Dereference,下面的代码有三个double*类型的参数。该代码是Arduino PID库的一部分,用户通常会给出模拟端口或某种传感器的读数作为“输入”项的参数,以及一些固定值或用户控制变量作为“设定点”项的值。但参数的类型是double*。当用户提供double时,不应该出现错误吗 PID::PID(double* Input, double* Output, double* Setpoint, double Kp, double Ki, double Kd, int ControllerDi

下面的代码有三个double*类型的参数。该代码是Arduino PID库的一部分,用户通常会给出模拟端口或某种传感器的读数作为“输入”项的参数,以及一些固定值或用户控制变量作为“设定点”项的值。但参数的类型是double*。当用户提供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 temp=AnalogRead(1)。所以,从模拟引脚1读取任何输入,myOutput是否就是这些输入温度读数的地址

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

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

对此有几种可能的解释

可选参数:

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

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

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

输出参数:

C没有引用,所以out参数通常作为指针传递。为了对函数调用方可见的参数进行更改,可以将其作为指针传递

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

double foo;
setFoo(&foo); // pass the memory address of your variable
此时,
foo
的值为5

<>在C++中,你可以使用引用,所以如果你想拥有一个Out-PARAM,但是需要用户提供一个值,你将使用<代码>双和设置点< /C> > 允许外部更改可见:

最可能的解释是允许您提供
设定点的地址,然后如果您稍后更改
设定点的值,对象将观察到这些更改

double setpoint = 1;

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

p.foobar(); // setpoint=1 

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

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


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

请发布一篇文章。你的问题目前包含的内容甚至没有使用你所说的向量。你如何使用这个类?您实际为构造函数提供了哪些参数?如果您提供一个
double
值(而不是指向
double
的指针),则会出现错误。“构造函数是否只获取用户提供的double的地址?”是。恐怕我不明白你的问题?是的-如果用户将一个double传递给一个需要指向double的指针的函数,则会出现错误。否“的地址”未完成。显示一些您预期会失败但正在运行的代码,这些代码与预期完全一致。运算符的地址是获取指针的方式。