2017-05-30 86 views
-3

下面的代码有三个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 temp = AnalogRead(1)。因此,读取来自模拟引脚1的任何信息,myOutput是否只是这些传入温度读数的地址?

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

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

请发表[MCVE ]。你的问题目前包含甚至不使用你正在谈论的ctor。 –

+0

*你*如何使用课堂?你实际提供给构造函数的是什么参数?如果你提供了一个'double' *值*(而不是一个指向'double'的指针),那么会出现错误。 –

+3

_“构造函数是否只接受用户提供的double的地址?”_是的。恐怕我不明白你的问题? –

回答

1

对此有几种可能的解释。

可选参数:

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

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

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

出PARAM:

C没有引用,所以出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++中,您可以使用引用来获得相同的行为(尽管这会使对象不可分配)。

正如你可以看到有几种可能的解释,所以没有进一步的细节,你真的不能肯定地说,为什么库的作者,您需要使用一个指针,而不是值语义的

相关问题